elasticsearch - 语言分析器无法找到单一结果

标签 elasticsearch analyzer

我的类别字段中有很多带有翻译的类别。我已经为索引中的字段定义了语言分析器,以便我可以搜索它们。但它没有找到我的话的单数版本。 titles.title-nl 中的 wasmachinewasmachines 的单数,但未找到。我错过了什么?

演示文档

    "_source" : {
      "google_id" : 2706,
      "titles" : [
        {
          "title-en" : "laundry appliances",
          "title-de" : "waschen & trocknen",
          "title-fr" : "appareils de blanchisserie",
          "title-nl" : "wasmachines"
        }
      ]
    }

我映射它们的方式

PUT categories/_mapping/category
{
"dynamic": false,
"properties": {
"titles.title-nl": {
"type": "text",
"analyzer": "dutch"
},
"titles.title-en": {
    "type": "text",
      "analyzer": "english"
    },
    "titles.title-de": {
    "type": "text",
      "analyzer": "german"
    },
    "titles.title-fr": {
    "type": "text",
      "analyzer": "french"
    }
  }
}

我搜索它们的方式

GET categories/_search
{
  "size": 4, 
  "query": {
    "multi_match": {
      "query": "wasmachines",
      "fields": ["titles.title-de","titles.title-en", "titles.title-fr", "titles.title-nl"]
    }
  }
}

最佳答案

问题是默认的荷兰语分析器不知道如何对单词 wasmachines 进行词干分析,您需要使用 stemmer_override 使用自定义分析器重新创建索引.

查看elastic documentation您可以执行以下操作来重新创建 dutch 分析器,并告诉 wasmachines 应词干为 wasmachine,只需输入 wasmachine => wasmachines 位于 stemmer_override

的规则内
PUT categories/
{
  "settings": {
    "analysis": {
      "filter": {
        "dutch_stop": {
          "type":       "stop",
          "stopwords":  "_dutch_" 
        },
        "dutch_keywords": {
          "type":       "keyword_marker",
          "keywords":   ["voorbeeld"] 
        },
        "dutch_stemmer": {
          "type":       "stemmer",
          "language":   "dutch"
        },
        "dutch_override": {
          "type":       "stemmer_override",
          "rules": [
            "fiets=>fiets",
            "bromfiets=>bromfiets",
            "wasmachine=>wasmachines",
            "ei=>eier",
            "kind=>kinder"
          ]
        }
      },
      "analyzer": {
        "rebuilt_dutch": {
          "tokenizer":  "standard",
          "filter": [
            "lowercase",
            "dutch_stop",
            "dutch_keywords",
            "dutch_override",
            "dutch_stemmer"
          ]
        }
      }
    }
  }
}

您还需要在映射中使用该新分析器:

PUT categories/_mapping/category
{
    "dynamic": false,
    "properties": {
        "titles.title-nl": {
            "type": "text",
            "analyzer": "rebuilt_dutch"
        },
        "titles.title-en": {
            "type": "text",
            "analyzer": "english"
        },
        "titles.title-de": {
            "type": "text",
            "analyzer": "german"
        },
        "titles.title-fr": {
            "type": "text",
            "analyzer": "french"
        }
    } 
}

之后您将能够搜索wasmachine并获取包含wasmachines的文档。

关于elasticsearch - 语言分析器无法找到单一结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55550115/

相关文章:

database - 根据数组中的AND条件过滤ElasticSearch结果

objective-c - Obj-C,当 'self' 未设置为 '[(super or self) init...]' 的结果时使用的实例变量

elasticsearch - Elasticsearch多词同义词结构解释

ios - 单例设计潜在泄漏

c# - Elasticsearch 转义空格的正确方法,?并非在所有情况下都有效

elasticsearch - Microsoft Power BI 和 ElasticSearch

java - Elasticsearch:如何使产品名称在搜索中比产品描述更重要?

elasticsearch - ElasticSearch没有显示精确匹配的正确结果

elasticsearch - 一些多字同义词在 Elasticsearch 中不适用于嵌套字段

Elasticsearch 聚合将结果转为小写