今天再来一道面试真题,es的搜索的相似度算法如何计算
首先,我们要从这几方面回答
- TF(term frequency)检索词频率
- IDF(inversed document frequency)反向文档频率
- length norm,字段长度准则
- query vector(查询向量)和doc vector(文档向量)
单个term在doc中的分数
query: hello world --> doc.content
doc1: java is my favourite programming language, hello world !!!
doc2: hello java, you are very good, oh hello world!!!
检索词频率
比如上面的hello在在doc1出现了1次,会根据出现的次数给个分数,一个term在doc中出现的次数越多,分数就越高
反向文档频率
找到hello在所有doc中出现的次数,比如上面出现了3次,一个term在所有doc 中出现的次数越多,分数就越低,比如我们的and 或the常用词,就会频繁出现,对分数的贡献就很少,所以分数就比较小
字段长度准则
hello搜索的doc长度越长,给的相关性评分越低,doc越短,给的相关性评分越高,
检索词出现在一个短的 title 要比同样的词出现在一个长的 content 字段权重更大,
最后,hello这个关键字会根据IF,IDF,length norm给一个综合分数.
文档向量
比如hello world ,有3doc,其中一个doc1包含一个hello,另外一个doc2包含word,doc3包含hello world,比如下面
doc1----->[2,0]
doc2----->[0,5]
doc3----->[2,5]
每一个doc都会计算出term计算出一个分数,hello 一个分数,world一个分数,都会计算出一个分数组,所有的分数组形成一个文档向量
查询向量
比如hello world,es会根据hello world在所有doc中的评分情况,计算一个查询向量,比如hello基于所有doc都有一个评分为2,world基于所有doc都有一个评分5,查询向量就是[2,5]
计算相似度
每个文档向量计算出对查询向量的弧度,基于这个弧度给出一个doc相对于query中多个term的总分数,弧度越大,分数越低,弧度越小,分数越高
大家不必要说这个弧度是如何计算出来的,我也不知道,有兴趣的可以研究一下,里面都是数学相关的东西