ElasticSearch嵌套字段query_string相邻词查询无结果如何解决
问题背景
我使用的版本为ES 7.14/Kibana 7.10,需要实现任意顺序的相邻词搜索,此前使用如下查询语句可以在普通text类型字段上正常运行:
{ "query":{ "bool":{ "must":[ { "query_string":{ "query":"*antonio* *banderas*", "fields":[ "text" ], "default_operator":"and" } }] } } }
上述查询在普通text字段上运行正常。现在我有一个nested类型的字段metadata,其mapping定义如下:
{ "mappings": { "properties": { "text": { "type": "text" }, "metadata": { "type": "nested", "properties": { "text": { "type": "text" } } } } } }
我希望在该嵌套字段上实现相同的相邻词搜索效果,尝试直接为query_string指定嵌套字段路径,但加了default_operator: "and"后没有返回任何结果,也没有报错:
{ "query": { "query_string": { "query": "metadata.text:*antonio* *banderas*", "default_operator": "and" } } }
解决方案
之前写法不生效的核心原因是nested字段属于独立存储的嵌套文档,不能直接在顶层查询中指定路径查询,必须用ES提供的nested查询语法包裹,才能正确匹配嵌套字段的内容,正确写法如下:
{ "query": { "nested": { "path": "metadata", "query": { "query_string": { "query": "*antonio* *banderas*", "fields": ["metadata.text"], "default_operator": "and" } } } } }
参数说明
- 外层
nested声明当前查询作用于嵌套字段,path固定填嵌套字段的根路径metadata - 内层
query_string的配置和你之前用在普通text字段的配置完全一致,兼容所有原有参数:default_operator、模糊匹配规则、多字段查询等都可以正常使用 - 该写法默认要求两个搜索词同时出现在同一个metadata嵌套文档的text字段中,和你之前普通字段的搜索效果完全一致
内容的提问来源于stack exchange,提问作者loretoparisi
相关产品推荐
相关产品推荐

