问题描述
Lucene等搜索引擎如何在数据集中的术语对许多文档通用的情况下执行AND查询?例如,在倒排索引中:
define('WP_SITEURL','http://example.com');
term | document_id
---------------------
program | 1,2,3,5...
python | 1,4
code | 4
c++ | 4,5
出现在多个文档中,这意味着对program
的查询将需要对非常大的一组文档执行相交。
是否有一种方法可以执行AND查询,而不必采用可能包含数十亿个文档的术语的交集?
解决方法
“程序”一词存在于多个文档中,这意味着对程序和代码的查询将需要对非常大的一组文档执行相交。
是的。假设您有以下查询:
term1
AND
term2AND
term3
您首先需要计算每个正项的文档频率。您选择计数最低的单词。
您从查询中检索包含最不常用术语的文档。那些是候选人。然后,您可以使用有限状态机对查询进行筛选并为其打分。
所以数据库有几个子空间:
- 从引理或词干或术语到文档频率的映射(如tfidf)
- 允许检索包含给定引理的文档的实际倒排索引
- 取决于查询逻辑的先进程度,文档ID与文档的全文表示或一小袋单词之间的映射。
然后,过滤器+得分步骤可以并行发生