工作机会,需要对检索结果进行调优,从未接触过算法以及检索的我,开始阅读ES各种材料,无奈网络上的材料大多伴随着各种coding,对于没有代码背景的人来说实属难以理解。只能在各种材料中总结归纳,翻译成大白话。
1. ES的含义
英文全称:ElasticSearch。
含义:分布式、高扩展、高实时的搜索与数据分析引擎(来源百度百科,抽象)
2. ES中文检索的过程
以下分别介绍每个过程中的关键点
(1)存储过程
在存储过程中,ES会根据要进行检索的字段,对存储内容进行拆词存储,并形成索引。ES有两种拆词方法(ik_max_word,和ik_smart方法名字百度出来的,非专业)。一种粗粒度,一种细粒度,两种方法的拆分结果示例如下:
数据:百度在线有限公司
粗粒度分词:百度、在线、有限公司
细粒度分词:百度、百、度、在线、有限公司、有限、有、限、公司
基本可以这样理解:粗粒度安装短语进行分词,细粒度不仅涵盖短语,还会拆分到字。细粒度分词虽然会占用更多的存储空间,但是好处是,在检索更细的词语或者单字也能有命中结果。
(2)检索拆词
检索拆词的过程与入库存储的分词过程一致,不再赘述。
检索内容拆出来的词会与存储过程中的分词索引进行快速匹配,匹配到了即可展示出检索结果。
(3)检索排序
在检索匹配条数很多的情况下,优先展示哪条结果呢?这里就要使用相关性计算来进行打分判断了,相关性越高,会展示地越靠前。
相关性得分的判断依据(TF/IDF 相似度算法)如下:
A:检索词频率 。检索词在该字段出现的频率,出现频率越高,相关性也越高。 字段中出现过 5 次要比只出现过 1 次的相关性高。(重要的事情说三遍,大概就是这个意思吧)
B:反向文档频率 。每个检索词在索引中出现的频率,频率越高,相关性越低。检索词出现在多数文档中会比出现在少数文档中的权重更低。(供给量越大价格越低,符合经济学原理)
C:字段长度准则 。字段的长度是多少,长度越长,相关性越低。 检索词出现在一个短的 title 要比同样的词出现在一个长的 content 字段权重更大。(惜字如金,描述这里很恰当)
依据此仨原则,会计算出一个得分_score。检索排序顺序自然按照这个得分由高到低排列。
这个规则看起来既符合常识又符合经济学原理,但是,在实际使用中却不一定能得到最好的效果,所以,"科学家们"又发明了可以干预得分的一些方法和函数(百度一下,资源丰富,全是coding,😓),可以根据业务的需要来对_score进行一定程度的调整。这样,保证排序效果。
以上,就是ES中文检索的白话原理了。下一篇,跟我一起在实践中检验真理吧!