Lucene 位置索引如何高效工作?

How Lucene positional index works so efficiently?

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

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

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

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

您在此处询问的短语查询实际上计算位置非常有效,因为您要查找 'Harry' AND 'Potter' AND 'Movies' 出现的文档.

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

Lucene 的帖子也被分片成多个文件: 计数文件内有:(Document, TF, PositionsAddr)+ 位置文件内部是:(PositionsArray)

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

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