带有组合功能的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"的时候,算法结果将按照下面的方式执行:
- 令算分最高的字段得分为s1
- 令其他匹配的字段的算分 * tie_breaker的和为s2
- 最终得分为: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。
看看下面这个示例:我想让书本的价格增加,相关性算法相应的降低:
返回结果:
算分过程
- 价格 x factor(1.2)
- 使用reciprocal,类似于 1/x,这里就是 1/(价格 x factor(1.2))
- 再使用boost_mode:也就是新分 = 旧分 * 1/(价格 x factor(1.2))
对于boost_mode,它有以下几种:
- multiply: 算分与函数值的积
- replace:使用函数值作为最终的结果
- sum:算分与函数值的和
- avg:算分与函数值的评分值
- min:算分与函数值的最小值
- max:算分与函数值的最大值