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

问题描述

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

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

只要在引号内有一个搜索查询,比如 "Harry Potter Movies",这意味着应该有单词位置的精确匹配,并且在像 hello /4 world 这样的 k 个单词查询中的搜索中,它通常意味着找到单词 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。短语查询有机会非常快速,因为您最多只能访问频率最低的词中的所有文档。

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...