ElasticSearch相关度评分算法 elasticsearch打分
yuyutoo 2024-10-28 20:21 1 浏览 0 评论
01 TF&IDF概念
TF
Term frequency:搜索文本中的各个词条在field文本中出现了多少次,出现次数越多,就越相关
term在一个doc中出现的次数,出现的次数越多,分数越高
IDF
Inverse document frequencry:搜索文本中的各个词条出现了多少次,出现的次数越多,越不相关
term在所有的doc中出现的次数,出现的次数越多,分数越低
length Norm
term搜索的那个Field的长度,长度越长,相关度越低,分数越低;长度越短,分数越高
最后结合TF,IDF,length Norm综合评分,得到该term对doc的最终分数
如何计算score
GET /website/article/1/_explain{ "query": { "match": { "title": "title" } }}
{ "_index" : "website", "_type" : "article", "_id" : "1", "matched" : true, "explanation" : { "value" : 0.2876821, "description" : "weight(title:title in 0) [PerFieldSimilarity], result of:", "details" : [ { "value" : 0.2876821, "description" : "score(doc=0,freq=1.0 = termFreq=1.0\n), product of:", "details" : [ { "value" : 0.2876821, "description" : "idf, computed as log(1 + (docCount - docFreq + 0.5) / (docFreq + 0.5)) from:", "details" : [ { "value" : 1.0, "description" : "docFreq", "details" : [ ] }, { "value" : 1.0, "description" : "docCount", "details" : [ ] } ] }, { "value" : 1.0, "description" : "tfNorm, computed as (freq * (k1 + 1)) / (freq + k1 * (1 - b + b * fieldLength / avgFieldLength)) from:", "details" : [ { "value" : 1.0, "description" : "termFreq=1.0", "details" : [ ] }, { "value" : 1.2, "description" : "parameter k1", "details" : [ ] }, { "value" : 0.75, "description" : "parameter b", "details" : [ ] }, { "value" : 2.0, "description" : "avgFieldLength", "details" : [ ] }, { "value" : 2.0, "description" : "fieldLength", "details" : [ ] } ] } ] } ] }}
02 boolean model (过滤模型)
即先过滤包含单个term进行分词后的doc,该步骤是不进行计算分数的,得到true/false
其目的是为了减少计算的数据量,提升性能
03 向量空间模型
TF/IDF是对单个term在doc中的分数计算
但当进行多个关键词匹配的时候,其实doc最终只有一个分数,那么这个分数的计算是通过向量空间模型得出的
向量空间模型:多个term对一个doc的分数
es会根据多个关键词对应的所有doc评分情况,计算出一个query vector(向量)
举例来讲,比如要搜索“hello world”这个term,那么es会给每个doc,拿每个term计算出一个分数,比如说hello 有一个分数为2,world有一个分数为5,然后再拿所有term的分数组成一个doc vector,然后取每个doc vector对query vector的弧度,给出每个doc对多个term的总分数
04 lucene的相关度分数算法
1.lucence practical scoring function
practical scoring function:计算一个query对一个doc的分数公式
score(q,d) = ? queryNorm(q) ? .coord(q,d) ? .Σ(
?? tf(t in d)
?? .idf(t)2
?? .t.getBoot()
?? . norm(t,d)
? ) ( t in q)
score(q,d)
这个公式的最终结果:一个query(q),对一个doc(d)的最终总评分
queryNorm(q)
用来让一个doc的分数处于一个合理的区间
queryNorm=1/sumOfSquaredWeights的平方根:即对所有term的IDF求和,然后平方根,最后再被除1,得到的分数会很小
sumOfSquaredWeights:所有term的IDF分数之和
coord(q,d)
对更加匹配的doc,进行一些分数上的成倍奖励
例如
Document 1 with hello -> score:1.5
Document 2 with hello world -> score:3.0
Document 3 with hello world java -> score:4.5
Document 1 with hello -> score:1.5*1/3 = 0.5
Document 2 with hello world-> score:3.0*2/3 = 2.0
Document 3 with hello world java-> score:4.5*3/3 = 4.5
把计算出来的总分数*匹配到的query数量/总query数量
Σ( t in q)
query中每个term对doc的分数,进行求和;多个term对一个doc的分数,组成一个空间向量,然后进行计算
比如query=hello world,那么就是对hello相对应的doc分数,world相对应的doc分数求和
tf( t in d)
计算每一个term对doc的分数,其实就是TF/IDF算法
idf(t)2
计算term对所有doc的分数,IDF算法
t.getBoost()
自定义控制查询的权重
norm(t,d)
就是term匹配到的field的长度,长度越长,分数越低
05 四种相关度评分优化方法
1.query time boost
query的时候指定boost
GET /forum/article/_search{ "query": { "bool": { "should": [ {"match": { "sub_title": { "query": "learn", "boost": 10 } }}, { "match": { "content": "java spark" } } ] } }}
2.重构查询结果
GET /forum/article/_search{ "query": { "bool": { "should": [ {"term": { "content": { "value": "java" } }}, { "term": { "content": { "value": "spark" } } }, { "term": { "content": { "value": "hadoop" } } }, { "term": { "content": { "value": "elasticsearch" } } } ] } }}
3.negative boost
negative的doc,会乘以negative_boost,这样分数会降低
GET /forum/article/_search{ "query": { "boosting": { "positive": { "match": { "content": "java" } }, "negative": { "match": { "content": "spark" --不会排除spark内容,但是会将spark的分数降低 } }, "negative_boost": 0.2 } }}
4.constant_score
不需要相关度分数,直接使用constant_score,所有的doc score都是1
GET /forum/article/_search{ "query": { "constant_score": { "filter": { "term": { "content": "java" } } } }}
06 自定义function_score函数
自己将某个field的值,跟es内置算出来的分数进行运算,然后由自己指定的field来进行分数的增强
1.新增字段
POST /forum/article/_bulk{"update":{"_id":1}}{"doc":{"follower_num":50}}{"update":{"_id":2}}{"doc":{"follower":"30"}}{"update":{"_id":3}}{"doc":{"follower":40}}{"update":{"_id":4}}{"doc":{"follower":100}}{"update":{"_id":5}}{"doc":{"follower":60}}
2.自定义分数查询
GET /forum/article/_search{ "query": { "function_score": { "query": { "multi_match": { "query": "java spark elasticsearch hadoop", "fields": ["content","tag"] } }, "field_value_factor": { "field": "follower_num", "modifier": "log1p", "factor": 3 }, "boost_mode": "sum", "max_boost": 10 } }}
field
默认情况下每个doc的分数会和field的值进行相乘
modifier:
当doc分数与field相乘后,得到的分数分布可能不均衡,此时使用modifier,指定函数
log1p:公式 newscore = oldscore * log(1+numberofvotes)
将field的值+1取log后,然后与doc的分数进行相乘得到新的分数
factor:
进一步影响分数,计算公式为: newscore = oldscore * log(1+ factor * numberofvotes)
控制与field的值,可以影响权重
boost_mode:
可以决定分数与指定字段的值如何进行计算,默认是相乘(multiply)
sum,min,max,replace,multiply
max_boost:
限制计算出来的分数不要超过max_boost指定的值,这个参数影响作用不大
相关推荐
- MySQL5.5+配置主从同步并结合ThinkPHP5设置分布式数据库
-
前言:本文章是在同处局域网内的两台windows电脑,且MySQL是5.5以上版本下进行的一主多从同步配置,并且使用的是集成环境工具PHPStudy为例。最后就是ThinkPHP5的分布式的连接,读写...
- thinkphp5多语言怎么切换(thinkphp5.1视频教程)
-
thinkphp5多语言进行切换的步骤:第一步,在配置文件中开启多语言配置。第二步,创建多语言目录。相关推荐:《ThinkPHP教程》第三步,编写语言包。视图代码:控制器代码:效果如下:以上就是thi...
- 基于 ThinkPHP5 + Bootstrap 的后台开发框架 FastAdmin
-
FastAdmin是一款基于ThinkPHP5+Bootstrap的极速后台开发框架。主要特性基于Auth验证的权限管理系统支持无限级父子级权限继承,父级的管理员可任意增删改子级管理员及权限设置支持单...
- Thinkphp5.0 框架实现控制器向视图view赋值及视图view取值操作示
-
本文实例讲述了Thinkphp5.0框架实现控制器向视图view赋值及视图view取值操作。分享给大家供大家参考,具体如下:Thinkphp5.0控制器向视图view的赋值方式一(使用fetch()方...
- thinkphp5实现简单评论回复功能(php评论回复功能源码下载)
-
由于之前写评论回复都是使用第三方插件:畅言所以也就没什么动手,现在证号在开发一个小的项目,所以就自己动手写评论回复,没写过还真不知道评论回复功能听着简单,但仔细研究起来却无法自拔,由于用户量少,所以...
- ThinkPHP框架——实现定时任务,定时更新、清理数据
-
大家好,我是小蜗牛,今天给大家分享一下,如何用ThinkPHP5.1.*版本实现定时任务,例如凌晨12点更新数据、每隔10秒检测过期会员、每隔几分钟发送请求保证ip的活性等本次分享,主要用到一个名为E...
- BeyongCms系统基于ThinkPHP5.1框架的轻量级内容管理系统
-
BeyongCms内容管理系统(简称BeyongCms)BeyongCms系统基于ThinkPHP5.1框架的轻量级内容管理系统,适用于企业Cms,个人站长等,针对移动App、小程序优化;提供完善简...
- YimaoAdminv3企业建站系统,使用 thinkphp5.1.27 + mysql 开发
-
介绍YimaoAdminv3.0.0企业建站系统,使用thinkphp5.1.27+mysql开发。php要求5.6以上版本,推荐使用5.6,7.0,7.1,扩展(curl,...
- ThinkAdmin-V5开发笔记(thinkpad做开发)
-
前言为了快速开发一款小程序管理后台,在众多的php开源后台中,最终选择了基于thinkphp5的,轻量级的thinkadmin系统,进行二次开发。该系统支持php7。文档地址ThinkAdmin-V5...
- thinkphp5.0.9预处理导致的sql注入复现与详细分析
-
复现先搭建thinkphp5.0.9环境...
- thinkphp5出现500错误怎么办(thinkphp页面错误)
-
thinkphp5出现500错误,如下图所示:相关推荐:《ThinkPHP教程》require():open_basedirrestrictionineffect.File(/home/ww...
- Thinkphp5.0极速搭建restful风格接口层
-
下面是基于ThinkPHPV5.0RC4框架,以restful风格完成的新闻查询(get)、新闻增加(post)、新闻修改(put)、新闻删除(delete)等server接口层。1、下载Thin...
- 基于ThinkPHP5.1.34 LTS开发的快速开发框架DolphinPHP
-
DophinPHP(海豚PHP)是一个基于ThinkPHP5.1.34LTS开发的一套开源PHP快速开发框架,DophinPHP秉承极简、极速、极致的开发理念,为开发集成了基于数据-角色的权限管理机...
- ThinkPHP5.*远程代码执行高危漏洞手工与升级修复解决方法
-
漏洞描述由于ThinkPHP5框架对控制器名没有进行足够的安全检测,导致在没有开启强制路由的情况下,黑客构造特定的请求,可直接GetWebShell。漏洞评级严重影响版本ThinkPHP5.0系列...
- Thinkphp5代码执行学习(thinkphp 教程)
-
Thinkphp5代码执行学习缓存类RCE版本5.0.0<=ThinkPHP5<=5.0.10Tp框架搭建环境搭建测试payload...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- MySQL5.5+配置主从同步并结合ThinkPHP5设置分布式数据库
- thinkphp5多语言怎么切换(thinkphp5.1视频教程)
- 基于 ThinkPHP5 + Bootstrap 的后台开发框架 FastAdmin
- Thinkphp5.0 框架实现控制器向视图view赋值及视图view取值操作示
- thinkphp5实现简单评论回复功能(php评论回复功能源码下载)
- ThinkPHP框架——实现定时任务,定时更新、清理数据
- BeyongCms系统基于ThinkPHP5.1框架的轻量级内容管理系统
- YimaoAdminv3企业建站系统,使用 thinkphp5.1.27 + mysql 开发
- ThinkAdmin-V5开发笔记(thinkpad做开发)
- thinkphp5.0.9预处理导致的sql注入复现与详细分析
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)