2017-07-16 82 views
0

我在我的elasticsearch索引中有一个"name" field - not_analyzedElasticsearch - 与部分搜索词匹配not_analyzed字段

可以说价值"name" field"some name"。我的问题是,如果我想匹配搜索词 - some name some_more_name someother name,因为它包含some name,那么not_analyzed会允许匹配发生,如果不匹配,那么我如何才能匹配搜索词?

回答

1

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

回到你的问题,如果你想获得建议的搜索查询的比洞赛,你的领域必须进行分析。

如果您需要保留非分析版本,以及你应该使用multi fields

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

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

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

使用通配符总是会影响性能,特别是如果'一些name'实际上是'some1 some2 some3 some4名1名2 NAME3 name4',相关 - https://开头讨论.elastic.co /吨/精确匹配-IN-A-未分析场/ 37121 – vjjj