Elasticsearch:使用 Elasticsearch 提高网站搜索查询的相关性

news/2024/5/13 16:25:40/文章来源:https://elasticstack.blog.csdn.net/article/details/125286477

当你希望向用户提供满足其要求的相关数据时,相关性至关重要。这是任何企业的关键功能。吸引受众的一个好的营销策略是通过向他们提供他们正在搜索的内容来满足客户的需求。

糟糕的搜索可能会导致你平台上的流量明显减少。这是因为用户已经接受过培训,可以期待类似于 Google 搜索的结果,这并不容易获得,但是使用 Elasticsearch,你可以通过调整搜索结果的多个因素来实现它。

在 Elasticsearch 中评分

Elasticsearch 使用评分系统对显示给用户的查询结果进行过滤和排名。评分是基于与搜索查询和其他应用配置的字段匹配完成的,我们将在本文后面讨论。Elasticsearch 计算文档的分数并将其用作相关因素来对文档进行排序。分数越高意味着文档的相关性越高。查询中的每个子句都会影响文档的分数。

实用评分功能

由于 Elasticsearch 是基于 Lucene 库构建的,因此计算相关性分数时,Elasticsearch 使用 Lucene 的 Practical Scoring Function。这将布尔模型、词频 (TF)、逆文档频率 (IDF) 和向量空间模型用于多词查询,并将它们组合起来以组装匹配的文档并随时对它们进行评分。

例如,一个多词查询就像:

PUT /my_index/_doc/1
{"text": "The quick brown fox jumps over the lazy dog"
}GET /my_index/_search
{"query": {"match": {"text": "quick fox"}}
}

上面的查询在内部被重写为:

GET /my_index/_search
{"query": {"bool": {"should": [{"term": { "text": "quick" }},{"term": { "text": "fox"   }}]}}
}

当文档与查询匹配时,Lucene 通过组合每个匹配词的得分来计算得分。 该评分计算由实际评分功能完成。

score(q,d)  =  queryNorm(q)  · coord(q,d)    · ∑ (           tf(t in d)   · idf(t)²      · t.getBoost() · norm(t,d)    ) (t in q) 

解释如下:

  • score(q,d) 是文档 d 对查询 q 的相关性得分。
  • queryNorm(q) 是查询规范化因子。
  • coord(q,d) 是协调因子。
  • 文档 d 的查询 q 中每个术语 t 的权重总和。
    • tf(t in d) 是文档 d 中术语 t 的术语频率。
    • idf(t) 是术语 t 的逆文档频率。
    • t.getBoost() 是已应用于查询的提升。
    • norm(t,d) 是字段长度范数,结合索引时间字段级提升(如果有)。

现在,让我们来熟悉构成实用评分函数的每个评分机制:

  • 词频 (Term frequency - tf):查找词在文档字段中出现的次数并返回它的平方根:
tf = sqrt(termFreq)

计算词频背后的想法是,词在文档中出现的时间越多,文档的相关性就越高。

  • 逆文档频率 (Inverse document frequency - idf):
idf = 1 + ln(maxDocs/(docFreq + 1))

 一个常见的术语,例如:“the”,几乎出现在所有文档中,应该被认为不如包含在较少文档中的其他术语重要。 这就是计算逆文档频率的原因。

  • 协调(Coordination - coord):计算查询中出现在文档中的术语数。 使用协调机制,如果我们有 3 个术语查询并且文档包含其中 2 个术语,那么它的得分将高于只有其中 1 个术语的文档。
  • 字段长度归一化(norm):这是字段中术语数的平方根的倒数
norm = 1/sqrt(numFieldTerms)

对于字段长度归一化,包含较少数量的术语并且查询术语被认为比包含更多术语以及搜索术语的文档更相关的文档。

  • Query normalization (queryNorm):这通常是查询中术语的平方权重之和。 这样做是为了比较不同的查询。
  • Index boost:这是一个百分比或绝对数字,用于在索引时提升任何字段。 请注意,在实践中,索引提升与字段长度归一化相结合,以便在索引中仅存储一个数字; 但是,Elasticsearch 强烈建议不要使用索引级别的提升,因为这种机制会产生许多不利影响。
  • Query boost:这是一个百分比或绝对数字,可用于在查询时提升任何查询子句。 查询提升允许我们指出查询的某些部分应该比其他部分更重要。

Explain API

现在我们知道了 elasticsearch 的实用评分功能是如何工作的。 在继续之前,让我们先谈谈我们将用于调试 Elasticsearch 中任何查询的分数的一个重要工具——“explain”。

为了说明问题方便,我们再追加一个文档:

PUT my_index/_doc/2
{"text": "a quick running horse"
}

Explain API 返回有关特定文档为何匹配(或不匹配)查询的信息。 例如 :

GET my_index/_search?filter_path=**.hits
{"query": {"match": {"text": "quick"}},"explain": true,"fields": ["text"]
}

上面的命令返回如下的结果:

{"hits" : {"hits" : [{"_shard" : "[my_index][0]","_node" : "ACcSMYOXRpSYHLYylHOg0g","_index" : "my_index","_id" : "2","_score" : 0.21636502,"_source" : {"text" : "a quick running horse"},"fields" : {"text" : ["a quick running horse"]},"_explanation" : {"value" : 0.21636502,"description" : "weight(text:quick in 0) [PerFieldSimilarity], result of:","details" : [{"value" : 0.21636502,"description" : "score(freq=1.0), computed as boost * idf * tf from:","details" : [{"value" : 2.2,"description" : "boost","details" : [ ]},{"value" : 0.18232156,"description" : "idf, computed as log(1 + (N - n + 0.5) / (n + 0.5)) from:","details" : [{"value" : 2,"description" : "n, number of documents containing term","details" : [ ]},{"value" : 2,"description" : "N, total number of documents with field","details" : [ ]}]},{"value" : 0.53941905,"description" : "tf, computed as freq / (freq + k1 * (1 - b + b * dl / avgdl)) from:","details" : [{"value" : 1.0,"description" : "freq, occurrences of term within document","details" : [ ]},{"value" : 1.2,"description" : "k1, term saturation parameter","details" : [ ]},{"value" : 0.75,"description" : "b, length normalization parameter","details" : [ ]},{"value" : 4.0,"description" : "dl, length of field", // ”text“ 字段的长度 a quick running horse, 共4个单词  "details" : [ ]},{"value" : 6.5,"description" : "avgdl, average length of field", // 两个文档的长度的平均值 (9+4)/2 = 6.5"details" : [ ]}]}]}]}},{"_shard" : "[my_index][0]","_node" : "ACcSMYOXRpSYHLYylHOg0g","_index" : "my_index","_id" : "1","_score" : 0.15753466,"_source" : {"text" : "The quick brown fox jumps over the lazy dog"},"fields" : {"text" : ["The quick brown fox jumps over the lazy dog"]},"_explanation" : {"value" : 0.15753466,"description" : "weight(text:quick in 0) [PerFieldSimilarity], result of:","details" : [{"value" : 0.15753466,"description" : "score(freq=1.0), computed as boost * idf * tf from:","details" : [{"value" : 2.2,"description" : "boost","details" : [ ]},{"value" : 0.18232156,"description" : "idf, computed as log(1 + (N - n + 0.5) / (n + 0.5)) from:","details" : [{"value" : 2,"description" : "n, number of documents containing term","details" : [ ]},{"value" : 2,"description" : "N, total number of documents with field","details" : [ ]}]},{"value" : 0.39274925,"description" : "tf, computed as freq / (freq + k1 * (1 - b + b * dl / avgdl)) from:","details" : [{"value" : 1.0,"description" : "freq, occurrences of term within document","details" : [ ]},{"value" : 1.2,"description" : "k1, term saturation parameter","details" : [ ]},{"value" : 0.75,"description" : "b, length normalization parameter","details" : [ ]},{"value" : 9.0,"description" : "dl, length of field","details" : [ ]},{"value" : 6.5,"description" : "avgdl, average length of field","details" : [ ]}]}]}]}}]}
}

如你所见,这是如何对查询的所有因素进行评分的详细视图。 因此,“explain”API 可以帮助了解文档是否与搜索查询匹配。

影响相关性的因素

现在让我们看看其他有助于我们调整相关性的因素。

Boosting

可以提升字段以提高相关性分数,从而在特定场景中获得最相关的文档。 考虑一个博客网站示例,你希望标题与搜索查询匹配,而不是正文与查询匹配。 对于这样的场景,提升领域可以发挥重要作用。

提升可以在索引时和查询时进行。 请参见下面的示例:

索引时间提升:

PUT blog-index
{"mappings": {"properties": {"title": {"type": "text","boost": 2 },"body": {"type": "text"}}}
}

查询时间提升:

POST blog-index/_search
{"query": {"match": {"title": {"query": "quick brown fox","boost": 2}}}
}

在这两种情况下,当查询与标题字段匹配时,分数将比正文字段的分数高一倍。

由于以下原因,通常不建议在索引时提升:

  • 要更改索引时的提升值(boost value),需要重新索引所有文档,而你可以在查询时更改提升值以满足所需的相关性。
  • 索引时提升作为归一化的一部分存储,只有一个字节。 这会降低字段长度归一化因子的分辨率,从而导致相关性计算质量降低。

同义词

在你希望多个单词在相同的上下文并搜索到相同的文档的情况下,设置同义词可能很有用。 例如,当用户搜索术语 [‘water’, ‘rain’, ‘ocean’ ] 时,你希望它们具有与查询结果相同的文档集,因为它们在你的案例中具有相同的含义。

与 boosting 类似,同义词可以在索引时或查询时完成。 让我们找出差异:

  • 索引时同义词会产生更大的索引,因为必须对所有同义词进行索引,而查询时同义词对索引大小没有影响。
  • 依赖于术语统计的搜索评分可能会受到影响,因为同义词也被计算在内,并且在索引时同义词期间不太常见单词的统计信息会出现偏差,但在查询时间,语料库中的术语统计信息保持不变。
  • 针对索引时完成的同义词,如果需要改变同义词规则,我们需要重新索引(reindex),而查询时构建的情况就不需要。

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

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

相关文章

高度定制的WSS网站-DCC文档管理系统

1个月前我提及过新的Share Point Portal2003定制开发项目,现在项目基本上七七八八了.该有的都有了,主要的功能如下: 1.控制到目录层级而不是文档库层次,并且基于群组进行授权管理; 2&#xff0e…

大型互联网网站架构心得[转]

我们知道,对于一个大型网站来说,可伸缩性是非常重要的,怎么样在纵向和横向有良好的可伸缩性,就需要在做架构设计的时候考虑到一个分的原则,我想在多个方面说一下怎么分:首先是横向的分:1. 大的网…

机器学习(七)-基于KNN分类的约会网站配对改进算法

基于KNN分类的约会网站配对改进算法1 项目介绍2 准备数据:从文本文件中解析数据3 分析数据:使用 Matplotlib 创建散点图4 准备数据:归一化数值4 实施 kNN 算法5 测试算法:作为完整程序验证分类器6 使用算法:构建完整可用的预测系统完整代码1 项目介绍 某APP用户一直使用在线约…

推荐一个类似于国内知乎国外网站-Quora

好像是在知乎上随意浏览时中看到Quora这个社区的,模糊的记得知主当时给的评价是Quora上有很多大咖,职业遍布各个领域,对一些问题的看法比较新颖,还可以这么说,足不出户就可以感受到贴切的英语环境。抱着好奇的心里就登…

分享45个海量免费电子书下载网站

随着网络和信息技术的快速发展,电子书越来越流行。以Amazon Kindle为代表的电子书阅读器的出现改变了人们传统的阅读方式,如同iPod改变人们听音乐一样。如今,很多网上书店也推出了电子书商品,相比传统的纸质书,电子书便…

使用Trie树实现网站对用户输入的敏感词打码

使用Trie树实现网站对用户输入的敏感词打码 什么是Trie树? Trie树,又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串&…

从HTML到XHTML--使用Web标准建设网站 《转》

转自http://ysearchblog.cn/2006/08/htmlxhtmlweb_1.html 从HTML到XHTML--使用Web标准建设网站(一) 作者:张克军 用户体验部 小编按:最近看到搜索日志上有不少朋友对雅虎的网页设计模式感兴趣,我们的设计师张克军也不禁手痒,和大家…

Three.js_环境的搭建_搭建本地官方网站

Three.js – JavaScript 3D Library 去官网下载 Three.js引擎的包 下载 VSCode 代码编辑器 Download Visual Studio Code - Mac, Linux, Windows 安装好后导入 下载好的 three.js 的引擎包 安装本地官网 VSCode里右键"在集成终端中打开" 输入 指令 npm install …

QuickWAP 2005让WAP网站拥有更好的兼容性

QuickWAP 2005让WAP网站拥有更好的兼容性 很多利用WML或ASPWML编写的WAP程序是必须利用手机或手机模拟器去浏览的,即使有些站点做了适配,也不过是利用调转指令将用户引导到其它网页而已。另一种兼容性的方法如双模网站,即一套站点同时做WAP和…

简体中文化的 Slax-ChineseOptimized

上次说到安装Slax后不直接支持中文,也有几个Linux喜爱者"辩驳"了下,说我没有去细致的研究,确实,像我这样在MS平台上用的比较多的一下子也没有那么多时间去研究,所以只有先直接拿来用了 Slax-Chi…

ASP.NET MVC3书店--第十节 为网站导航与局部设计做最后的修改(转)

http://blog.sina.com.cn/s/blog_6ad539a90100rc4n.html现在我们已经完成了这个网站中的主要功能。但我们还需要为整个网站的导航,首页与书籍列表页面做一点最终的修改。 10.1 创建购物摘要分部视图 首先,我们想要在整个网站中显示用户购物车中的书籍…

11个超炫的视差滚动网站欣赏

目前这种视差滚动效果被越来越多的国内外网站所应用,成为网页设计的热点趋势。 通过一个很长的网页页面,其中利用一些令人惊叹的插图 和图形,并使用视差滚动(Parallax Scrolling)效果,让多层背景以不同的速…

Avast!:小型网站最易遭受的3种黑客攻击

avast是捷克研发的杀毒软件,从网站上找到一篇avast关于网站安全的文章,觉得颇有意思,因此想到翻译过来与大家共享。有不对之处还望大家批评指正。 一个拥有上万访问者的小型网站管理员发来一份信,向我描述了他的遭遇,我…

Photoshop 爱好者应该收藏的42个网站

Photoshop 是 Adobe 公司旗下最为出名的图像处理软件之一,集图像扫描、编辑修改、图像制作、广告创意,图像输入与输出于一体的图形图像处理软件。今天,本文与大家分享42个非常有用的 Photoshop 设计教程和素材资源网站,希望能帮助…

DNN快速入门教程3 - 如何创建DotNetNuke网站

这个入门系列已经停了很长时间了,没有完成的原因是我有太多的东西想写但是自己又没有一个明确的主线。经过最近blog,和QQ群的反馈我突然意识到,这个入门系列就是要帮助大家从零开始完成一个自己的DNN5网站,不需要太过深入&#xf…

(转)SharePoint 2010的网站主题

从SharePoint 2003开始,主题就作为一种自定义SharePoint外观的重要选项。SharePoint 2003和2007中的包括一系列开箱即用的主题,可以被网站所有者通过SharePoint UI应用到SharePoint网站。网页设计师和开发人员可以创建包含自定义图片及CSS文件的自定义主…

自己动手搞定支付宝手机Wap网站支付接口 FOR ECShop

支付宝WAP网站版本的支付接口网上整合的比较少,看到很多网站在卖,顿觉无语。 主要是得自己查看支付宝官方提供的SDK中的开发文档。 支付宝sdk下载地址:https://doc.open.alipay.com/doc2/detail?treeId60&articleId103564&docType1 …

优秀网页设计:25个精美的旅游网站设计示例

旅游公司和旅行社的网站通常都会搭配非常有吸引力的精美照片,目的是为了突出视觉吸引力,获取更多的潜在客户。这篇文章向大家分享的25个精美的国外旅游网站设计作品,你可以从这些优秀的网站作品中学习大照片在网页背景中的应用以及制作出多彩…

大型网站系统架构分析

千万级的注册用户,千万级的帖子,nTB级的附件,还有巨大的日访问量,大型网站采用什么系统架构保证性能和稳定性? 首先讨论一下大型网站需要注意和考虑的问题。 数据库海量数据处理:负载量不大的情况下select、…

百度搜索引擎优化指南3.0_「百度SEO」百度推出的针对网站优化指南有哪些?第二篇...

一、面向搜索引擎的网站建设。搜索引擎只是网站上一个普通的访客,对网站的抓取方式、对网站/网页的价值判断,也都是从用户的角度出发的,任何对用户体验的改进,都是对搜索引擎改进。对搜索引擎的优化,同时也会让用户受益…