Lucene如何工作

我想知道如何lucenesearch如此快速地工作。 我在网上找不到任何有用的文档。 如果你有任何东西(短的lucene源代码)阅读,让我知道。

在我的情况下,使用索引mysql5文本search的文本search查询大约需要18分钟。 lucenesearch相同的查询不到一秒钟。

Lucene是一个倒置的全文索引。 这意味着它将所有的文档分解成单词,然后为每个单词build立一个索引。 由于索引是一个精确的string匹配,无序,它可以是非常快的。 假设一个varchar字段上的SQL无序索引可能同样快,事实上,我认为在这种情况下,您会发现大型数据库可以非常快速地执行简单的string相等查询。

Lucene不必为事务处理进行优化。 在添加文档时,不需要确保查询立即就能看到。 而且它不需要对现有文档的更新进行优化。

然而,在一天结束的时候,如果你真的想知道,你需要阅读来源。 毕竟,你所引用的东西都是开源的。

Lucene创build了一个很大的索引。 索引包含单词ID,单词所在文档的数量以及单词在这些文档中的位置。 所以当你给一个单词查询时,它只是search索引(O(1)时间复杂度)。 然后结果使用不同的algorithm进行sorting。 对于多字词查询,只需将存在单词的文件集合交叉即可。 因此Lucene非常快。

有关详细信息,请阅读Google开发人员撰写的这篇文章, http://infolab.stanford.edu/~backrub/google.html

总之:索引。

Lucene创build一个文档索引,使其能够更快速地进行search。

列表O(N)数据结构和散列表O(1)数据结构之间的差异是相同的。 名单必须遍历整个集合,以find你想要的。 哈希表有一个索引,它可以确切地确定所需项目的位置,并简单地获取它。

更新:

我不确定你的意思是什么“Lucene索引search比mysql索引search快得多”。

我的猜测是你正在使用MySQL“WHERE文件LIKE'%phrase%'”来search文档。 如果这是真的,那么MySQL必须对每一行进行表扫描,这将是O(N)。

Lucene可以将文档parsing为令牌,按照你的方向将它们分为n-gram,并计算每一个索引。 在索引的Lucene文档中find一个单词是O(1)。