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

相关推荐
Elasticsearch3 小时前
jina-reranker-v3.5:通过混合注意力与自蒸馏实现更快的列表式重排序
elasticsearch
Elasticsearch5 小时前
Elasticsearch Python DSL 客户端开发
elasticsearch
麻辣布丁5 小时前
Git冲突原因与解决方法全解
大数据·git·elasticsearch
顧棟9 小时前
【ES实战】 低版本Elasticsearch(不具备CCR)集群迁移
大数据·elasticsearch·搜索引擎
Elastic 中国社区官方博客10 小时前
隐藏在可观测性数据中的安全攻击
大数据·网络·安全·elasticsearch·搜索引擎·全文检索
海兰12 小时前
Elasticsearch ES|QL:让全文本搜索无处不在
大数据·elasticsearch·jenkins
Elasticsearch12 小时前
一字段,一份副本:Elasticsearch 列式存储如何丢弃倒排索引
elasticsearch
LIXIUPING201412 小时前
微服务分布式日志环境完整搭建实战|从服务改造到 ELK 集群部署、全流程可落地
elk·elasticsearch·logstash·filebeat·分布式日志
OsDepK1 天前
项目快速Git至仓库(完整版)
大数据·git·elasticsearch·搜索引擎
Elastic 中国社区官方博客1 天前
如何通过一条 ES|QL 查询为 Elasticsearch 中的每个指标构建指标图表
大数据·运维·数据库·elasticsearch·搜索引擎·全文检索·kibana