Elasticsearch - 将not_analyzed字段与部分搜索词匹配

时间:2017-07-16 00:55:37

标签: performance search elasticsearch

我的弹性搜索索引中有"name" field - not_analyzed

假设"name" field的值为"some name"。我的问题是,如果我想要匹配搜索字词some name some_more_name someother name,因为其中包含some name,那么not_analyzed会允许匹配发生,如果不是,那我该怎么办?得到匹配的建议搜索词?

2 个答案:

答案 0 :(得分:2)

在索引期间,name字段的文本存储在倒排索引中。如果分析了此字段,则会将2个字词转到倒排索引:somename。但由于未进行分析,因此只存储了1个术语:some name 在搜索过程中(使用匹配查询),默认情况下会对搜索查询进行分析和标记。因此,会有几个术语:somenamesome_more_namesomeother。然后Elasticsearch将查看倒排索引,以查看搜索查询中是否至少有一个术语。但是只有some name个术语,因此您无法在结果集中看到此文档 您可以使用_analyze端点

来使用分析器

回到您的问题,如果您想获得建议的搜索查询的匹配项,则必须分析您的字段。

如果您还需要保留未经过分析的版本,则应使用multi fields

PUT my_index
{
  "mappings": {
    "my_type": {
      "properties": {
        "name": {
          "type": "keyword",
          "fields": {
            "analyzed": { 
              "type": "text"
            }
          }
        }
      }
    }
  }
}

答案 1 :(得分:0)

Taras已经解释清楚了,我的问题可能已经解决了,但是如果你不能改变索引的映射,你可以使用查询(我在5.4 ES中测试过)

GET test/_search
{
  "query": {
    "query_string": {
      "default_field": "namekey",
      "query": "*some* *name*",
      "default_operator": "OR"
    }
  }