控制相关度(Controlling Relevance)
对于仅处理结构化数据(比如日期,数值和字符枚举值)的数据库,它们只需要检查一份文档(在关系数据库中是一行)是否匹配查询即可。
尽管布尔类型的YES|NO匹配也是全文搜索的一个必要组成,它们本身是不够的。我们还需要知道每份文档和查询之间的相关程度。全文搜索引擎不仅要找到匹配的文档,还需要根据相关度对它们进行排序。
全文搜索相关度的公式,或者被称为相似度算法,将多个因素综合起来为没份文档产生一个相关度_score。在本章中,我们来讨论一下其中的一些变化的部分以及如何控制它们。
当然相关度并不只和全文查询相关;它也许会将结构化数据考虑在内。我们可能在寻找一个拥有某些卖点(空调,海景,免费的WiFi)的度假旅店。那么当某个 度假旅店拥有的卖点越多,那么它也就越相关。或者我们希望除全文搜索本身的相关度外,同时将时间的远近,价格,流行度或者距离这类因素也考虑在内。
以上这些设想都是可以实现的,得益于ES中强大的分值计算功能。
我们首先会从理论角度来看看Lucene是如何计算相关度的,然后从实际的例子出发来讨论一下如何来控制该过程。
相关度分值计算背后的理论
Lucene(也就是ES)使用了布尔模型(Boolean Model)来寻找匹配的文档,以及一个被称为Prarical Scoring Function的公式来计算相关度。该公式借用了词条频度/倒排文档频度以及向量空间模型的概念,同时也增加了一些更现代的特性比如Coordination Factor,字段长度归约,以及词条/查询子句提升。
NOTE
不要害怕!这些概念并不像它们的名字那般复杂。尽管在这一节中提到了算法,公式以及数学模型,它们的作用也只不过是方便人类理解。理解算法本身并不比理解它们对结果的影响更重要。
布尔模型(Boolean Model)
布尔模型简单地应用查询中的AND,OR以及NOT条件来寻找所有匹配的文档。下面的查询:
full AND text AND search AND (elasticsearch OR lucene)
会只包括含有所有full,text,search词条,以及词条elasticsearch或者lucene之一的文档。
这个过程是简单且迅速的。它用来排除那些不会匹配查询的文档。
词条频度/倒排文档频度(TF/IDF)
一旦我们拥有了匹配文档的列表,我们就需要对它们进行相关度排序。并不是所有的文档都会包含所有的词条,而一部分词条也比另一部分的词条更加重要。整个文档的相关度分值取决于(部分)出现在文档中的每个查询词条的权重。
一个词条的权重通过三个因素决定,这在什么是相关度中已经介绍过了。对该公式的介绍是为了兴趣,你不需要记住它们。
词条频度(Term Frequency)
词条在当前文档中出现的有多频繁?越频繁的话,那么权重就越高。在一个字段中出现了5次的词条应该比只出现了1次的文档更加相关。词条频度通过下面的公式进行计算:
tf(t in d) = √frequency
词条t在文档d中的词条频度tf,是该词条在文档中出现次数的平方根。
如果你不在乎一个词条在一个字段中的出现频度,相反你在意的是词条是否出现过,那么你可以在字段映射中禁用词条频度:
PUT /my_index
{
"mappings": {
"doc": {
"properties": {
"text": {
"type": "string",
"index_options": "docs"
}
}
}
}
}
将index_options设置为docs会禁用词条频度以及词条位置信息。使用了该设置的字段不会记录词条出现的次数,也不能被用在短语或者邻近度查询中。精确值的not_analyzed字符串字段默认使用该设置。
倒排文档频度(Inverse Document Frequency)
词条在所有的文档中出现的频繁吗?出现的越频繁,权重就越低。像and或者the这样的常见词条对相关度的贡献几乎没有,因为它们在绝大多数的文档中都会 出现,而像elastic或者hippopotamus这样的罕见词条则能够帮助找到我们最感兴趣的文档。倒排文档频度的计算方法如下:
idf(t) = 1 + log ( numDocs / (docFreq + 1))
对于词条t的倒排文档频度(idf),通过将索引中的文档数量除以含有该词条的文档数量,再取其对数得到。
字段长度归约(Field-length Norm)
字段的有多长?字段越短,那么其权重就越高。如果一个词条出现在较短的字段,如title字段中,那么该字段的内容相比更长的body字段而言,更有可能是关于该词条的。字段长度归约的计算方法如下:
norm(d) = 1 / √numTerms
尽管字段长度归约对于全文搜索而言是重要的,也有许多其它字段不需要。无论文档是否含有该字段,对于索引中每份文档的每个字符串字段,归约大概需消耗1个 字节的空间。对于精确值的not_analyzed字符串字段,归约功能默认是被禁用的,但是你也可以对analyzed类型的字段通过字段映射禁用归 约:
PUT /my_index
{
"mappings": {
"doc": {
"properties": {
"text": {
"type": "string",
"norms": { "enabled": false }
}
}
}
}
}
在以上的例子中,该字段不会将字段长度归约考虑在内。这就意味着字段的长度不再被相关度计算考虑在内。
对于日志记录这种用例,归约是没有多大用处的。你在意的只是某个特定错误代码或者某个浏览器标识码是否出现在了某个字段中。字段的长度不会对结果造成影响。禁用归约功能也可以省下相当的内存空间。
结合起来
以上的三个因素 - 词条频度,倒排文档频度以及字段长度规范 - 都是在索引期间被计算和保存的。它们被用来计算单个词条对于某一份文档的权重。
TIP
我们前面讨论的文档,实际上是在讨论文档中的字段。每个字段都有它自己的倒排索引,因此对于TF/IDF而言,字段的值和文档的值是等效的。
当我们将explain设置为true(参考理解分值(Understanding the Score)),然后再运行简单的term查询时,你会发现参与到分值计算过程中的因素就是我们前面讨论的那些:
PUT /my_index/doc/1
{ "text" : "quick brown fox" }
GET /my_index/doc/_search?explain
{
"query": {
"term": {
"text": "fox"
}
}
}
前面的请求得到的解释(有省略)如下所示:
weight(text:fox in 0) [PerFieldSimilarity]: 0.15342641 result of: fieldWeight in 0 0.15342641 product of: tf(freq=1.0), with freq of 1: 1.0 idf(docFreq=1, maxDocs=1): 0.30685282 fieldNorm(doc=0): 0.5
第一行:对于Lucene内部文档ID为0的文档,词条fox在其text字段中的最终分值。 第五行 - 第七行:词条频度,倒排文档频度以及字段长度归约得到的结果。
当然,查询通常都会由不止一个词条组成,因此我们需要一种将多个词条的权重联系起来的方法。为此我们可以求助向量空间模型(Vector Space Model)。
向量空间模型
向量空间模型提供了一种多词条查询的比较方法。它的输出是一个代表了文档和查询之间匹配程度的分值。为了计算该分值,文档和查询都被表示成向量。
一个向量实际上就是一个包含了数值的一维数组,比如:
[1,2,5,22,3,8]
在向量空间模型中,向量中的每个数值都是由TF/IDF计算得到的一个词条的权重。
TIP
尽管TF/IDF是在向量空间模型中默认被用来计算词条权重的方法,它并不是唯一可用的方法。在ES中,其它诸如Okapi-BM25的计算模型也是可用的。TF/IDF由于其简洁性,高效性,产生的搜索结果的高质量而经受了时间的考验,从而被当做是默认方法。
假设我们查询了"happy hippopotamus"。一个像happy这样的常见单词的权重是较低的,然而像hippopotamus这样的罕见单词则拥有较高的权重。假设 happy的权重为2而hippopotamus的权重为5。我们可以使用坐标来表达这个简单的二维向量 - [2, 5] - 一条从坐标(0, 0)到坐标(2, 5)的直线,如下所示:
现在,假设我们有三份文档:
- I am happy in summer.
- After Christmas I’m a hippopotamus.
- The happy hippopotamus helped Harry.
我们可以为每份文档创建一个类似的向量,它由每个查询词条的权重组成 - 也就是出现在文档中的词条happy和hippopotamus,然后将它绘制在坐标中,如下图:
- 文档1:(happy,____________) — [2,0]
- 文档2:( ___ ,hippopotamus) — [0,5]
- 文档3:(happy,hippopotamus) — [2,5]
向量的一个很棒的性质是它们能够被比较。通过测量查询向量和文档向量间的角度,我们可以给每份文档计算一个相关度分值。文档1和查询之间的角度较大,因此它的相关度较低。文档2和查询更靠近,所以它的相关度更高,而文档3和查询之间则是一个完美的匹配。
TIP
实际上,只有二维向量(使用两个词条的查询)才能够被简单地表示在坐标中。幸运的是,线性代数 - 数学的一个分支,能够处理向量 - 提供了用来比较多维向量间角度的工具,这意味着我们能够使用上述原理对包含很多词条的查询进行处理。
你可以获得关于使用余弦相似性来比较两个向量的更多信息:http://en.wikipedia.org/wiki/Cosine_similarity
我们已经讨论了分值计算的理论基础,现在让我们看看Lucene是如何进行分值计算的。
http://blog.csdn.net/dm_vincent/article/details/42099063
相关推荐
- **百分比计算**:介绍如何进行百分比相关的计算。 - **指数与根号计算**:教授用户如何进行指数和开方运算。 #### 七、进阶功能 - **质因数分解**:解释了如何将一个数字分解为多个质数相乘的形式。 - **函数计算...
根据提供的文件信息,我们可以深入探讨fx-570ES PLUS与fx-991ES PLUS这两款计算器的相关功能和操作指南。以下是对标题、描述、标签以及部分内容中的关键知识点进行的详细解读: ### 一、产品简介 **fx-570ES PLUS*...
通过F-DO冗余和诊断功能的组合,可以改善硬件故障裕度(HFT)和安全故障分数(SFF)。 #### 七、总结 综上所述,西门子的F-DO安全数字量输出模块6ES7326-2BF10-0AB0通过其“保持上次有效值”的功能,不仅可以满足...
4. **搜索匹配**: Lucene通过倒排索引找到包含查询术语的文档,并计算每个文档的相关度分数,如TF-IDF(词频-逆文档频率)。 5. **结果排序**: 搜索结果根据相关度分数进行排序,高分文档优先展示。 6. **结果获取...
在对JavaScript实现全文搜索相关度评分功能的探讨中,Okapi BM25算法是核心知识点。全文搜索是Web开发中经常遇到的需求,用户输入关键词后,系统应当能够提供与之相关的结果。在早期阶段,我们可能会用简单的SQL语句...
《ES高手进阶篇part1》是一系列关于Elasticsearch(ES)高级应用的教程,主要涵盖了一系列深度探秘搜索技术和结构化搜索方法。通过这些视频教程,学习者可以深入理解ES的高级特性,提高在实际项目中的搜索引擎优化...
- 默认按时间排序,禁用相关度分值计算,简化查询逻辑。 - 使用最新ES版本,持续跟进社区优化成果。 总结,ES在华为电信软件运维中的应用展示了其在大规模日志管理和分析领域的强大能力。通过定制化的日志采集、...
- **异常原理及规律性研究**:探讨不同异常模式背后的原理及其规律性,包括n次模式的意义、乱点模式的研究、显存控制原理、标准乱点模式的研究以及关于不稳定字符的研究。 这些异常模式和现象不仅提供了对计算器...
7. **相关度得分**:Elasticsearch会计算每个匹配文档的相关度分数,可以通过修改查询语句来调整这些分数。例如,使用 `boost` 参数提高某些条件的权重。 8. **高亮查询**:用于突出显示搜索结果中与查询匹配的部分...
3. **评分(Scoring)**: Lucene使用TF-IDF(Term Frequency-Inverse Document Frequency)算法来计算每个文档的相关度分数。 4. **排序与返回结果(Sorting and Retrieving Results)**: 根据评分排序,返回最高...
- **搜索匹配(Scoring)**:Lucene根据文档中匹配术语的数量、位置、频率等因素计算相关度分数,用于排序搜索结果。 - **Top-K检索**:Lucene返回评分最高的K个文档作为搜索结果。 4. 工具应用 - **Luke**:这...
此外,还有分数计算、游戏状态管理(如游戏结束、新游戏开始)等逻辑。 六、资源管理 游戏中的图像、音频等资源需要有效管理,以确保加载速度和内存占用。可能涉及到的包括纹理 atlasing(将多个小纹理合并到一个大...
5. 自动评分:系统根据学生提交的答案自动计算分数,对于客观题(如选择题、判断题)可以轻松实现,主观题可能需要结合AI算法(如自然语言处理NLP)进行部分自动批阅。 6. 成绩展示与分析:系统应提供成绩查询功能...
**全文搜索-Lucene** Lucene 是一个开源的全文搜索引擎库,由 Apache 软件基金会维护。...同时,通过结合 Solr 和 Elasticsearch 等工具,可以进一步扩展 Lucene 的功能,适应大规模数据和分布式环境。
8. **ScoreDoc**:评分结果,包含文档ID和相关度分数。 **四、高级特性** 1. **多字段搜索**:支持对文档的不同字段进行搜索。 2. **模糊搜索**:支持通配符、短语和近似搜索。 3. **排序与高亮**:可以根据相关度...
- 游戏逻辑:编写游戏规则,如分数计算、敌人行为等。 5. **基于Android的移动公交查询系统设计与实现**: - 位置服务:利用GPS和网络定位技术获取用户位置。 - 公交路线和时刻表:集成公交数据API,获取公交...
"PlaneWar"这个项目名称暗示了我们可能正在处理一个简单的空战游戏,其中玩家控制一架飞机进行战斗。以下是一些相关的知识点,涵盖了从基础到进阶的Android游戏开发内容: 1. **Android Studio和游戏开发环境**:...
7. **分布式搜索**:随着数据量的增长,NetLucene还可以通过Solr或Elasticsearch等工具实现分布式搜索,将索引分布到多台机器上,以提升系统的可扩展性和搜索性能。 8. **其他功能**:NetLucene还包含了丰富的文本...
这款游戏中,玩家可以通过触摸屏控制下落的方块,将其排列在屏幕底部,以消除整行获得分数。下面将详细介绍这款游戏的设计原理、操作方式以及相关技术实现。 一、游戏基本原理 俄罗斯方块的基本元素是各种形状的...
NetPromoterScore(NPS)是一种衡量客户忠诚度和满意度的指标,它通过询问客户“在0到10的范围内,你有多可能推荐我们的产品或服务给朋友或同事?”来评估企业的绩效。NPS的核心理念是,那些给出9或10分的客户被称为...