一、概要

在使用ES进行搜索时,评分的控制是非常关键的。

而如何对搜索评分进行定制化控制,让其更符合我们想要的评分结果呢?

  1. 对boost参数进行控制
  2. 通过rescore对查询结果的评分进行二次控制
  3. 使用function_score作为终极武器对评分进行函数控制

二、对比&&选择

boost

rescore

function_score

使用场景

在常规搜索中,经常使用boost进行评分的控制。

使用起来相对简单,但是控制度相对有限。

只能对单个字段进行控制,效果较为僵硬。

基于查询结果的二次查询方式对评分进行控制。

不会过多影响性能,可以解决大部分问题。

对评分进行函数控制,提供多种函数。

可以根据不同场景选择不同函数,解决多种评分需求。

但是会影响部分查询速率。

支持脚本形式自定义函数,作为终极解决方案。

三、应用实践

A、boost

1)概念

对于每次的查询可以使用boost参数来控制评分

2)实例

# 创建索引
PUT my_index
{"mappings":{"properties":{"content":{"type":"text"}}}}
}
# boost评分控制实例
POST /my_index/_search
{"query":{"bool":{"should":[{"match":{"content":{"query":"文本A","boost":2}}},{"match":{"content":"文本B"}}]}}
}

B、rescore

1)概念

Rescore可以帮助提高精度,方法是仅重新排序由query和 post_filter阶段返回的文档 ,基于已查询到的文档进行Rescore操作,而不会作用于全文文档。

2)参数

参数

解读

query_weight

原始查询权重
rescore_query_weight rescore查询权重
score_mode

原始查询与rescore查询评分合并方式

  • multiply:分数相乘
  • total: 分数相加(默认)
  • avg:分数平均
  • max:最大的分数
  • min:最小的分数

3)DSL

POST /_search{"query" : {"match" : {"message" : {"operator" : "or","query" : "the quick brown"}}},"rescore" : {"window_size" : 50,"query" : {"rescore_query" : {"match_phrase" : {"message" : {"query" : "the quick brown","slop" : 2}}},"query_weight" : 0.7,"rescore_query_weight" : 1.2,"score_mode":"total"}}}

C、function_score

1)概念

function_score是用于处理文档分值的特殊DSL,它会在查询结束后对每一个匹配的文档进行一系列的重打分操作,最后以生成的最终分数进行排序。

2)多种function解读

  1. weight:你将分数乘以锁提供的权重。boost在特定查询会被规范化,而weight永远不会,值是浮点类型
  2. random_score:生成一个在[0,1]之间的随机分数。
  3. field_value_factor:利用一个 字段值进行类似函数的计算,但是不用编写脚本,避免开销。
    • field:指定字段名

    • modifier将字段值进行加工,有以下的几个选项:

      1. none:不处理
      2. log:计算对数
      3. log1p:先将字段值 +1,再计算对数
      4. log2p:先将字段值 +2,再计算对数
      5. ln:计算自然对数
      6. ln1p:先将字段值 +1,再计算自然对数
      7. ln2p:先将字段值 +2,再计算自然对数
      8. square:计算平方
      9. sqrt:计算平方根
      10. reciprocal:计算倒数
    • factor:对字段值进行预处理,乘以指定的数值(默认为 1)
  4. decay_functions:衰减函数,在给定范围区间内逐步衰减评分。

    衰减函数(Decay Function)提供了一个更为复杂的公式,它描述了这样一种情况:对于一个字段,它有一个理想的值,而字段实际的值越偏离这个理想值(无论是增大还是减小),就越不符合期望。这个函数可以很好的应用于数值、日期和地理位置类型,由以下属性组成:

    • 原点(origin):该字段最理想的值,这个值可以得到满分(1.0)
    • 偏移量(offset):与原点相差在偏移量之内的值也可以得到满分
    • 衰减规模(scale):当值超出了原点到偏移量这段范围,它所得的分数就开始进行衰减了,衰减规模决定了这个分数衰减速度的快慢
    • 衰减值(decay):该字段可以被接受的值(默认为 0.5),相当于一个分界点,具体的效果与衰减的模式有关

  5. script_score:可以自定义编写一个函数脚本,来自定义评分

3)参数

参数

解读

score_mode

函数计算影响字段的评分方式(效力于函数)

multiply:分数相乘(默认)

sum: 分数相加

avg:分数平均

first:第一个方法匹配过滤被应用

max:最大的分数

min:最小的分数

boost_mode

函数分数与查询分数的计算方式(效力于最终的评分)

multiply:查询分数*函数分数相乘(默认)

replace:只使用函数的分数,忽略查询的分数

sum:查询分数和函数分数相加

avg:平均

max:取查询分数和函数分数中大的

min:取查询分数和函数分数中小的

min_score 查询分数小于该参数的文档,不进入函数计算中。

4)实例

# field_value_factor实例# 有一个商品索引,包含字段 销量sales和title商品名称。# 需求是查询"雨伞"商品 并根据销量进行评分的排序 此时选择field_value_factor非常合适# 该DSL表示查询雨伞对应的商品  并且对销量sales字段的评分进行square(平方)处理,这样可以使得销量越高的商品评分越高POST /_search{"query": {"function_score": {"query": {"match": {"title": "雨伞"}},"field_value_factor": {"field": "sales","modifier": "square"},"boost_mode": "sum"}}}# decay_functions实例# 需求为:文档发布时间在10天及10天前的文档,评分进行衰减越来越低。# 该DSL表示查询 文档内容中包含"中国"的文档,并且文档发布时间在10天内评分正常,发布时间超过10天的文档,评分逐步衰减,发布时间越远的评分越低!{"query": {"function_score": {"query": {"match": {"content": "中国"}},"gauss": {"preview_time": {"origin": "1628650247300","scale":  "864000","offset": "8640000","decay": 0.5}}}}}

[ElasticSearch] 三种方式进行ES检索评分控制相关推荐

  1. win下配置的ES中的数据在哪里可以看到?三种方式你看那种更加高大上!!!(win_Elasticsearch)

    在上一篇博客<使用logstash将Mysql中的数据导入到ElasticSearch中(详细步骤,win_Elasticsearch)>中我们提到将数据插入到es中,那我怎么知道数据是否 ...

  2. 三种方式细胞评分对比

    三种方式细胞评分对比 library(patchwork) library(ggplot2) library(ggalluvial) library(svglite) library(Seurat) ...

  3. Django中Model继承的三种方式

    Django中Model继承的三种方式 Django中Model的继承有三种: 1.抽象继承 2.多表继承 3.proxy model(代理model) 1.抽象继承 第一种抽象继承,创建一个通用父类 ...

  4. java 创建线程_【80期】说出Java创建线程的三种方式及对比

    点击上方"Java面试题精选",关注公众号 面试刷图,查缺补漏 >>号外:往期面试题,10篇为一个单位归置到本公众号菜单栏->面试题,有需要的欢迎翻阅. 一.Ja ...

  5. android xml解析的三种方式

    2019独角兽企业重金招聘Python工程师标准>>> 在android开发中,经常用到去解析xml文件,常见的解析xml的方式有一下三种:SAX.Pull.Dom解析方式.最近做了 ...

  6. Android之解析XML总结(SAX、Pull、Dom三种方式)

    常见的解析xml的方式有一下三种:SAX.Pull.Dom解析方式.最近做了一个android版的CSDN阅读器,用到了其中的两种(sax,pull),今天对android解析xml的这三种方式进行一 ...

  7. Spring集成Memcached三种方式(一)

    Spring集成Memcached三种方式(一) 转载:http://blog.csdn.net/u013725455/article/details/52102170 Memcached Clien ...

  8. 盛大游戏技术总监徐峥:Unity引擎使用的三种方式

    在5月13日Unite 2017 案例分享专场上,盛大游戏技术总监徐峥分享了使用Unity引擎的三种方式,以下为详细内容: 大家好,我先简单介绍一下我自己,我是盛大游戏的技术总监徐峥.我今天想分享的主 ...

  9. 【推荐收藏 】Python写入MySQL数据库的三种方式,最后一种方式方便又高效

    大家好,Python 读取数据自动写入 MySQL 数据库,这个需求在工作中是非常普遍的,主要涉及到 python 操作数据库,读写更新等,数据库可能是 mongodb. es,他们的处理思路都是相似 ...

最新文章

  1. 按原有结构恢复被删除的FAT32文件夹
  2. java有any类型吗_Java开发网 - 一个关于CORBA中any类型的问题
  3. Android 实现ListView的A-Z字母排序
  4. QTreeWidget的基本操作
  5. MySQL学习(3)单表查询
  6. TensorFlow中报错 module ‘tensorflow_core._api.v2.train‘ has no attribute ‘GradientDescentOptimize
  7. 【Asp.Net Core】在Visual Studio 2017中使用Asp.Net Core构建Angular4应用程序
  8. 《人生七年》启示,穷人买车,富人投资教育
  9. JUC中Executor基本知识
  10. 基于matlab遗传算法工具箱的曲线拟合,基于Matlab遗传算法工具箱的曲线拟合
  11. matlab负反馈传函,已知负反馈系统开环传函求阶跃传函
  12. 如何快速制作一副地图
  13. RFC 文档(1-500)
  14. macbook黑屏_Mac Book电脑黑屏开不了机三种解决方法
  15. vb6.0企业版win7_教你安装纯净版windows系统
  16. 读书笔记之《人性的优点》
  17. 360极速浏览器Onetab插件存储位置
  18. 警惕更改电子邮件内容实施诈骗活动
  19. 激光雷达的厮杀18年:西方“诸神黄昏”,东方“新王隐现”
  20. VBA编程_常用函数总结2

热门文章

  1. 2021-07-12Git - git pull时遇到error: cannot lock ref ‘refs/remotes/origin/master‘: unable to resolve...
  2. js读取本地文件和写入本地文件
  3. 如何建立一个强大的公关策略
  4. 使用 C# 开发智能手机软件:推箱子(十一)
  5. Office Interop与Tools的区别
  6. [补档][COGS 426]血帆海盗
  7. 将ppt转换成word格式的简单方法分享
  8. Golang 垃圾回收机制详解
  9. mapState使用方法
  10. Qt 二进制文件读写