在上一篇文章我们介绍了elasticsearch的打分机制,也提到了boost系数是一个自定义的影响打分的因素,这批文章我们详细介绍一下。
举个例子:
1、title:月亮 body:今晚的月亮好圆 2、title:月色 body:今晚的月亮好大,月色好美
上面我们提到了2个文档,同时对应的有title和body的字段,当我们搜索月亮这个关键词的时候,假设文档1的基础打分是0.58(title占0.22 ,body占0.36),文档2的基础打分是0.36(仅有body占0.36)。此时我们假设在title字段上定义boost打分制为3,则最后返回的结果是这样的
文档1的得分:0.22*3 + 0.36 =1.02 文档2的得分:0.36
此时可以看到文档1的得分在title字段上提升了很多,这就是boost自定义系数影响最终的打分和排序的效果。
在elasticsearch中boost系数的使用可以分为2个阶段,一是在索引阶段,二是在搜索结果,在这两个阶段我们都可以自定义boost系数,从而影响最终的搜索结果。下面我们详细介绍下:
一、在索引阶段添加boost系数
这里在索引阶段添加boost系数主要是在创建mapping的时候,为某一个字段指定固定的boost系数,这样子每一个结果在查询的时候,会在该字段上的打分基础上*这个系数,例如:
put /test1 { "mappings": { "properties": { "name": { "type": "keyword", "boost": 2 }, "desc": { "type": "text" }, "device_cts": { "type": "long" } } }, "settings": { "index": { "number_of_shards": "1", "number_of_replicas": "0" } } }
二、在搜索阶段添加boost系数
在搜索阶段添加boost系数的话主要是在查询语句里面动态指定,可以使用 query.setBoosting(2.0) 或者 title^2.0 这两种方式指定相关的boost系数,下面还是举个例子:
post /devices/_search { "query": { "match": { "device_name": { "query": "设备3 ", "boost": 2 } } } }
我们在看下原来的查询得分
通过比较,可以很直观的看到两次查询结果的_score分值不一样。使用boost的分值会更高一些。
备注:
1、虽然在索引阶段可以直接为某些字段设置boost系数,但是我们非常不提倡在索引阶段设置这个boost系数,主要原因有:
1、在索引阶段设置了boost系数之后将不能被改变,如果需要改变的话,只能重新索引整个文档。 2、boost的值会存储在lucene的索引结构中,造成空间浪费,同时由于是1个字节,会丢失计算精度。 3、boost的系数是设置在单个字段上的,如果我们需要在这个字段上搜索多个关键词的话,每命中一次就会计算一次boost,会导致最终的字段权重分词高
2、我们鼓励在查询的时候灵活使用boost系数。
3、一般在组合查询或者复合查询也就是 bool或者 and/or/not这些查询的时候,boost查询才更有意义。
4、boost系数可以使大于1的数,也可以使小于1的数,因此boost不仅可以用来增加某个字段匹配后的总得分,也可以用来减小某个字段匹配后的总得分。
还没有评论,来说两句吧...