Apache Lucene啥返回搜索结果的呢?

南风 2020年10月17日 110次浏览

 按照正常逻辑来说,你输入搜索词,搜索引擎应该返回你最想要的搜索结果,从表象看来搜索引擎只是输入结果,然后返回搜索结果,但是,你不知道搜索引擎背后做了多少事情:

  • 1、首先,搜索引擎会根据你的搜索词对你的搜索行为进行意图识别,调用定制的搜索逻辑为你查找结果,甚至为了让你的得到你想要的最好结果,它会使用不同的词库进行搜索词分词;
  • 2、其次,对搜索词进行分词后获取词元的集合,调用定制逻辑的查询语句,使用评分算法(scoring algorithm or similarity)(TF/IDF algorithm、Okapi BM25 algorithm)获取搜索引擎默认排序的搜索结果.
  • 3、最后,搜索业务拿到搜索引擎搜素结果后,根据商业规则对搜索结果进行重排序(某度就是这样的操作,SEM投放词价格越高,搜索结果越靠前,这就有点违背了搜索引擎的初衷---给你最想要的结果,然而google却做得很好,所以很多技术人都不想用国内搜索引擎的原因,给不了你想要的却给你最多的广告),给用户展现商业干预下权衡利益的最优结果,但是对于用户不是最优结果。

 我们知道对于lucene而言,比较重要的三大块:分词器、倒排索引、评分算法。其中,分词器词库对于搜索引擎而言尤为重要,对于随着社会新进程而产生的新词、潮词,需要进到搜索引擎的词库,才能在分词器中分词这些词。而最终结果展现还是要依赖评分算法,在特定场景下的优秀算法才能给予用户最好的搜索体验。那么我们来研究下ES下的两种评分算法:

  • 1、TF-IDF(反向文档算法)
     TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。
     TF(Term Frequency,缩写为TF)即词频,一个词在文中出现的次数,统计出来就是词频TF。
    TF公式.png
     逆向文件频率(inverse document frequency,IDF)是一个词语普遍重要性的度量。某一特定词语的IDF,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取以10为底的对数得到。
    IDF公式.png
     TF-IDF即为TF * IDF,某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的TF-IDF。因此,TF-IDF倾向于过滤掉常见的词语,保留重要的词语。
    TF-IDF反向文档计算公式.png
     
  • 2、BM25
     BM25算法,通常用来作搜索相关性评分。一句话概况其主要思想:对Query进行语素解析,生成语素qi;然后,对于每个搜索结果D,计算每个语素qi与D的相关性得分,最后,将qi相对于D的相关性得分进行加权求和,从而得到Query与D的相关性得分。
    BM25算法.png
     Wi=IDF(qi)。判断一个词与一个文档的相关性的权重,方法有多种,较常用的是IDF。
    IDF(qi).png
    其中,N为索引中的全部文档数,n(qi)为包含了qi的文档数。
     R(qi,d)表示语素qi与文档d的相关性得分。
    R(qi,d)公式.png

     最终的BM25公式:
    BM25.png

其中,k1,k2,b为调节因子,通常根据经验设置,一般k1=2,b=0.75;fi为qi在d中的出现频率,qfi为qi在Query中的出现频率。dl为文档d的长度,avgdl为所有文档的平均长度。

(全文完)