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多条件查询(作者和日期)

返回结果:

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

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

返回结果:

可以明显的看出花费时间是不一样的

Boosting Query

Boosting Query可以指定两个块:positive块和negative块。可以在postive块指定匹配文档的语句,而在negative块中匹配的文档相关性算法会降低。相关性算法降低的程度将由negative_boost参数决定,其取值范围:【0,0, 1.0】

返回结果:

上面我们像查询书名中含有"linux"的文档,并且想让含有"programming"字样的文档的相关性降低一半。在negative块中匹配的文档,其相关性算分为:在postive中匹配是的算分* negative_boost

constant_score Query

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

dis_max Query

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

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

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

返回结果:

如上示例,我们在查询书名中出现"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。

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

返回结果:

算分过程

  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
相关推荐
阿华的代码王国10 分钟前
MySQL ------- 索引(B树B+树)
数据库·mysql
Redstone Monstrosity12 分钟前
字节二面
前端·面试
徐*红13 分钟前
Elasticsearch 8.+ 版本查询方式
大数据·elasticsearch
东方翱翔19 分钟前
CSS的三种基本选择器
前端·css
码爸30 分钟前
flink 例子(scala)
大数据·elasticsearch·flink·scala
Hello.Reader38 分钟前
StarRocks实时分析数据库的基础与应用
大数据·数据库
执键行天涯40 分钟前
【经验帖】JAVA中同方法,两次调用Mybatis,一次更新,一次查询,同一事务,第一次修改对第二次的可见性如何
java·数据库·mybatis
Fan_web42 分钟前
JavaScript高级——闭包应用-自定义js模块
开发语言·前端·javascript·css·html
yanglamei19621 小时前
基于GIKT深度知识追踪模型的习题推荐系统源代码+数据库+使用说明,后端采用flask,前端采用vue
前端·数据库·flask
千穹凌帝1 小时前
SpinalHDL之结构(二)
开发语言·前端·fpga开发