在上一篇文章我们介绍了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不仅可以用来增加某个字段匹配后的总得分,也可以用来减小某个字段匹配后的总得分。




还没有评论,来说两句吧...