【问题标题】:Elasticsearch OPERATOR for Nested queries用于嵌套查询的 Elasticsearch OPERATOR
【发布时间】:2015-12-21 12:09:21
【问题描述】:

我的索引中有一个相对简单的结构。客户有自己的属性,他的身份、电子邮件和电话作为嵌套属性。到目前为止,当我查询嵌套对象时,我的所有查询都可以正常工作。我正在开发类似全局搜索的东西,它允许用户输入任何信息,然后我向他展示相应的客户。为此,我正在迭代我拥有的所有嵌套属性(因为我不知道他到底在寻找什么)。我的查询如下所示:

{
"sort": ["_score"],
"query": {
    "bool": {
        "must": [{
            "nested": {
                "path": "identity",
                "query": {
                    "bool": {
                        "must": [{
                            "multi_match": {
                                "query": "my search",
                                "fields": "identity.*"
                            }
                        }]
                    }
                }
            }
        }, {
            "nested": {
                "path": "phones",
                "query": {
                    "bool": {
                        "must": [{
                            "multi_match": {
                                "query": "my search",
                                "fields": "phones.*"
                            }
                        }]
                    }
                }
            }
        }]
    }
}

但是,当您有多个嵌套查询时,似乎应用了“AND”运算符,因此我没有得到正确的信息。如果我只搜索一个嵌套对象,我总是会得到正确的结果。我尝试将“运算符”=>“或”几乎无处不在,但没有任何效果,并且文档对这种情况没有太多说明(或者至少我找不到任何东西)。我错过了什么?

【问题讨论】:

  • 也可以去掉"sort": ["_score"],这个是默认的。

标签: json elasticsearch operator-keyword nested-attributes


【解决方案1】:

您应该将“必须”替换为“应该”以获得或行为,查看更多here

【讨论】:

  • 嗯,这似乎确实为查询添加了一个逻辑“或”,但它打破了很多其他情况。例如,如果一个有 2 个客户(john 和 dom)并且我搜索 john,我会得到 john AND dom 作为结果。如果将 must 更改为 should,则会发生这种情况
  • 你能分享2个文件的样本吗?一个和john,一个和dom?
  • 看来我设法获得了预期的行为,但我还需要指定minimum_should_match 参数。 :)
【解决方案2】:

好的,这是一个示例:

{
"uid": "uid",
"oid": "oid",
"tags": ["VIP"],
"identity": {
    "_id": {
        "$oid": "567901d6ab265d4cf7000001"
    },
    "first": "John",
    "gender": "male",
    "last": "",
    "middle": "",
    "prefix": "",
    "suffix": ""
},
"phones": [{
    "_id": "23232323-642f-4ce1-ab1b-542bbd1468ea",
    "created_at": null,
    "name": "mobile",
    "updated_at": null,
    "value": "987654321"
}],
"emails": [{
    "_id": "12121212-642f-4ce1-ab1b-542bbd1468ea",
    "created_at": null,
    "name": "home",
    "updated_at": null,
    "value": "john@john.com"
}]
}

{
"uid": "uid",
"oid": "oid",
"tags": ["VIP"],
"identity": {
    "_id": {
        "$oid": "567901d6ab265d4cf7000001"
    },
    "first": "Dom",
    "gender": "male",
    "last": "",
    "middle": "",
    "prefix": "",
    "suffix": ""
},
"phones": [{
    "_id": "23232323-642f-4ce1-ab1b-542bbd1468ea",
    "created_at": null,
    "name": "mobile",
    "updated_at": null,
    "value": "987654321"
}],
"emails": [{
    "_id": "12121212-642f-4ce1-ab1b-542bbd1468ea",
    "created_at": null,
    "name": "home",
    "updated_at": null,
    "value": "dom@dom.com"
}]
}

因此,如果我使用 must 子句并搜索 john/dom,我没有得到任何结果(请记住,我正在搜索所有嵌套文档并且电话不包含任何 'john/dom ',如果我只搜索身份/电子邮件,我会得到正确的结果,因为电子邮件也包含名称)。

如果我切换到 should 子句并执行相同的查询,我将同时返回 john 和 dom。

最终查询如下所示:

{
"_source": ["oid", "uid"],
"sort": ["_score"],
"query": {
    "bool": {
        "should": [{
            "nested": {
                "path": "identity",
                "query": {
                    "bool": {
                        "must": [{
                            "multi_match": {
                                "query": "john",
                                "operator": "and",
                                "fields": ["identity.*"],
                                "type": "cross_fields",
                                "tie_breaker": 1.0
                            }
                        }]
                    }
                }
            }
        }, {
            "nested": {
                "path": "emails",
                "query": {
                    "bool": {
                        "must": [{
                            "multi_match": {
                                "query": "john",
                                "operator": "and",
                                "fields": ["emails.*"],
                                "type": "cross_fields",
                                "tie_breaker": 1.0
                            }
                        }]
                    }
                }
            }
        }, {
            "nested": {
                "path": "phones",
                "query": {
                    "bool": {
                        "must": [{
                            "multi_match": {
                                "query": "john",
                                "operator": "and",
                                "fields": ["phones.*"],
                                "type": "cross_fields",
                                "tie_breaker": 1.0
                            }
                        }]
                    }
                }
            }
        }],
        "filter": [{
            "term": {
                "oid": "oid"
            }
        }]
    }
}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-24
    • 2018-03-08
    • 2018-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多