ES系列之相似度模型

概述

ES作为一款搜索引擎,搜索结果如何排序,即什么条目或内容更靠前,是一个很核心的问题。排序通常是通过计算语料库中的文档和用户查询之间的相关性或相似度评分来进行。

相似性(得分/排名模型)定义匹配文档如何进行评分。相似性是针对字段的,意味着通过映射可以对每个字段定义不同的相似性模块。

ES有一个内置的相关性评分计算模块,称为相似度模块。ES 5之前,相似度模块一直使用TF-IDF作为它的默认相似度函数。后继版本使用BM25(它是TF-IDF的变更版本)作为默认的相似度函数。

除这两个外,ES支持以下相似度函数:

  • DFR
  • DFI
  • IB
  • LM Dirichlet
  • LM Jelinek Mercer
  • 脚本

算法/模型

布尔模型

BIR,看属性是否含有某词(term)。bool查询遵循越多命中越好原则,文档最终得分是should和must中每个子句的得分累加。filter和must_not属于过滤查询不贡献得分。

TF-IDF

即:词频/逆向文档频率,Term Frequency-Inverse Document Frequency的缩写,文本分析和NLP(自然语言处理)中常用于计算单词之间相似度的函数。TF-IDF通过将词频(Term Frequency)和反向文档频率(Inverse Document Frequency)相乘来工作。前者词频,是给定单词在文档中出现的次数。后者逆向文档频率,是对单词在语料库中的罕见程度进行评分的一种计算。单词越罕见,其得分就越高。

反向文档频率,或叫逆向文档频率,公式: l o g ( N d f ) log(\frac{N}{df}) log(dfN),其中N是语料库中的文档数,df是包含某个单词的文档数。某个单词在语料库中越罕见,其计算评分就越高。

TF-IDF公式: T F ∗ l o g ( N d f ) TF*log(\frac{N}{df}) TFlog(dfN),其中TF即为词频的缩写,某个单词在文档中出现的次数。

TF-IDF的问题:没有考虑文档的长度、词频并不饱和。

向量空间模型

向量空间模型,Vector Space Model,简称VSM,提供一种比较多词查询的方式,单个评分代表文档与查询的匹配程度。模型将文档和查询都以向量(vectors)的形式表示。因为向量之间是可以比较的,只要计算待查询向量和文档向量之间的角度就可以得到每个文档的相关度。

VSM里每个数字都代表一个词的权重,与TF/IDF计算方式类似。TF/IDF是VSM计算词权重的默认方式,但不是唯一方式。ES还有其他模型如Okapi-BM25。TF/IDF作为默认算法,因为它是个经检验过的简单又高效的算法,可以提供高质量的搜索结果。

constant_score查询

在constant_score查询中可包含查询或过滤,为任意一个匹配的文档指定评分1,忽略TF/IDF信息:

GET /_search
{"query": {"bool": {"should": [{"constant_score": {"boost": 2,"query": {"match": {"description": "wifi"}}}},{"constant_score": {"query": {"match": {"description": "wife"}}}}]}}
}

通过boost来配置权重值。最终的评分并不是所有匹配语句的简单求和, 协调因子(coordination factor)和查询归一化因子(query normalization factor)仍然会被考虑在内。

BM25

源自概率相关模型(probabilistic relevance model)

Okapi BM25,同样使用词频、逆向文档频率以及字段长归一化,其计算公式有点吓人:

l n ( 1 + d o c C o u n t − f ( q i ) + 0.5 f ( q i ) + 0.5 ) ∗ f ( q i , D ) f ( q i , D ) + k 1 ∗ ( 1 − b + b ∗ f i e l d L e n a v g F i e l d L e n ) ln(1+\frac{docCount-f(q_i)+0.5}{f(q_i)+0.5})*\frac{f(q_i, D)}{f(q_i, D)+k1*(1-b+b*\frac{fieldLen}{avgFieldLen})} ln(1+f(qi)+0.5docCountf(qi)+0.5)f(qi,D)+k1(1b+bavgFieldLenfieldLen)f(qi,D)

其中,k1默认为1.2,b默认为0.75。

BM25有一个比较好的特性就是它提供两个可调参数:

  • k1:控制词频结果在词频饱和度中的上升速度。值越小饱和度变化越快,值越大饱和度变化越慢
  • b:控制着字段长归一值所起的作用,b=0.0会禁用归一化,b=1.0启用完全归一化。

关于如何在markdown文档里添加数学公式,可参考MarkDown基础及表格、KaTeX公式、矩阵、流程图、UML图、甘特图语法。

实战

配置

大多数已经存在或自定义的相似性拥有配置选项,可以通过索引设置进行配置。当创建索引或更新索引设置时,可以提供索引选项:

"similarity": {"my_similarity": {"type": "DFR","basic_model": "g","after_effect": "l","normalization": "h2","normalization.h2.c": "3.0"}
}

然后需要在映射中引用自定义相似性模块:

{"book": {"properties": {"title": {"type": "string","similarity": "my_similarity"}}}
}

ES提供如下几个相似性模块:

  • 默认相似性模块基于TF/IDF模式,其他可用选项如下:
    discount_overlaps:决定重叠词元(词元的位置增量为0)是否要被忽略。默认为true,意味着重叠词元不会被统计。
    类型名:default。
  • BM25相似性模块:基于TF/IDF的相似性模块拥有内置的tf标准并且对短字段(如名字)效率更高。类型名:BM25。拥有下列参数:
    • k1:控制非线性索引词频率标准(饱和度)
    • b:控制文档长度标准化到tf值的程度
    • discount_overlaps:决定重叠词元(词元的位置增量为0)是否要被忽略。默认为true,意味着重叠词元不会被统计。
  • DFR相似性模块:实现随机性框架的分支。类型名:DFR。拥有下列参数:
    • basic_model:可选值:be、d、g、if、in、ine和p
    • after_effect:可选值:no、b和l
    • normalization:可选值:no、h1、h2、h3和z
  • IB相似性模块:基于信息的模式。算法基于设想,信息内容是任何通过基本元素的重复使用产生的符号分布序列。对于书面文本,这个方式会对比不同作者的写作风格。类型名:IB。拥有下面的选项:
    • distribution:可选值:ll和spl
    • lambda:可选值:df和ttf
    • normalization:和DFR相似模块相同
  • LM Dirichlet相似性模块:类型名LMDirichlet。拥有这些选项:mu:默认为2000。
  • LM Jelinek Mercer相似性模块:这个算法视图捕捉文本中的重要样品。类型名:LMJelinekMercer。拥有下面选项:lambda:最佳值取决于采集和查询。标题查询的最佳值大约是0.1,长查询的最佳值是0.7。当值接近于0,匹配更多查询索引词的文档会比匹配较少索引词的文档的排列位置更靠前。
  • 默认和基础相似性模块:默认情况下,ES会使用任何配置为default的相似性模块。然而,相似性方法queryNorm()coord()不是每个字段都会执行。因此,对于专家用户想要改变这两种方法的实现,不会更改default,可以用base名来配置相似性。然后,相似性会用于这两种方法。

可在elasticsearch.yml中添加如下配置,修改默认的相似性模块,此配置是对所有字段生效:

index.similarity.default.type: BM25

more_like_this

见名知意。先构建一个索引库包含title和desc两个字段:

PUT /search_data
{"mappings": {"properties": {"title": {"type": "text","term_vector": "yes"},"desc": {"type": "text"}}}
}

term_vector:term_vector为yes时会索引terms向量,加快相似度计算的速度;desc字段未配置term_vector也可以进行more_like_this查询的,但性能不佳。

查询语句:

GET /_search
{"query": {"more_like_this" : {"fields" : ["title", "desc"],"like" : "清明节春游踏青春季旅游学校春游亲子游企业郊游活动","min_term_freq" : 1,"max_query_terms" : 12}}
}

解释:

  • fields:要执行查询的字段,目前只支持text和term
  • like:要查询相似的文本,可以是文档id或者一个查询字句
  • min_term_freq:最小词频率,低于该频率的词将被忽略
  • max_query_terms:查询个数,提取like中文本term的TF-IDF值最大的几个,其余的词将被忽略

如果like文本太长,也可基于文章Id进行相似推荐:

GET /_search
{"query": {"more_like_this" : {"fields" : ["title", "desc"],"like" : [{"_index" : "search_data","_id" : "1"} ],"min_term_freq" : 1,"max_query_terms" : 12}}
}

like后面是数组,可配置多篇文章。_index对应的索引库也可以不是当前查询的索引库。

既然有like表示相似,不难猜到ES也会提高unlike字段表示不相似,用于排除有瑕疵的查询数据:

"unlike": [{"_index" : "search_data","_id" : "1270715"},"不应该出现的敏感数据"
],

其它可选参数

  • min_doc_freq:最小的文档频率,默认为5
  • max_doc_freq:最大文档频率
  • min_word_length:单词最小长度
  • max_word_length:单词最大长度
  • stop_words:停用词列表
  • analyzer:分词器
  • minimum_should_match:文档应该匹配的最小单词数量,默认为query分词后词项的30%
  • boost_terms:词项权重
  • include:是否把输入文档作为结果返回
  • boost:整个query的权重,默认为1.0

进阶

explain

ES提供explain API可以查看用于评分计算的每个值,以及它所使用的公式。结果有个boost参数,可以增加或减少相应单词的评分。boost有两种类型:索引时boost(index-time boost)(已弃用)和查询时boost(query-time boost)。

分片

如果查询只使用带有1个分片的索引,则评分结果是一致且可预测的。不同的分片设置会影响ES中的评分计算。当ES计算一个文档的评分时,它只能访问这个分片中的其他文档。公式中IDF和avgLen的值在不同分片之间是不一样。

可使用?search_type=dfs_query_then_fetch告诉ES在计算评分之前从每个分片中检索所需的值,不过这会显著降低搜索速度。

参考

  • ES内容相似性推荐

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/359.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#基于SSE传递消息给Vue前端实现即时单向通讯

一、简述 通常前端调用后端的API,调用到了,等待执行完,拿到返回的数据,进行渲染,流程就完事了。如果想要即时怎么办?如果你想问什么场景非要即时通讯,那可就很多了,比如在线聊天、实…

libwebsockets 简介

文章目录 1. 前言2. libwebsockets 的 编译 和 使用2.1 编译2.2 使用2.2.1 构建运行上下文2.2.2 事件处理循环 3. websocket 协议 1. 前言 限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承诺。 2. libwebsockets…

EASERVER管理密码忘记的处理方式

一个多年的老客户,EASERVER的管理员密码忘记了,查了一些资料,把它重置了,做个记录 This is a really quick tip on how to reset password for the administrator id “jagadmin” used in EA Server. We use this id for everyt…

Java 笔记 01:Java 概述,MarkDown 常用语法整理

一、前言 记录时间 [2024-04-18] 昨天整理完 Docker 基础后略微思索了一下,还是决定把 Java 捡起来,系统地学习一遍,参考的学习课程是狂神说 Java 零基础,真诚感激此系列视频对笔者的帮助。 零基础可以学 Java 吗?只要…

JVS低代码平台表单引擎:字符串拼接与逻辑函数的完美结合

字符串拼接使用逻辑函数配置 示例场景:通过按钮触发逻辑使用函数将两个日期字段组合为范围时间类型。 选择开始日期和结束日期后,点击【合并】按钮自动处理回显至起止日期字段。在【合并】按钮上设置逻辑。 注意:这里【起止日期】组件是数组…

【web开发02】后端开发Maven

后端开发Maven 1 Maven是什么?1.1 Maven基础概念1.1.2 仓库1.1.3 坐标 2 配置maven环境3 创建maven项目4 导入maven项目4 依赖管理4.1 依赖配置4.2 依赖传递4.2.1 排除依赖 4.3 依赖范围4.4 生命周期4.4.1 运行生命周期 1 Maven是什么? Maven本质是项目…

无梯度计算模式

无梯度计算模式是指在进行优化、求解或模型训练时,不依赖于目标函数或其相关组件(如损失函数、约束函数等)的梯度信息来指导搜索或更新过程的方法。这种模式适用于以下几种情况: 梯度不可用或难以计算: 目标函数可能包…

android和java 线程Tread

1。线程的生命周期。 可以分为创建,就绪,运行,阻塞,死亡 5个状态。 1.1 创建 new :当程序new了一个线程后,线程就处于新建状态,这时候他和其他 java对象一样,被java虚拟机分配了内存,但没有线程的特性。 …

idea 切换分支后 Project目录树小消失

idea 切换分支后 Project目录树小消失 生气了 生气了 若代码已经保存提交,直接删除本地项目,重新拉取。

二次元AI绘画生成器免费:教你生成精美图片

二次元AI绘画生成器,无疑是现代技术与艺术完美结合的典范。这些工具不仅将复杂的绘画过程简化,更让每一个艺术爱好者的创意得以充分展现。这些生成器能够精准捕捉大家的创意精髓,将其转化为细腻、独特的二次元画作。无论是角色设计、场景描绘…

SpringMVC(五)【拦截器】

前言 今天来把 SpringMVC 最后一部分学完,虽然课时很短,但是学起来还是很慢的,不过确收获很大。不得不感慨学大数据确实有必要把 SSM、SpringBoot 等各种 JavaEE 技术好好学一学,收获很大,尽管我们到现在 Java 代码写了…

Redis几种常见的应用方式

1.登录认证 redis最常见的应用就是,登录认证把。再首次登录返回给前端token,把用户名和登录状态缓存到redis一段时间,每次其他请求进来过滤器那这token解析出来的用户名或其他关键的key值,再redis里面查询缓存,有则直…

【算法】二分查找

快乐的流畅:个人主页 个人专栏:《算法神殿》《数据结构世界》《进击的C》 远方有一堆篝火,在为久候之人燃烧! 文章目录 引言一、二分查找二、查找元素的第一个和最后一个位置三、x的平方根四、搜索插入位置五、山脉数组的峰顶索引…

【Leetcode每日一题】 分治 - 排序数组(难度⭐⭐)(60)

1. 题目解析 题目链接:912. 排序数组 这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。 2.算法原理 算法思路: 快速排序作为一种经典的排序算法,其核心思想在于通过“分而治之”的策略&#xff…

eCongnition 根据栅格类别图分类分割结果

目录 1、导入标签文件 2、根据栅格类别计算对象类别 3、导出栅格计算的类别 1、导入标签文件 导入栅格类别文件Label.tif 参考:eCongnition 对图像进行多尺度分割-CSDN博客 2、根据栅格类别计算对象类别 对类别栅格创建 mode[Maximum] 特征,该特征…

SQL Serve---嵌套查询

定义 嵌套查询:主要用于复杂的查询中。在SQL语言中,一个Select From Where语句称为一个查询块,将一个查询块嵌套在另一个查询的Where子句或Having短语中的查询称为嵌套查询。 子查询的类型 使用别名的子查询 使用IN和NOT IN的子查询 使用比较…

Java基础之循环控制语句、函数、数组

Java基础 1.循环控制语句: break、continue public static void main(String[] args) {/*TODO 循环控制语句 - break需要和 for 以及 while 循环搭配使用 当在循环中执行了 break语句 那么就可以退出当前循环*/int sum 0;for (int i 1; i < 1000; i) {sum i;if (i >…

基于SSM的列车订票管理系统(含源码+sql+视频导入教程+文档+PPT)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSM的列车订票管理系统3拥有两种角色&#xff1b;管理员、用户 管理员&#xff1a;用户管理、车票管理、购票指南管理、系统管理等 用户&#xff1a;发布帖子、登录注册、购票等 1.…

数据结构速成--串

由于是速成专题&#xff0c;因此内容不会十分全面&#xff0c;只会涵盖考试重点&#xff0c;各学校课程要求不同 &#xff0c;大家可以按照考纲复习&#xff0c;不全面的内容&#xff0c;可以看一下小编主页数据结构初阶的内容&#xff0c;找到对应专题详细学习一下。 目录 …

【Linux冯诺依曼体系结构】

目录 1.冯诺依曼体系结构原理 1.冯诺依曼体系结构 我们常见的计算机&#xff0c;如笔记本。我们不常见的计算机&#xff0c;如服务器&#xff0c;大部分都遵守冯诺依曼体系。 截至目前&#xff0c;我们所认识的计算机&#xff0c;都是有一个个的硬件组件组成 输入单元&#…