嵌套查询未按预期工作

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_fieldDefaults 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 是否可以只搜索嵌套对象而不明确指定所有可能的字段?这对我的搜索至关重要。我希望它有弹性。指定所有字段似乎没有那么灵活。

以上是关于嵌套查询未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

NestJs mongoose 嵌套填充未按预期工作

带有分页的可扩展嵌套 Angular 材料数据表未按预期工作?

嵌套路由(React-Router-Dom 6.0.2)未按预期工作

嵌套 Cloudkit 查询未按正确顺序打印

ElasticSearch嵌套查询无法按预期工作

laravel,查询生成器,(或)查询未按预期工作