【问题标题】:Elasticsearch - match not_analyzed field with partial search termElasticsearch - 将 not_analyzed 字段与部分搜索词匹配
【发布时间】:2017-07-16 00:55:37
【问题描述】:
我的弹性搜索索引中有一个"name" field - not_analyzed。
假设"name" field 的值为"some name"。我的问题是,如果我想要匹配搜索词 - some name some_more_name someother name,因为它包含 some name,那么 not_analyzed 是否允许匹配发生,如果没有,那么我怎样才能得到匹配的建议搜索词?
【问题讨论】:
标签:
performance
search
elasticsearch
【解决方案1】:
在索引期间,name 字段的文本存储在倒排索引中。如果分析此字段,则 2 个术语将进入倒排索引:some 和 name。但由于没有分析,只存储了1个词:some name
在搜索期间(使用匹配查询),默认情况下您的搜索查询会被分析和标记化。所以会有几个术语:some、name、some_more_name 和someother。然后 Elasticsearch 将查看倒排索引,以查看搜索查询中是否至少有一个词。但是只有some name这个词,所以你不会在结果集中看到这个文档。
您可以使用 _analyze 端点使用分析器
回到您的问题,如果您想获得建议的搜索查询的匹配项,则必须分析您的字段。
如果您还需要保留未分析的版本,您应该使用multi fields:
PUT my_index
{
"mappings": {
"my_type": {
"properties": {
"name": {
"type": "keyword",
"fields": {
"analyzed": {
"type": "text"
}
}
}
}
}
}
}
【解决方案2】:
Taras 已经解释清楚了,我的问题可能已经解决了,但是如果你不能改变你的索引的映射,你可以使用查询(我在 5.4 ES 中测试过)
GET test/_search
{
"query": {
"query_string": {
"default_field": "namekey",
"query": "*some* *name*",
"default_operator": "OR"
}
}