文章目录

  • 1.ES相关性评分应用
  • 2.ES相关性评分算法
    • 2.1.TF-IDF算法
    • 2.2.EM25算法
  • 3.ES评分权重提升
    • 3.1.boost参数的使用
    • 3.2.布尔组合查询
    • 3.3.自定义打分函数

1.ES相关性评分应用

全文检索与数据库查询的一个显著区别是它并不一定会根据查询条件做完全精确的匹配,在全文检索出的结果展示出来前,还会进行一次相关性评分并按评分降序排列,将那些与查询条件相关性高的文档排在最前面返回。

相关度是指两个事物间相互关联的程度,在检索领域特指检索请求与检索结果之间的相关程度。在ES中返回的每一条结果中都会包含一个_score字段,这个字段的值就是当前文档匹配检索请求的相关性评分。

// 请求
POST /users/_doc
{"name":"arong","age":22,"city":"shenzhen","favor":"唱跳、Rap、篮球、写代码"
}GET /users/_search
{"query": {"match": {"favor":{"analyzer": "ik_max_word","query": "写代码"}}}
}// 返回结果
{"took" : 1,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 3,"relation" : "eq"},"max_score" : 0.13353139,"hits" : [{"_index" : "users","_type" : "_doc","_id" : "td7UGH4BuhepqELSpQdP","_score" : 0.13353139,"_source" : {"name" : "彭博荣","age" : 22,"city" : "shenzhen","favor" : "唱跳、Rap、篮球、写代码"}}]}

ES中相关性评分的应用很广泛,最常见的应用就是搜索引擎中,将最相关的链接展示在最前面,其次还有一些应用:

  • 推荐系统中的用户最爱:每个用户的喜好不一致,对喜好字段设置更高权重,由ES打分并推荐最相关商品文档
  • 风控系统中的团伙挖掘:对团伙各相关字段(手机号相同、地址相同等)设置权重,并由ES打分获取最相关的团伙文档
  • 实时日志检索:基于ELK架构,以关键字作为评分依据,搜索最相关日志文档

2.ES相关性评分算法

ES中的相关性评分算法主要为TF-IDF及EM25算法,在ES 5.0之前使用的都是TF/IDF算法,在之后采用的是EM25算法。

2.1.TF-IDF算法

TF-IDF算法(Term Frequency-Inverse Document Frequency)是文本分析和自然语言处理中常用于计算单词之间相似度的函数。

TF-IDF 通过将词频(Term Frequency)和反向文档频率(Inverse Document Frequency)相乘来工作。词频,是给定单词在文档中出现的次数。后者逆向文档频率,是对单词在语料库中的罕见程度进行评分的一种计算。单词越罕见,其得分就越高。

所以TF-IDF算法的思想就是,关键词在给定文档中出现的次数越高、全体文档中出现的次数越低时,该关键词在给定文档的评分就越高:

  1. 局部常见:该单词在文档中多次出现
  2. 全局罕见:该单词在语料库中出现的次数并不多

TF-IDF计算公式为:

  • TF:关键字在指定文档中的词频
  • N:所有文档数量
  • df:包含了关键字的文档数量

可以看到词频越大,或df越小时,TF-IDF的计算值会越大。

TF-IDF为什么不只依赖于词频,还要依赖于反向文档频率呢?

  • 文档长度影响:词频越高不代表越相关,比如A文档只有10个词并命中了1个关键字,而B文档有100个词并命中了5个关键字,此时A文档词频是更高的,但是不一定A文档比B文档更相关
  • 常见词影响:如果只看文档的局部词频,那么常见词的影响会很大,并且搜索出来的结果也并不一定相关

所以综合文档长度影响和常见词影响,不只需要考虑文档局部词频,还需要综合考虑该关键字在全部文档中出现次数,以获取更相关的评分。

2.2.EM25算法

在 ES5.0 版本之前其实一直都是使用TF-IDF来计算相似度评分,但由于下面的这些缺陷,它后来转而使用BM25:

  • 未考虑文档长度影响:1000个词的文档含有10个关键词,比10个词的文档含有1个词,相似度并不一定更高,因为文档越长所含的关键字也会更多
  • 未考虑词频饱和度:词频饱和度指的是当词频超过一定数量之后,它对相关度的影响将趋于饱和。换句话说,词频10次的相关度比词频1次的分值要大很多,但100次与10次之间差距就不会那么明显了

基于上述两个原因,ES 5.0之后采用了BM25算法作为默认的相似度评分算法,BM25算法实际上也借鉴了TF-IDF算法的思想,随着词频的变大和逆向文档频率的变小,相似度会变大,但是不同之处在于考虑了文档长度影响以及词频饱和度,BM25的计算式基于贝叶斯定律推导,是一种概率评分模型,实际上可描述为 IDF * TF:

  • docCount:文档数量
  • f(q):含有关键字的文档数量
  • f(q,D):当前文档词频
  • k1:词频饱和度控制
  • b:文档长度归一化控制
  • filedLen:当前文档词大小
  • avgFieldLen:平均文档词大小

BM25词频饱和度控制
在BM25算法中,控制词频饱和度的参数是k1,默认值为1.2,参数k1的值越小词频对相关度的影响就会越快趋于饱和,而值越大词频饱和度变化越慢。

BM25长度归一化控制
长度归一化控制也就是文档长度控制,引入了b作为控制因子,使用当前文档长度及平均文档长度的比值来归一化文档长度的影响,当当前文档长度大于平均文档长度时则整体得分会被惩罚。b=0则不开启长度归一化,b=1则完全开启长度归一化, b默认=0.75。

3.ES评分权重提升

3.1.boost参数的使用

在一些情况下需要将某些字段的相关度权重提升,以增加这些字段对检索结果相关性评分的影响。比如,同时使用对文章标题title字段和文章内容content字段做检索,title字段在相关性评分中的权重应该比content字段高一些,这时就可以将title字段的相关度评分权重提高。

可以在执行检索时动态指定boost参数来提升字段的权重,boost参数的默认值为1,一般的使用形式为boost:value 或 field^value:

// 提升单个字段的权重"match": {"description": {"query": "elasticsearch","boost": 2.5}}// 对于跨越多个字段的查询,如multi_match,用户可以指定整个multi_match的权重
"multi_match": {"query": "elasticsearh","fields": ["name","description"],"boost": 2.5
}

比如要提升name的权重为2,而description的权重保持1,那么可以使用field^boost的方式:

"multi_match": {"query": "elasticsearch","fields": ["name^2",                               "description"]
}

3.2.布尔组合查询

ES中最常用的组合查询为bool组合查询,bool组合查询可用的布尔类型子句包括must、filter、should和must_not四种,它们接收参数值的类型为数组来实现组合查询机制。

使用这些布尔子句可以组合出更复杂的查询,比如需要查询favor字段包含"写代码"的文档,并且city字段如果包含"guangzhou"那么将city字段权重设置为2,可以这么实现:

GET /users/_search
{"query": {"bool": {"should": [{"term": {"city": {"value": "guangzhou","boost": 2}}}],"must": [{"match": {"favor": {"analyzer": "ik_max_word","query": "写代码"}}}]}}
}

3.3.自定义打分函数

function_score查询提供了一组计算查询结果相关度的不同函数,通过为查询条件定义不同打分函数实现文档检索相关性的自定义打分机制。一个function_score自定义打分的结构如图:

  • query:和普通的查询条件格式一致,即文档的查询条件,得到的打分为query_score
  • functions:数组格式,定义多个打分函数,打分函数有如下:
    • weight : 加权打分
    • random_score : 随机打分
    • field_value_factor : 使用字段的数值参与计算分数
    • decay_function : 衰减函数 gauss, linear, exp 等
    • script_score : 自定义脚本
  • score_mode:在所有评分函数的运算结果中取它们的乘积、和、平均值、首个值、最大值和最小值打分为func_score
    • multiply、sum、avg、first、max、min
  • boost_mode:将query_score和func_score结合为最后的文档打分结果result_score,可选的为乘积、和、平均值、替换值、最大值和最小值
    • multiply : 相乘(默认),result_score = query_score * function_score
    • replace : 替换,result_score = function_score
    • sum : 相加,result_score = query_score + function_score
    • avg : 取两者的平均值,result_score = avg(query_score, function_score)
    • max : 取两者之中的最大值,result_score = max(query_score, function_score)
    • min : 取两者之中的最小值,result_score = min(query_score, function_score)

ElasticSearch:相关性评分原理及应用相关推荐

  1. 【Elasticsearch】Elasticsearch自定义评分的N种方法

    1.概述 首先参考文章:[Elasticsearch]Elasticsearch 相关度评分 TF&IDF 然后转载文章:实战 | Elasticsearch自定义评分的N种方法 2.三个问题 ...

  2. music算法_Elasticsearch系列---相关性评分算法及正排索引

    概要 上一篇中多次提到了按相关性评分,本篇我们就来简单了解一下相关性评分的算法,以及正排索引排序的优势. 评分算法 Elasticsearch进行全文搜索时,Boolean Model是匹配的基础,先 ...

  3. ElasticSearch 相关性

    1.相关性 ElasticSearch检索结果是按照相关性倒序排列的,相关性是什么,相关性又是如何计算的?每个文档都有相关性评分,用一个正浮点数字段 _score 来表示 . _score 的评分越高 ...

  4. ElasticSearch简介及ElasticSearch部署、原理和使用介绍

    ElasticSearch简介及ElasticSearch部署.原理和使用介绍 第一章:elasticsearch简介 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式 ...

  5. Elasticsearch分布式一致性原理剖析(一)-节点篇

    2019独角兽企业重金招聘Python工程师标准>>> 摘要: ES目前是最流行的开源分布式搜索引擎系统,其使用Lucene作为单机存储引擎并提供强大的搜索查询能力.学习其搜索原理, ...

  6. Elasticsearch分布式一致性原理剖析(三)-Data篇

    前言 "Elasticsearch分布式一致性原理剖析"系列将会对Elasticsearch的分布式一致性原理进行详细的剖析,介绍其实现方式.原理以及其存在的问题等(基于6.2版本 ...

  7. python 相关性分析原理及代码详细介绍

    一.相关性分析简介 相关性分析(correlation analysis)是指对两个或多个具备相关关系的变量进行线性相关分析,从而衡量变量间的相关程度或密切程度.相关性程度即为相关性系数R,R的取值范 ...

  8. ElasticSearch底层实现原理

    ElasticSearch底层实现原理 正向索引 在搜索引擎中每个文件都对应一个文件ID,文件内容被表示为一系列关键词的集合(实际上在搜索引擎索引库中,关键词也已经转换为关键词ID).例如" ...

  9. 二级C语言上机考试评分标准,浅谈二级C语言上机考试评分原理

    浅谈二级C语言上机考试评分原理 C语言的表现能力和处理能力极强.它不仅具有丰富的运算符和数据类型,便于实现各类复杂的数据结构.下面是小编整理的关于二级C语言上机考试评分原理,希望大家认真阅读! 上机考 ...

  10. Elasticsearch 分布式架构原理

    前言 前面介绍了很多ES使用过程中的具体实战知识点,本文主要是谈谈ES分布式架构原理. 一.Elasticsearch特点 elasticsearch是近实时的分布式搜索分析引擎,底层实现基于Luce ...

最新文章

  1. 中国互联网+固体饮料行业商业模式创新与投资机会深度研究报告
  2. VS2013打包VC++程序
  3. SAP CRM Fiori 应用 My Opportunity应用点击Edit后出现time out的错误分析
  4. vue.jsr入门_JSR 365更新:深入CDI 2.0
  5. js判断移动端,pc端,安卓,苹果浏览器的方法
  6. 计算凸多边形面积的算法
  7. [dp]leetcode 198. House Robber
  8. java编程50_java经典50编程题(1-10)
  9. Node.js: 如何退出node命令或者node server
  10. 抖音国际版TikTok因收集儿童信息在美被罚570万美元
  11. 越是爱折腾的人就越容易成功
  12. git 本地库的使用
  13. 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。(C++实现)
  14. Linux文件系统的正确挂载方式
  15. VS报错——无法打开文件XXX.lib
  16. access mysql连接字符串_access 数据库连接字符串
  17. mysql 笛卡尔积
  18. 高一计算机算法教案,高中算法与程序设计教案
  19. 基本粒子群算法matlab 程序
  20. 夜曲编程python_夜曲编程免费PC版-夜曲编程电脑版下载 v1.0.0--PC6电脑版

热门文章

  1. 2.1.17 设置字符间距
  2. 华为血压表WATCH D测量血压的数据可靠吗
  3. svchost.exe程序下载解决方法或者在360中看到svchost.exe占网速
  4. 计算机给文件重命名快捷键,计算机中文件重命名快捷键是什么
  5. 类型多样的电子数码免抠元素素材,速来收藏
  6. 2020年医美行业网络关注度分析报告
  7. 互联网dmz区_idc是什么行业(idc区和dmz区)
  8. 2021年中国彩电行业发展现状分析,零售量首度跌破4000万大关,行业迎来艰难时刻「图」
  9. 从血红细胞衰老看中老年疑难病和亚健康--
  10. 冒泡排序(Bubble Sort)含gif动图