Elasticsearch版本:7.1.1
嗨,我做了很多尝试,但是在索引中找不到任何解决方案,我有一个包含字符串的字段。
因此,例如,我有两个文档,它们在locations数组中包含不同的值。
文件1:
"doc" : { "locations" : [ "Cloppenburg", "Berlin" ] }
文件2:
"doc" : { "locations" : [ "Landkreis Cloppenburg", "Berlin" ] }
用户请求搜索术语 克洛彭堡, 而我只想返回那些包含术语 克洛彭堡 而不是 Landkreis Cloppenburg的 文档。结果应仅包含 Document-1 。但是我的查询返回了两个文档。
我正在使用以下查询,并同时获取两个文档。有人可以帮我吗
GET /my_index/_search { "query": { "bool": { "must": [ { "match": { "doc.locations": { "query": "cloppenburg", "operator": "and" } } } ] } } }
问题是由于您正在使用该text字段和match查询。
text
match
对匹配查询进行分析,并使用与索引时使用的搜索词相同的分析器,对于字段,这是标准分析器text。在您的情况下,如果在空白处打断文本,Landkreis Cloppenburg将创建两个标记landkreis,cloppenburg同时创建索引和搜索时间,甚至cloppenburg匹配文档。
Landkreis Cloppenburg
landkreis
cloppenburg
解决方案:使用keyword field。
keyword field
索引定义
{ "mappings": { "properties": { "location": { "type": "keyword" } } } }
为两个文档建立索引,然后使用相同的搜索查询
{ "query": { "bool": { "must": [ { "match": { "location": { "query": "Cloppenburg" } } } ] } }
}
结果
"hits": [ { "_index": "location", "_type": "_doc", "_id": "2", "_score": 0.6931471, "_source": { "location": "Cloppenburg" } } ]