ES搜索相似度

2022-06-24 14:07:43 浏览数 (1)

今天再来一道面试真题,es的搜索的相似度算法如何计算

首先,我们要从这几方面回答

  1. TF(term frequency)检索词频率
  2. IDF(inversed document frequency)反向文档频率
  3. length norm,字段长度准则
  4. query vector(查询向量)和doc vector(文档向量)
代码语言:javascript复制
单个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的总分数,弧度越大,分数越低,弧度越小,分数越高

大家不必要说这个弧度是如何计算出来的,我也不知道,有兴趣的可以研究一下,里面都是数学相关的东西

es

0 人点赞