嵌套查询未按预期工作
Posted
技术标签:
【中文标题】嵌套查询未按预期工作【英文标题】:Nested query not working as expected 【发布时间】:2012-11-18 12:26:01 【问题描述】:我正在试验 ElasticSearch。我在查询嵌套对象时遇到问题。
我的映射:
curl -X GET http://localhost:9200/testt/resource/_mapping?pretty
"resource":
"properties":
"bib":
"type": "nested",
"properties":
"IssueDate":
"type": "date",
"format": "dateOptionalTime"
,
"Title":
"type": "string"
,
"name":
"type": "string"
我有一个索引资源:
curl -X GET http://localhost:9200/testt/resource/_search?pretty
"took": 1,
"timed_out": false,
"_shards":
"total": 5,
"successful": 5,
"failed": 0
,
"hits":
"total": 1,
"max_score": 1.0,
"hits": [
"_index": "testt",
"_type": "resource",
"_id": "1234",
"_score": 1.0,
"_source":
"name": "SSS",
"bib":
"Title": "XSD",
"IssueDate": "2012-12-19"
]
curl -X GET http://localhost:9200/testt/resource/1234?pretty
"_index": "testt",
"_type": "resource",
"_id": "1234",
"_version": 1,
"exists": true,
"_source":
"name": "SSS",
"bib":
"Title": "XSD",
"IssueDate": "2012-12-19"
但我无法使用查询请求找到它:
"query":
"nested":
"path": "bib",
"query":
"query_string":
"query": "XSD"
搜索:curl -X GET http://localhost:9200/testt/resource/_search?pretty -d ' "query" : "nested" : "path" : "bib", "query" : "query_string" : "query" : "XSD" '
"took" : 1,
"timed_out" : false,
"_shards" :
"total" : 5,
"successful" : 5,
"failed" : 0
,
"hits" :
"total" : 0,
"max_score" : null,
"hits" : [ ]
我的问题是:如何使用嵌套查询来查找我的对象?我对包含单词XSD
的嵌套对象bib
的对象感兴趣。对象1234
显然包含XSD
,但我找不到它。你能告诉我我的查询是否正常吗?它有什么问题?
【问题讨论】:
【参考方案1】:query_string
不支持,但如果您可以自己解析查询,则可以使用multi_match
查询并执行以下操作:
"query":
"nested":
"path": "bib",
"query":
"multi_match":
"query": "XSD",
"fields": ["bib.*"]
此解决方案的一个可能问题是,如果嵌套文档中有任何数字字段,则需要将它们从字段列表中排除。可以通过为字段名称添加前缀来实现。例如,您可以将所有字符串字段重命名为以s_
开头,此时您可以使用"fields": ["bib.s_*"]
选择所有字符串字段。
另一种可能的解决方案是使用父级的_all
字段。您可以从_all
中排除所有父字段,并将_all
专门用于嵌套字段。默认情况下,所有嵌套字段都包含在父级的_all
字段中。
【讨论】:
我喜欢你的回答。我怎样才能从_all
中获得排除?您能否提供包含该排除项的示例查询?
它不在查询中。它在映射中。您需要指定"include_in_all" : false
。请参阅elasticsearch.org/guide/reference/mapping/all-field.html 了解更多信息。
我可能会使用“s_”前缀。感谢您的帮助。【参考方案2】:
您需要在query_string query 中指定默认字段:
curl -XGET localhost:9200/testt/resource/_search -d '
"query":
"nested" :
"path" : "bib",
"score_mode" : "avg",
"query" :
"query_string" :
"fields" : ["Title"],
"query" : "XSD"
';
【讨论】:
这不是我的问题的答案。我想扫描所有字段。关于文档中的default_field
:Defaults to the index.query.default_field index settings, which in turn defaults to _all.
是 ElasticSearch 中的错误吗?我想是的,因为我的查询不像文档所说的那样工作。
你必须明确设置所有字段然后:"query_string" : "fields" : ["Title", "Subtitle"], "query" : "XSD"
Nested documents 没有自己的_all
字段,它们使用父文档的字段。
没错,所以如果你对父母的_all进行搜索,你将能够找到你的文档curl -XGET localhost:9200/testt/resource/_search -d '"query": "query_string": "query": "XSD" '
@imotov 是否可以只搜索嵌套对象而不明确指定所有可能的字段?这对我的搜索至关重要。我希望它有弹性。指定所有字段似乎没有那么灵活。以上是关于嵌套查询未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章
带有分页的可扩展嵌套 Angular 材料数据表未按预期工作?