ES搜索框架--基本原理
一、基本原理
1.工作原理
Elasticsearch的工作方式是将数据存储为文档(document)的形式,在检索时通过对文档的搜索,将结果以相关性排序后返回给用户。在Elasticsearch中,文档以文档类型(type)为单位,一个索引(index)可以包含多个类型。
2.查询方式
Elasticsearch中的查询主要有两种:查询(query)和过滤(filter)。查询是指按照关键词进行搜索,并按照相关性进行排序,过滤是指根据某些条件进行过滤,并不进行排序。这两种查询可以组合在一起使用,从而达到更复杂的查询目的。
3.查询评分方式
在Elasticsearch中,查询的评分规则主要基于两个因素:文档中的关键词出现的频率和位置。文档中出现次数越多、出现位置越靠前的关键词,其相关性就越高,评分也就越高。评分的计算方式是基于TF-IDF算法,即词频-逆文档频率算法。
在Elasticsearch的评分规则中,评分(score)计算是基于查询的相关性得分。相关性得分(relevance score)取决于查询的内容、文档的内容和文档的评分规则。具体的评分规则包括以下三个因素:
(1)词频因素:如果查询中的某个术语在文档中出现多次,则该文档的得分将比其他文档更高。
(2)逆文档频率因素:如果查询中的某个术语在整个索引中出现较少,则该文档的得分将更高。
(3)字段长度因素:如果查询中的术语在文档的一个短字段中出现,则该文档的得分将比出现在长字段中的文档更高。
4.自定义评分规则
在Elasticsearch中,用户可以自定义查询评分规则,来实现更细致、个性化的搜索结果。用户可以通过以下几种方式来实现自定义评分规则:
(1)直接在查询语句中指定评分规则:用户可以在查询语句中指定评分规则的具体细节,比如权重(weight)、模糊度等等。
(2)自定义评分插件:用户可以自己编写评分插件,根据自己的需要为每个文档指定一个特定的评分值。
(3)使用Function Score Query:Function Score Query是Elasticsearch提供的一个查询类型,它允许用户通过指定一系列计算函数来自定义评分规则。例如,可以将出版日期越近的与作者名单匹配的文章评分更高。
Elasticsearch是一种功能强大的全文本搜索引擎,具有高度可定制性和可伸缩性。了解Elasticsearch的查询评分规则和自定义评分规则可以提高搜索结果的质量。同时,通过硬件升级、分片和副本、预热缓存和定时清理来提高检索速度,可以使Elasticsearch在大数据搜索和分析中,发挥出更卓越的性能。
参考博客(非常详细):https://blog.csdn.net/weixin_43111776/article/details/124952148
我们先来看看MySQL中的索引,在MySQL关系表中,每一行数据都有一个主键,我们在查询数据的时候会先找到数据的主键,再根据主键去找到整行数据,这种索引形式成为正排索引,本质是通过key来查询value。而ES使用的倒排索引正好与之相反,是通过对value进行分词,然后根据关键词通过value去查询key。
在搜索引擎中,每个文档都有一个对应的文档 ID,文档内容被表示为一系列关键词的集合。例如,文档 1 经过分词,提取了 20 个关键词,每个关键词都会记录它在文档中出现的次数和出现位置。那么,倒排索引就是关键词到文档 ID 的映射,每个关键词都对应着一系列的文件,这些文件中都出现了关键词。
这样就可以得到ES的评分过程:
查询:搜索内容分词--对词语查找它在哪些文档中出现过--计算某个文档中这个词语的评分--某个文档中出现的所有分词评分之和即为此文档的评分--根据评分输出结果列表
过滤:对词语查找所有对应的文档即为符合的文档--进行其他的查询评分操作
二、评分机制
官网介绍:https://www.elastic.co/guide/en/elasticsearch/reference/7.16/query-filter-context.html
1.查询
参考博客:https://www.cnblogs.com/wangchuanfu/p/7452809.html
使用TF/IDF算法,基本意思就是词频算法。
原理:根据分词词库,所有的文档在建立索引的时候进行分词划分。进行搜索的时候,也对搜索的短语进行分词划分。其中TF代表分词项在文档中出现的次数(term frequency),IDF代表分词项在多少个文档中出现(inverse document frequency)。
过程:将搜索的短语进行分词得出分词项,每个分词项和每个索引中的文档根据TF/IDF进行词频出现的评分计算。然后每个分词项的得分相加,就是这个搜索对应的文档得分。
2.过滤
filter过滤字段内容(答案是简单的是或否——不计算分数),存在则会出现在结果列表中,不存在则抛弃。