ElasticSearch之bool多条件查询

写在前面

在实际的业务场景中,不可能只是简单的单值查询 ,更多的是n个条件的综合查询,就像下面的搜索:

针对这种场景我们就需要依赖于bool查询了,本文就一起来看下这部分的内容。

1:bool查询介绍

bool查询用于进行多条件的组合查询,如果是需要计算得分的,则取各个查询的得分之和作为最终得分。bool查询包含四种子查询,must,must_not,should,filter,如下:

实例:

不影响算分的filter和must_not:

影响算分的should和must:

bool的多层嵌套:

相同等级,算分权重相同:

通过boost影响字段的算分权重:

2:实例

2.1:shoud+boost

boost是一个影响的分权中的参数,会被应用在计算得分的公式中影响最终的得分。

看下should用法,以及如何通过boost影响should的得分,准备数据:

复制代码
DELETE blogs
POST blogs/_bulk
{"index": {"_id": 1}}
{"title":"Apple iPad","content":"Apple iPad,Apple iPad"}
{"index": {"_id": 2}}
{"title":"Apple iPad,Apple iPad","content":"Apple iPad"}

我们把相反的内容放到了两个文档里,接下来通过调整title和content查询的boost来影响这两个文档的最终得分,即影响其返回的的顺序。

复制代码
POST blogs/_search
{
    "query": {
        "bool": {
            "should": [
                {
                    "match": {
                        "title": {
                            "query": "apple,ipad",
                            "boost": 1.1
                        }
                    }
                },
                {
                    "match": {
                        "content": {
                            "query": "apple,ipad",
                            "boost": 1
                        }
                    }
                }
            ]
        }
    }
}

上述查询给了title更高的权重,并且title针对查询的TF(term frequency)更高,所以"_id" : "2"有更高的总得分,被放在结果集的前面,类似的我们也可以调高content的boost,则"_id" : "1"有更高的总得分,被放在结果集的前面:

2.2:boosting+negative+positive

是should查询。

通过boosting+negative+positive来影响得分,其中negative用来给匹配的结果给负分,即减分,positive给匹配的结果正分,即加分,数据:

复制代码
delete news
POST news/_bulk
{"index": {"_id": 1}}
{"content":"Apple Mac"}
{"index": {"_id": 2}}
{"content":"Apple iPad"}
{"index": {"_id": 3}}
{"content":"Apple employee like Apple and Apple Juice"}

假定我们想让苹果公司产品相关的文档有更高的优先级,即放在结果集的更靠前位置,而非苹果产品的文档放在靠后位置,其中文档1,2是评估产品,而3不是苹果产品,如下方式查询满足需求:

复制代码
POST news/_search
{
    "query": {
        "boosting": {
            "positive": {
                "match": {
                    "content": "apple"
                }
            },
            "negative": {
                "match": {
                    "content": "Juice"
                }
            },
            "negative_boost": 0.5
        }
    }
}

写在后面

参考文章列表

ElasticSearch之search API

相关推荐
Elastic 中国社区官方博客13 小时前
不到 5 分钟完成本地部署:Jina embedding 模型现已支持本地部署
大数据·人工智能·elasticsearch·搜索引擎·embedding·jina
二进制流水搬运工14 小时前
入职第一天拉了23个仓库,我写了个脚本解放双手
大数据·elasticsearch·搜索引擎
Elasticsearch14 小时前
在不到一小时内将 Datadog Kubernetes 仪表板迁移到 Elastic Observability
elasticsearch
.柒宇.15 小时前
Elasticsearch 核心概念与系统架构详解
elasticsearch·系统架构
风行無痕18 小时前
单机Elasticsearch 8.19.18安全升级到9.4.3的过程
大数据·elasticsearch·搜索引擎
Elastic 中国社区官方博客19 小时前
使用重新设计的 AutoOps 更快地进行 Elasticsearch 问题排查
大数据·运维·前端·人工智能·elasticsearch·搜索引擎·全文检索
阿拉雷️20 小时前
【搜索实战】Spring Boot 3.3 + AI Agent × Elasticsearch:让AI自动优化搜索策略,查询速度从2秒压到50毫秒
人工智能·spring boot·elasticsearch
阿里云大数据AI技术1 天前
阿里云 ES AI 引擎版:面向 Agent 场景,为亿级租户、千亿规模向量设计的搜索引擎
人工智能·elasticsearch·agent
阿里云大数据AI技术1 天前
FalconSeek 技术解析:阿里云 Elasticsearch 云原生内核如何让查询性能飙升600%
人工智能·elasticsearch
Elastic 中国社区官方博客1 天前
将你的 Grafana Kubernetes 仪表板迁移到 Elastic Observability:相同的 PromQL,30 倍更快的查询
大数据·人工智能·elasticsearch·搜索引擎·容器·kubernetes·grafana