ElasticSearch控制should查询的精度(匹配个数)

should查询

当我们想要检索一批符合条件的文档,只要文档满足一个条件时就可以返回,这种情况下我们可以使用should查询,实现类似OR的功能。示例代码如下:

{
    "from": 0,
    "size": 10,
    "query": {
        "bool": {
            "should": [
                {
                    "match": {
                        "table_name": {
                            "query": "student_info"
                        }
                    }
                },
                {
                    "match": {
                        "table_comment": {
                            "query": "学生信息"
                        }
                    }
                }
            ]
        }
    }
}

上述代码实现了table_name字段匹配"student_info" 或者 table_comment字段匹配"学生信息"的文档搜索。

限制should条件满足的个数

当我们的条件增多时,我们想要提取满足2个或满足更多个条件的文档,此时我们可以用minimum_should_match字段实现。示例代码如下:

{
    "from": 0,
    "size": 10,
    "query": {
        "bool": {
            "should": [
                {
                    "match": {
                        "table_name": {
                            "query": "student_info"
                        }
                    }
                },
                {
                    "match": {
                        "table_comment": {
                            "query": "学生信息"
                        }
                    }
                },
                {
                    "match": {
                        "field_name": {
                            "query": "student_name"
                        }
                    }
                }
            ],
            "minimum_should_match": 2
        }
    }
}

上述代码实现了至少满足两个条件的文档搜索。

minimum_should_match字段必须和should字段一同使用,否则返回无结果

什么场景下会使用minimum_should_match

当我们的一个bool查询中包含filter、must、should时,should的过滤条件可以不满足。此时should的含义是一个文档不必包含should中指定的条件,但如果一旦包含,我们就认为他们更相关。而当bool查询中不包含filter、must时,should的过滤条件必须至少有一个匹配。示例代码如下:

{
    "from": 0,
    "size": 10,
    "query": {
        "bool": {
            "filter": [
                {
                    "term": {
                        "is_enable": 1
                    }
                }
            ],
            "must": [
                {
                    "match": {
                        "school_name": {
                            "query": "default"
                        }
                    }
                }
            ],
            "should": [
                {
                    "query_string": {
                        "default_field": "table_name",
                        "query": "student_info",
                        "boost": 4
                    }
                },
                {
                    "query_string": {
                        "default_field": "field_name",
                        "query": "student_name",
                        "boost": 2
                    }
                }
            ],
            "minimum_should_match": 1
        }
    }
}

当bool查询中包含filter或must时,should语句不会影响最终结果的条数,但是会影响文档的最终排名。此时,如果需要限定should中的过滤条件必须满足一个,可以显示的指定minimum_should_match。

Elasticsearch中,BoolQueryBuilder 允许通过四种布尔逻辑来组合查询子句:must、should、must_not 和 filter。其中,“should”子句表示“或者”的逻辑,如果一个BoolQueryBuilder查询中没有任何“should”子句匹配,那么整个查询可能会返回空结果集,这在很多场景中并不是我们期望的。 为了确保至少有一个“should”子句匹配,可以采取以下策略: 1. 使用“minimum_should_match”参数:这个参数可以指定在BoolQueryBuilder中,“should”子句至少需要多少个匹配,才能返回结果。例如,如果你设置 minimum_should_match=1,那么至少需要一个“should”子句匹配查询才会返回结果。这个参数可以是一个绝对的数字,也可以是一个百分比,根据匹配的“should”子句的数量来决定。 2. 组合使用“should”和“must”子句:虽然“must”子句表示必须匹配,但是你可以在同一个BoolQueryBuilder中同时使用“should”和“must”子句。在这种情况下,即使“should”子句中没有任何匹配,如果有“must”子句匹配查询仍然会返回结果。 3. 利用条件逻辑:你可以通过编程逻辑来确保至少有一个“should”子句被添加到查询中。例如,在构建查询之前,你可以检查是否存在特定的条件,并且只有当这些条件满足时,才添加“should”子句。 这里是一个使用“minimum_should_match”参数的示例: ```json GET /_search { "query": { "bool": { "should": [ { "match": { "field1": "value1" }}, { "match": { "field2": "value2" }}, // 可以添加更多的“should”子句 ], "minimum_should_match": 1 // 至少一个“should”子句需要匹配 } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值