首页 > 解决方案 > Lucene 位置索引如何如此高效地工作?

问题描述

通常,任何搜索引擎软件都会创建倒排索引以加快搜索速度。基本格式是:-

word: <docnum ,positions>, <docnum ,positions>, <docnum ,positions> .....

每当在引号内有搜索查询时,"Harry Potter Movies"这意味着单词的位置应该完全匹配,并且在像 k 单词查询这样的搜索中hello /4 world,通常意味着在左侧或右侧的 4 个单词距离范围内找到单词 world你好这个词。我的问题是我们可以采用线性检查帖子和计算查询中的单词距离等解决方案,但如果集合真的很大,我们无法真正搜索所有帖子。那么是否有任何其他数据结构或优化 lucene 或 solr 使用?

第一个解决方案可以只为每个单词搜索一些 k 帖子。其他解决方案可以只搜索顶级文档(在索引期间通常称为按 tf-idf 或类似排序的冠军列表),但可以忽略更多更好的文档。两种解决方案都有一些缺点,它们都不能保证质量。但在 Solr 服务器中,即使在大型集合中,我们也能获得有保证的结果质量。如何?

标签: pythonsolrluceneinformation-retrievalinverted-index

解决方案


您在此处询问的短语查询实际上对于计算其位置非常有效,因为您正在询问出现“Harry”和“Potter”和“Movies”的文档。

Lucene 非常聪明,但其算法的核心是它只需要访问所有这三个术语都出现的文档的位置列表。

Lucene 的帖子也被分片成多个文件: counts-files 里面是:(Document, TF, PositionsAddr)+ Positions-files 里面是:(PositionsArray)

所以它可以为这三个词中的每一个扫过(doc, tf, pos_addr),并且只有当所有三个词都出现在特定文档中时才查询PositionsArray。短语查询有机会非常快,因为您最多只能访问最不常用词的所有文档。

如果您想看到一个短语查询运行缓慢(并且进行大量磁盘搜索!),请尝试:“to be or not to be”……这里的 AND 部分没有多大帮助,因为所有术语都很常见。


推荐阅读