搜索引擎中的高效低基数 AND
Efficient low-cardinality ANDs in a search engine
搜索引擎(如 Lucene 等)如何执行 AND 查询,其中一个术语对于数据集中的许多文档都是通用的?例如,在一个倒排索引中:
term | document_id
---------------------
program | 1, 2, 3, 5...
python | 1, 4
code | 4
c++ | 4, 5
术语 program
出现在多个文档中,这意味着 program AND code
的查询需要对大量文档执行交集。
有没有一种方法可以执行 AND 查询,而不必对潜在数十亿文档中包含的术语求交集?
the term program is present in several documents meaning a query of program AND code would require performing an intersection upon a very large set of documents.
是的。假设您有以下查询:
term1 AND
term2 AND
term3
您首先需要计算每个 正项 的 文档频率 。您选择计数最少的单词。
您从查询中检索了包含最不常用术语的文档。那些是候选人。然后你用有限状态机的查询过滤和评分那些候选者。
所以数据库有几个子空间:
- 从词条或词干或术语到文档频率的映射(如在 tfidf 中)
- 允许检索包含给定词条的文档的实际 inverted-index
- 文档 ID 和文档的全文表示形式之间的映射,或者只是词袋,具体取决于您的查询逻辑的高级程度。
然后过滤器+评分步骤可以并行发生
搜索引擎(如 Lucene 等)如何执行 AND 查询,其中一个术语对于数据集中的许多文档都是通用的?例如,在一个倒排索引中:
term | document_id
---------------------
program | 1, 2, 3, 5...
python | 1, 4
code | 4
c++ | 4, 5
术语 program
出现在多个文档中,这意味着 program AND code
的查询需要对大量文档执行交集。
有没有一种方法可以执行 AND 查询,而不必对潜在数十亿文档中包含的术语求交集?
the term program is present in several documents meaning a query of program AND code would require performing an intersection upon a very large set of documents.
是的。假设您有以下查询:
term1
AND
term2AND
term3
您首先需要计算每个 正项 的 文档频率 。您选择计数最少的单词。
您从查询中检索了包含最不常用术语的文档。那些是候选人。然后你用有限状态机的查询过滤和评分那些候选者。
所以数据库有几个子空间:
- 从词条或词干或术语到文档频率的映射(如在 tfidf 中)
- 允许检索包含给定词条的文档的实际 inverted-index
- 文档 ID 和文档的全文表示形式之间的映射,或者只是词袋,具体取决于您的查询逻辑的高级程度。
然后过滤器+评分步骤可以并行发生