ES入门五:组合查询

带有组合功能的Api有以下几个:

  • Bool Query:布尔查询,可以组合多个过滤语句来过滤文档
  • Boosting Query:在postive块中指定匹配文档的语句,同时降低在negative块中也匹配的文档的得分,提供调整相关性算法的能力
  • constant_score Query:包装了一个过滤器查询,不进行算分
  • dis_max Query:返回匹配了一个或者多个查询语句的文档,但只将最佳匹配的评分作为相关性算法返回
  • function_score Query:支持使用函数来修改查询返回的分数

Bool Query

如其名,Bool Query使用1个或者多个布尔查询子句进行构建,每个子句都有一个类型,这些类型如下:

  • must:查询的内容必须在匹配的文档中出现,并且会进行相关性算法。简单来说就是与AND等价
  • filter:查询的内容必须在匹配的内容中出现,但不想must,filter的相关性算法是会被忽略的。因为其子句会在filter context中执行,所以其相关性算法会被忽略,并且子句将被考虑用作缓存**,简单来说就是与AND等价**
  • should:查询的内容应该在匹配的文档中出现,可以指定最小匹配的数量。简单来说**,就是与OR等价**
  • must_not:查询的内容不能在匹配的文档中出现。与filter一样其相关性算法会被忽略,简单来说与NOT 等价

#### 需求一:must多条件查询(作者和出版日期) ![image.png](https://img-blog.csdnimg.cn/img_convert/a8557000957942bf73472abb3b8dcf10.png)
返回结果:
![image.png](https://img-blog.csdnimg.cn/img_convert/1f97c91bda03ea2f25e4019cd010606b.png)

需求二:should多条件查询(作者和日期)

image.png
返回结果:
image.png
当我们将这个minimum_should_match设置为1的时候,表示最小匹配子句查询为1的时候,看看返回结果是什么样:
image.png

需求三:must+filter查询(作者和日期)

image.png
返回结果:
image.png
可以明显的看出花费时间是不一样的

Boosting Query

Boosting Query可以指定两个块:positive块和negative块。可以在postive块指定匹配文档的语句,而在negative块中匹配的文档相关性算法会降低。相关性算法降低的程度将由negative_boost参数决定,其取值范围:【0,0, 1.0】
image.png
返回结果:
image.png
上面我们像查询书名中含有“linux”的文档,并且想让含有“programming”字样的文档的相关性降低一半。在negative块中匹配的文档,其相关性算分为:在postive中匹配是的算分* negative_boost

constant_score Query

这个之前已经讲过了,其包装了一个过滤器查询,不进行算分。使用Constant Score可以将query转换为filter,可以忽略相关性算法的环节,并且filter可以有效利用缓存,从而提高查询的性能
image.png

dis_max Query

disjunction max Query简称为dis_max, 就是分离最大化查询的意思。注意这个名字中的两个点:分离、最大化

  • disjunction(分离)的含义是:表示把同一个文档中的每个字段上的查询都分开,分吧进行算法操作
  • max(最大化):是将多个字段查询的得分的最大值作为最终评分返回

将每个条件分开执行,最终返回最佳匹配的得分作为查询的算法结构返回

image.png
返回结果:
image.png
如上示例,我们在查询书名中出现“linux”或者书本简介中出现“kernel“的文档,而最终返回的相关性评分将以匹配“linux”或者匹配“kernel”中最大的那个评分为准

这里出现了tie_breaker, 我们再学习一下,当指定“tie_breaker”的时候,算法结果将按照下面的方式执行:

  1. 令算分最高的字段得分为s1
  • 令其他匹配的字段的算分 * tie_breaker的和为s2
  1. 最终得分为:s1+s2

“tie_breaker” 的取值范围为:[0.0, 1.0]。当其为 0.0 的时候,按照上述公式来计算,表示使用最佳匹配字段的得分作为相关性算分。当其为 1.0 的时候,表示所有字段的得分同等重要。当其在 0.0 到 1.0 之间的时候,代表其他字段的得分也需要参与到总得分的计算当中去。通俗来说就是其他字段可以使用 “tie_breaker” 来进行“调整权重”

function_score Query

function_score Query允许你在查询结束以后去修改每一个匹配文档的相关性算法,所以使用算分函数可以改变或者替换原来的相关性算分结果

function_score Query提供一下几个算分函数:

  • script_score:利用自定义的脚本完全控制算分逻辑
  • weight:为每一个文档设置一个简单并且不会被规范化的权重
  • random_score: 为每个用户提供一个不同的随机算分,对结果进行排序
  • field_value_factor:使用文档字段的值来影响算分,例如将好评数量作为这个字段考虑因素
  • decay functions: 衰减函数,以某个字段的值为标准,距离指定值越近,算分越高。例如我想要让书本价格越接近10元,算分越高排序越靠前

field_value_factor

field_value_factor的作用是用文档某个字段的值来影响相关性算分,其可以解决这样的需求:价格优惠的优先推荐,点赞数多的优点推荐、购买量多的优先推荐等

field_value_factor提供了以下几个参数选项:

  • field:文档的字段
  • factor:指定文档的值会乘以这个因子,默认为1
  • modifier:修改最终值的函数,其值可以为:none、log、log1p、log2p、ln、ln1p、ln2p、square、 sqrt、reciprocal,默认为 none。

看看下面这个示例:我想让书本的价格增加,相关性算法相应的降低:
image.png

返回结果:
image.png

算分过程

  1. 价格 x factor(1.2)
  2. 使用reciprocal,类似于 1/x,这里就是 1/(价格 x factor(1.2))
  3. 再使用boost_mode:也就是新分 = 旧分 * 1/(价格 x factor(1.2))

对于boost_mode,它有以下几种:

  • multiply: 算分与函数值的积
  • replace:使用函数值作为最终的结果
  • sum:算分与函数值的和
  • avg:算分与函数值的评分值
  • min:算分与函数值的最小值
  • max:算分与函数值的最大值
random_score
  • 20
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ElasticSearch是一款基于Lucene的分布式搜索引擎,支持各种类型的查询。其中组合查询是指将多个查询条件组合起来进行查询,可以使用ElasticSearch的bool查询实现。 bool查询是一种复合查询,可以将多个查询条件组合起来,支持must、must_not、should、filter四种查询方式。 - must:表示必须匹配的查询条件,相当于“AND”的关系。 - must_not:表示必须不匹配的查询条件,相当于“NOT”的关系。 - should:表示可选匹配的查询条件,相当于“OR”的关系。 - filter:表示不评分的过滤条件,相当于must的变种,但它不会影响评分。 下面是一个使用bool查询实现组合查询的例子: ``` { "query": { "bool": { "must": [ { "match": { "title": "Elasticsearch" }}, { "match": { "content": "search" }} ], "must_not": [ { "match": { "content": "java" }} ], "should": [ { "match": { "author": "John" }}, { "match": { "tags": "elk" }} ], "filter": [ { "range": { "date": { "gte": "2022-01-01" }}} ] } } } ``` 上述查询语句中,我们使用bool查询将多个查询条件组合起来: - must条件表示title必须包含Elasticsearch,content必须包含search,相当于“Elasticsearch AND search”的关系。 - must_not条件表示content必须不包含java,相当于“NOT java”的关系。 - should条件表示author必须包含John,或tags必须包含elk,相当于“John OR elk”的关系。 - filter条件表示date必须大于等于2022-01-01,但不影响评分。 通过使用bool查询,我们可以实现各种复杂的组合查询

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值