ES自定义评分机制:function_score查询详解_斗者_2013的博客-CSDN博客_es function_score


本站和网页 https://blog.csdn.net/w1014074794/article/details/120523550 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

ES自定义评分机制:function_score查询详解_斗者_2013的博客-CSDN博客_es function_score
ES自定义评分机制:function_score查询详解
斗者_2013
于 2021-09-28 18:40:54 发布
6006
收藏
27
分类专栏:
跟着老万学ELK
文章标签:
elasticsearch
es
自定义评分
function_score
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/w1014074794/article/details/120523550
版权
跟着老万学ELK
专栏收录该内容
47 篇文章
85 订阅
订阅专栏
一、function_score介绍
主要用于让用户自定义查询相关性得分,实现精细化控制评分的目的。
在ES的常规查询中,只有参与了匹配查询的字段才会参与记录的相关性得分score的计算。但很多时候我们希望能根据搜索记录的热度、浏览量、评分高低等来计算相关性得分,提高用户体验。
官网介绍:function_score
哪些信息是用户真正关心的? 搜索引擎本质是一个匹配过程,即从海量数据中找到匹配用户需求的内容。
除了根据用户输入的查询关键字去检索外,还应根据用户的使用习惯、浏览记录、最近关注、搜索记录的热度等进行更加智能化的匹配。
常见的一些场景: 1、在百度、谷歌中搜索内容; 2、在淘宝、京东上面搜索商品; 3、在抖音上搜索用户和短视频。
二、实战演示
1、创建索引
说明:创建博客blog索引,只有2个字段,博客名title和访问量access_num。 用户根据博客名称搜索的时候,既希望名称能尽可能匹配,也希望访问量越多的排在最前面,因为一般访问量越多的博客质量会越好,这样可以提高用户的检索体验。
DELETE /blog
PUT /blog
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_smart"
},
"access_num": {
"type": "integer"
2、添加测试数据
PUT blog/_doc/2
"title": "java入门到精通",
"access_num":30
PUT blog/_doc/3
"title": "es入门到精通",
"access_num":50
PUT blog/_doc/4
"title": "mysql入门到精通",
"access_num":30
PUT blog/_doc/5
"title": "精通spark",
"access_num":40
3、常规检索
直接使用match查询,只会根据检索关键字和title字段值的相关性检索排序。
GET /blog/_search
"query": {
"match": {
"title": "java入门"
查询结果L
"hits" : [
"_index" : "blog",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.3739232,
"_source" : {
"title" : "java入门",
"access_num" : 20
},
"_index" : "blog",
"_type" : "_doc",
"_id" : "2",
"_score" : 1.0552295,
"_source" : {
"title" : "java入门到精通",
"access_num" : 30
},
……
4、采用function_score自定义评分
除了match匹配查询计算相关性得分,还引入了根据浏览量access_num计算得分。
GET /blog/_search
"query": {
"function_score": {
"query": {
"match": {
"title": "java入门"
},
"functions": [
"script_score": {
"script": {
"params": {
"access_num_ratio": 2.5
},
"lang": "painless",
"source": "doc['access_num'].value * params.access_num_ratio "
查询结果: 说明:尽管博客名为java入门的名称和搜索词更加匹配,但由于博客名为java入门到精通的博客访问量更高,最终检索品分更高,排名更靠前。
"hits" : [
"_index" : "blog",
"_type" : "_doc",
"_id" : "2",
"_score" : 79.14222,
"_source" : {
"title" : "java入门到精通",
"access_num" : 30
},
"_index" : "blog",
"_type" : "_doc",
"_id" : "1",
"_score" : 68.69616,
"_source" : {
"title" : "java入门",
"access_num" : 20
},
三、自定义评分类型
function_score 查询提供了多种类型的评分函数。
script_score script脚本评分weight 字段权重评分random_score 随机评分field_value_factor 字段值因子评分decay functions: gauss, linear, exp 衰减函数
说明: decay functions衰减函数太过复杂,这里暂时不作介绍。
1、script脚本评分
script_score 函数允许您包装另一个查询并选择性地使用脚本表达式从文档中的其他数字字段值派生的计算自定义它的评分。 这是一个简单的示例:
GET /_search
"query": {
"function_score": {
"query": {
"match": { "message": "elasticsearch" }
},
"script_score" : {
"script" : {
"source": "Math.log(2 + doc['likes'].value)"
请注意,与 custom_score 查询不同,查询的分数乘以脚本评分的结果。 如果你想禁止这个,设置 “boost_mode”: “replace”
2、weight 权重评分
weight函数是最简单的分支,它将得分乘以一个常数。请注意,普通的boost字段按照标准化来增加分数。 而weight函数却真真切切地将得分乘以确定的数值。
下面的例子意味着,在description字段中匹配了hadoop词条查询的文档,他们的分数将被乘以1.5.
GET /_search
"query": {
"function_score": {
"query": {
"match": { "message": "elasticsearch" }
},
"functions":[
"weight":1.5 ,
"filter": { "term": { "description": "hadoop" }}
},
"weight":3 ,
"filter": { "term": { "description": "flink" }}
3、random_score随机评分
random_score 生成从 0 到但不包括 1 的均匀分布的分数。默认情况下,它使用内部 Lucene doc id 作为随机源。
如果您希望分数可重现,可以提供种子和字段。 然后将基于此种子、所考虑文档的字段最小值以及基于索引名称和分片 id 计算的盐计算最终分数,以便具有相同值但存储在不同索引中的文档得到 不同的分数。
请注意,位于同一个分片内且具有相同字段值的文档将获得相同的分数,因此通常希望使用对所有文档具有唯一值的字段。 一个好的默认选择可能是使用 _seq_no 字段,其唯一的缺点是如果文档更新,分数会改变,因为更新操作也会更新 _seq_no 字段的值。
GET /_search
"query": {
"function_score": {
"random_score": {
"seed": 10,
"field": "_seq_no"
4、field_value_factor 字段值因子评分
field_value_factor 函数允许您使用文档中的字段来影响分数。 它类似于使用 script_score 函数,但是,它避免了脚本的开销。 如果用于多值字段,则在计算中仅使用该字段的第一个值。
举个例子,假设你有一个用数字 likes 字段索引的文档,并希望用这个字段影响文档的分数,一个这样做的例子看起来像:
GET /_search
"query": {
"function_score": {
"field_value_factor": {
"field": "likes",
"factor": 1.2,
"modifier": "sqrt",
"missing": 1
得分计算公式: sqrt(1.2 * doc['likes'].value)
参数说明:
field
要从文档中提取的字段。
factor
与字段值相乘的可选因子,默认为 1。
modifier
应用于字段值的计算修饰符, none, log, log1p, log2p, ln, ln1p, ln2p, square, sqrt, or reciprocal,默认 none.
missing
如果文档没有该字段,则使用的值。 修饰符和因子仍然适用于它,就好像它是从文档中读取的一样。
5、Decay functions 衰减函数
衰减函数使用一个函数对文档进行评分,该函数根据文档的数字字段值与用户给定原点的距离而衰减。 这类似于范围查询,但具有平滑的边缘而不是框。
要对具有数字字段的查询使用距离评分,用户必须为每个字段定义原点和比例。 需要原点来定义计算距离的“中心点”,以及定义衰减率的比例尺。
好吧,一脸懵逼,这里就不继续介绍了。
放一个示例,大家有兴趣可以参考官方文档继续研究下。
GET /_search
"query": {
"function_score": {
"functions": [
"gauss": {
"price": {
"origin": "0",
"scale": "20"
},
"gauss": {
"location": {
"origin": "11, 12",
"scale": "2km"
],
"query": {
"match": {
"properties": "balcony"
},
"score_mode": "multiply"
四、合并得分
GET /_search
"query": {
"function_score": {
"query": { "match_all": {} },
"boost": "5",
"functions": [
"filter": { "match": { "test": "bar" } },
"random_score": {},
"weight": 23
},
"filter": { "match": { "test": "cat" } },
"weight": 42
],
"max_boost": 42,
"score_mode": "max",
"boost_mode": "multiply",
"min_score" : 42
参数说明:
max_boost 可以通过设置 max_boost 参数将新分数限制为不超过某个限制。 max_boost 的默认值是 FLT_MAX。 min_score 默认情况下,修改分数不会更改匹配的文档。 要排除不满足某个分数阈值的文档,可以将 min_score 参数设置为所需的分数阈值。
参数 score_mode 指定如何组合计算的分数:
multiply 相乘 (default) sum 求和 avg 平均分 first 使用具有匹配过滤器的第一个函数的得分 max 使用最高分 min 使用最低分
boost_mode定义新计算的分数与查询的分数相结合。 具体选项:
multiply 查询得分和函数得分相乘,默认 replace 仅使用函数得分,查询得分被忽略 sum 查询得分和函数得分求和 avg 查询得分和函数得分取平均值 max 取查询得分和函数得分的最大值 min 取查询得分和函数得分的最小值
总结
本文主要介绍了ES中自定义评分函数function_score的使用场景以及各种评分函数的用法。
斗者_2013
关注
关注
点赞
27
收藏
打赏
评论
ES自定义评分机制:function_score查询详解
ES中的自定义评分机制function_score主要用于让用户自定义查询相关性得分,实现精细化控制评分的目的。在ES的常规查询中,只有参与了匹配查询的字段才会参与记录的相关性得分score的计算。但很多时候我们希望能根据搜索记录的热度、浏览量、评分高低等来计算相关性得分,提高用户体验。
复制链接
扫一扫
专栏目录
通过Function Score Query优化Elasticsearch搜索结果(综合排序)
王卫东 博客
11-28
2万+
在使用 Elasticsearch 进行全文搜索时,搜索结果默认会以文档的相关度进行排序,如果想要改变默认的排序规则,也可以通过sort指定一个或多个排序字段。
但是使用sort排序过于绝对,它会直接忽略掉文档本身的相关度(根本不会去计算)。在很多时候这样做的效果并不好,这时候就需要对多个字段进行综合评估,得出一个最终的排序。
function\_score
在 Elasticsear...
es修改排序_elasticsearch自定义评分与排序
weixin_29002935的博客
12-31
2826
自定义评分先看一个例子{"query": {"function_score":{"query":{"match": {"_all":"地板"}},"functions": [{"filter": {"range": { "editor_recommend_time": {"gt":0} }},"weight": 2},{"filter": {"range": { "recommend_time":...
评论 6
您还未登录,请先
登录
后发表或查看评论
elasticsearch-payload-scoring-function:用于有效负载功能的Elasticsearch插件用于function_score查询的评分插件
05-10
基于Elasticsearch有效负载分数的功能插件
Payload功能插件,用于Elasticsearch中的功能得分查询
有效负载值是从termVectors(如果启用)中获取的(这是更快的)或从反向索引中获取。
版本号
弹性搜索
插入
发布日期
1.7.0
1.7.0.0
2015年9月7日
样本用例
样本文件A (很多肉汁和非常辣)
"name": "chilli chicken",
"tasteTypes": [
"spicy|100",
"salty|10",
"gravy|100"
样本文件B
(很多肉汁肉汁不很辣)
"name": "Chicken with nuts",
"tasteTypes": [
"spicy|20",
"sweet",
"gravy
ElasticsearchRepository自定义方法实现查询es
最新发布
qq_41625866的博客
10-14
436
ElasticsearchRepository自定义方法实现查询es
关于ES中Function_Score在自定义打分中的应用
weixin_43266984的博客
01-07
1926
应用背景
现在有许多商品需要在商品列表中进行排序展示,排序要求使用ES并且尽量一次性查出来,有要求如下:
重点商品,收藏商品,优质商品,普通商品的顺序展出
在同一类商品发生冲突时,按照自主产品,非自主产品进行展出(是否自主产品是一个集合,只有集合里面有7才属于自主产品,没有7则属于非自主产品)
如果继续发生冲突 按照商品录入时间展出
最后用id来进行兜底
优质商品首先根据商品的等级来排序,然后才走第二行
ES中使用到的字。
id (商品的序列号),
create_time(创建商品时间) ,
one_h
elasticsearch搜索分数自定义以及相关度计算相关
qq_41214487的博客
07-30
2252
elasticsearch搜索分数自定义以及相关度计算相关
一、es通过其score字段对搜索结果进行排序
在进行业务开发时通常其默认的分数计算是不符合预期的。
最简单的方法是通过boost字段来对每一个字段进行权重设置,来体现该字段的重要性。
boost字段会导致分数的计算公式发生改变,boost默认为1
例如:
GET productinfo/_search
"_source": ["spuTitle","classifyName"],
"query": {
"bool": {
关于elasticsearch function_score的使用
nxgych的专栏
11-09
1万+
最近做新闻推荐系统,新闻搜索采用的是elasticsearch引擎,为了使推荐更接近用户偏好,搜索时使用了function_score功能对文档进行了重新打分,改变排序规则。以下介绍关于function score的一些用法。
The function_score allows
you to modify the score of documents that are retrie
ElasticSearch 自定义评分function_score
qq_35270686的博客
07-19
303
elasticsearch function_score
ElasticSearch - function_score详解
不见其长,日有所长
05-28
6143
1. 前言
在使用 Elasticsearch 进行全文搜索时,搜索结果默认会以文档的相关度进行排序,如果想要改变默认的排序规则,也可以通过sort指定一个或多个排序字段。但是使用sort排序过于绝对,它会直接忽略掉文档本身的相关度(根本不会去计算)。在很多时候这样做的效果并不好,这时候就需要对多个字段进行综合评估,得出一个最终的排序。Elasticsearch提供了function_score功能来满足我们的需求。
2. function_score简介
在使用ES进行全文搜索时,搜索结果默认会以文档的相
es function_score自定义计算得分函数;aggs聚合操作;贝叶斯平均
weixin_42357472的博客
11-09
1567
1、function_score
参考:https://segmentfault.com/a/1190000037700644
https://blog.csdn.net/lijingjingchn/article/details/106405577
function_score 查询 是用来控制评分过程的终极武器,它允许为每个与主查询匹配的文档应用一个函数,以达到改变甚至完全替换原始查询评分 _score 的目的。
*** 单个加强函数的查询模板
GET 127.0.0.1/mytest/doc/_sea
Elasticsearch实战(二十一)---ES相关度分数评分优化及FunctionScore 自定义相关度分数算法
流浪的喵的博客
08-13
721
ES Function score 自定义相关度分数算法的 实现逻辑根据自己的业务场景去定制自定义相关度分数算法
Elasticsearch复合查询—function_score查询
Chdaring的博客
11-19
697
function_score允许您修改通过查询检索的文档的分数。例如,如果一个分数函数的计算开销很大,并且它足以在一组经过筛选的文档上计算分数,那么这就很有用。
要使用function_score,用户必须定义一个查询和一个或多个函数,这些函数为查询返回的每个文档计算一个新分数。
function_score只能用于一个这样的函数:
"query": {
"function_score": {
"query": { "match_all": {} },
"boost"
function_score和一致性随机函数
epitomizelu的专栏
05-24
224
一,function_score
使用function score 来调整查询结果的算分,影响的是查询结果的顺序。
比如根据下面的配置,算分的计算方法:
新的算分=旧的算分+log(1 + factor*total_quantity)
GET kibana_sample_data_ecommerce/_search
"query": {
"function_score": {
"query": {
"multi_match": {
"query
Elasticsearch 定制评分(自定义评分)
hhhzua的专栏
07-06
1771
Elasticsearch 的相似度算法被定义为检索词频率/反向文档频率, TF/IDF 。
一. 相关概念:
检索词频率:tf
词 t 在文档 d 的词频( tf )是该词在文档中出现次数的平方根。
tf(t in d) = √frequency
检索词在该字段出现的频率?出现频率越高,相关性也越高。 字段中出现过 5 次要比只出现过 1 次的相关性高。
反向文档频率:idf
词 t 的逆向文档频率( idf )是:索引中文档数量除以所有包含该词的文档数,然后求其对数。
idf(t) = 1 +
es自定义分数
yhd723948277的博客
03-13
725
日后补充
java es score_ES 使用FunctionScore实现自定义评分
weixin_39928818的博客
02-26
875
GET /{index}/{type}/_search?explain{"query": {"function_score": {"query": {你的查询语句},"field_value_factor": {"field": "字段","modifier": "log1p","factor": 0.1},"boost_mode": "sum"}},"sort": {"_score": {"or...
ElasticSearch - function_score 简介
热门推荐
kucw的博客
07-04
1万+
function_score内容较多,此篇主要是对function_score内容做系统性的讲解,之后会出几篇实际应用的方法,参考以下链接
ElasticSearch - function_score (field_value_factor具体实例)
ElasticSearch - function_score (weight具体实例)
ElasticSearch - function_sc...
ElasticSearch - function_score (衰减函数 linear、exp、gauss 具体实例)
不见其长,日有所长
05-29
2758
阅读本文需要先了解function_score的相关知识,请看 ElasticSearch - function_score 详解
1. 前言
很多变量都可以影响用户对于酒店的选择,像是用户可能希望酒店离市中心近一点,但是如果价格足够便宜,也愿意为了省钱,妥协选择一个更远的住处。如果我们只是使用一个 filter 排除所有市中心方圆 100 米以外的酒店,再用一个filter排除每晚价格超过100元的酒店,这种作法太过强硬,可能有一间房在 500米,但是超级便宜一晚只要10元,用户可能会因此愿意妥协住这.
Function score查询的应用及源码解析
lucasma的博客
01-18
382
概念介绍
function_score查询可以在原有的查询结果算分的基础上,对每个文档计算一个新的算分,而计算的规则取决于应用的具体的funcion以及相关的一些选项。
看一个例子,
GET kibana_sample_data_ecommerce/_search?
"query": {
"function_score": {
"query": {
"match": {
"manufacturer": "Elitelligence"
使用es 自定义function score做排序
u014551778的博客
03-08
2839
如何初始化es客户端连接可以参考这个文章:
【es笔记三】Java Low Level REST Client_西瓜游侠的博客-CSDN博客_restclientbuilder
ElasticSearch6.5.0 【Java客户端之REST Client】_weixin_33704234的博客-CSDN博客
通过从文件中读取算分脚本以及参数,创建Script对象
Map<String, Object> params = new HashMap<>();
para...
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
©️2022 CSDN
皮肤主题:创作都市
设计师:CSDN官方博客
返回首页
斗者_2013
CSDN认证博客专家
CSDN认证企业博客
码龄10年
Java领域优质创作者
223
原创
416
周排名
800
总排名
190万+
访问
等级
1万+
积分
2万+
粉丝
1589
获赞
800
评论
3755
收藏
私信
关注
热门文章
nginx启动、重启、关闭
139917
java中的四舍五入——几种四舍五入的写法
56640
利用maven工具解决jar包冲突问题或重复加载问题
48667
win7FTP服务器配置以及访问
45004
工作8年的普通专科生程序员的一些感悟
43584
分类专栏
websocket系列
付费
13篇
跟着老万学mysql
16篇
跟着老万学redis
2篇
跟着老万学linux运维
14篇
spring boot实战
21篇
跟着老万学rabbitmq
6篇
spring cloud实战
25篇
跟着老万学OAuth2
2篇
跟着老万学docker
跟着老万学ELK
47篇
java基础
105篇
多线程
22篇
Maven
15篇
NIO
5篇
设计模式
12篇
Hadoop
34篇
数据库
34篇
WebService
3篇
Spring
29篇
分布式
2篇
程序人生
23篇
quartz
3篇
缓存框架
38篇
Mybatis
16篇
Nginx
10篇
dubbo
3篇
kafka
3篇
最新评论
Lombok实现原理解析
Jeremy_Lee123:
了解了,非常不错
websocket系列:基于netty-websocket-spring-boot-starter轻松实现高性能websocket
程序员的暴击:
报ws无法连接错误需要注入bean
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
websocket系列:基于netty-websocket-spring-boot-starter轻松实现高性能websocket
程序员的暴击:
很明显选netty的
mybatis-plus分页查询详解
xw_lover:
还关注?那铁定取关的
Mysql和ES数据同步方案汇总
Demo不是emo:
博主的文章写的太好了,对我帮助很大,希望博主也能来指点一下我的文章
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
Lombok实现原理解析
有序Map集合:LinkedHashMap和TreeMap该如何选用
Kibana开机启动配置
2022年37篇
2021年85篇
2020年33篇
2019年46篇
2017年13篇
2016年165篇
2015年145篇
2014年21篇
2013年1篇
目录
目录
分类专栏
websocket系列
付费
13篇
跟着老万学mysql
16篇
跟着老万学redis
2篇
跟着老万学linux运维
14篇
spring boot实战
21篇
跟着老万学rabbitmq
6篇
spring cloud实战
25篇
跟着老万学OAuth2
2篇
跟着老万学docker
跟着老万学ELK
47篇
java基础
105篇
多线程
22篇
Maven
15篇
NIO
5篇
设计模式
12篇
Hadoop
34篇
数据库
34篇
WebService
3篇
Spring
29篇
分布式
2篇
程序人生
23篇
quartz
3篇
缓存框架
38篇
Mybatis
16篇
Nginx
10篇
dubbo
3篇
kafka
3篇
目录
评论 6
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
打赏作者
斗者_2013
你的鼓励将是我创作的最大动力
¥2
¥4
¥6
¥10
¥20
输入1-500的整数
余额支付
(余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付
您的余额不足,请更换扫码支付或充值
打赏作者
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。
余额充值