图解搜索过程

    总的来说,搜索过程就是将词典和倒排表信息从索引中读出来,根据用户输入的查询语句合并倒排表信息,得到结果文档集合以及打分计算的过程。接下来,图说搜索过程。

图解搜索过程_第1张图片

打分(score)公式说明:

  • t:Term,这里的Term是指包含域信息的Term,也即title:hello和content:hello是不同的Term。

  • coord(q,d):一次搜索可能包含多个搜索词,而一篇文档中也可能包含多个搜索词,此项表示,当一篇文档中包含的搜索词越多,则此文档则打分越高。

  • queryNorm(q):计算每个查询条目的方差和,此值并不影响排序,而仅仅使得不同的query之间的分数可以比较。其公式如下:

  • tf(t in d):Term t在文档d中出现的词频。

  • idf(t):Term t在几篇文档中出现过。

  • norm(t, d):标准化因子,它包括三个参数:

    • Document boost:此值越大,说明此文档越重要。

    • Field boost:此域越大,说明此域越重要。

    • lengthNorm(field) = (1.0 / Math.sqrt(numTerms)):一个域中包含的Term总数越多,也即文档越长,此值越小,文档越短,此值越大。

  • 各类Boost值

    • t.getBoost():查询语句中每个词的权重,可以在查询中设定某个词更加重要,比如:common^4 hello,common的权重是hello的4倍。

    • d.getBoost():文档权重,在索引阶段写入nrm文件,表明某些文档比其他文档更重要。

    • f.getBoost():域的权重,在索引阶段写入nrm文件,表明某些域比其他的域更重要。

过程解说:

(1)IndexReader打开索引文件,读取并打开指向索引文件的流;

(2)用户输入查询语句;

(3)将查询语句转换为查询对象Query对象树;

(4)构造Weight对象树,用于计算词的权重Term Weight,也即计算打分公式中与仅与搜索语句相关与文档无关的部分(红色部分);

(5)构造Scorer对象树,用于计算打分(TermScorer.score());

(6)在构造Scorer对象树的过程中,其叶子节点的TermScorer会将词典和倒排表从索引中读出来;

(7) 构造SumScorer对象树,其是为了方便合并倒排表对Scorer对象树的从新组织,它的叶子节点仍为TermScorer,包含词典和倒排表。此步 将倒排表合并后得到结果文档集,并对结果文档计算打分公式中的蓝色部分。打分公式中的求和符合,并非简单的相加,而是根据子查询倒排表的合并方式(与或 非)来对子查询的打分求和,计算出父查询的打分;

(8)将收集的结果集合及打分返回给用户。


参考资料:

http://forfuture1978.iteye.com/blog/632815

http://forfuture1978.iteye.com/blog/609502

你可能感兴趣的:(图解搜索过程)