Lucene是如何工作的
我想了解lucene搜索是如何如此快速地工作的。我在网上找不到任何有用的文档。如果你有任何东西(除了lucene源代码)需要阅读,请告诉我 在我的例子中,使用带索引的mysql5文本搜索进行文本搜索查询大约需要18分钟。lucene搜索同一查询只需不到一秒钟。一句话:索引 Lucene为您的文档创建一个索引,使其能够更快地搜索 列表O(N)数据结构和哈希表O(1)数据结构之间的区别是相同的。该列表必须遍历整个集合才能找到您想要的内容。哈希表有一个索引,可以让它准确地找出所需项的位置,并简单地获取它 更新: 我不确定你所说的“Lucene索引搜索比mysql索引搜索快得多”是什么意思 我猜您正在使用MySQL“WHERE document,比如“%phrase%”来搜索文档。如果这是真的,那么MySQL必须对每一行进行表扫描,这将是O(N)Lucene是如何工作的,lucene,Lucene,我想了解lucene搜索是如何如此快速地工作的。我在网上找不到任何有用的文档。如果你有任何东西(除了lucene源代码)需要阅读,请告诉我 在我的例子中,使用带索引的mysql5文本搜索进行文本搜索查询大约需要18分钟。lucene搜索同一查询只需不到一秒钟。一句话:索引 Lucene为您的文档创建一个索引,使其能够更快地搜索 列表O(N)数据结构和哈希表O(1)数据结构之间的区别是相同的。该列表必须遍历整个集合才能找到您想要的内容。哈希表有一个索引,可以让它准确地找出所需项的位置,并简单地获取
Lucene可以将文档解析为标记,按照您的方向将它们分组为n-gram,并为每个标记计算索引。在索引的Lucene文档中查找单词是O(1) Lucene是一个反向全文索引。这意味着它会获取所有文档,将它们拆分为单词,然后为每个单词建立索引。由于索引是一个精确的字符串匹配,无序的,它可以非常快。假设,
varchar
字段上的SQL无序索引可以同样快,事实上,我认为在这种情况下,大型数据库可以非常快地执行简单的字符串相等查询
Lucene不必优化事务处理。添加文档时,无需确保查询立即看到它。而且它不需要优化现有文档的更新
然而,在一天结束时,如果你真的想知道,你需要阅读源代码。毕竟,您引用的两个东西都是开源的。Lucene创建了一个大索引。索引包含单词id、单词所在的文档数以及单词在这些文档中的位置。因此,当您给出一个单词查询时,它只搜索索引(O(1)时间复杂度)。然后使用不同的算法对结果进行排序。对于多单词查询,只需取单词所在的文件集的交集。 因此Lucene非常非常快
有关更多信息,请阅读谷歌开发者撰写的这篇文章-Lucene与合作。它创建一个索引,将每个单词映射到文档及其频率计数,这只是文档上的反向索引 示例: 文件1:随机存取存储器是主存储器 文件2:硬盘是辅助内存 Lucene创建了一个反向索引,类似于 文件1: 术语:随机 频率:1 职位:0 术语:记忆 频率:2 职位:3 职位:6 因此,它能够快速搜索和检索搜索到的内容。当搜索查询有太多匹配项时,它会根据权重输出结果。考虑搜索查询<强>“主内存”<强>它搜索所有4个单词,结果如下, Main 文件1:频率-1 内存 文件1:频率-2 文件2:频率-1
结果将是File1,然后是File2。为了避免被诸如“and”、“or”、“the”等最常见单词的权重冲昏头脑,它考虑了相反的文档频率(即“它降低了文档集中最流行的单词的权重)。是的,我理解索引部分,但同样,lucene索引搜索比mysql索引搜索快得多。这是怎么发生的?我可以请求将此问题转换为社区wiki吗?Lucene现在听起来像一个平台。如果我理解正确的话,文本搜索引擎的区别在于它们如何处理多词搜索,以及如何将搜索结果实时连接到多个索引。我不建议就此咨询Lucene source。阅读一点文本搜索理论可能会更好,@alienCoder的答案对我有帮助。@b问题,如果索引是“每个单词”,那么stackoverflow用户搜索为什么允许子字符串匹配?这不是整本书答案的地方。这里有很多关于基本概念的详细说明。你说的“每个单词的索引”是什么意思……如果我开始键入“abc”,它将如何在文档中找到“abc”?从一个单词到另一个文档的索引(B-树)可以在文档中按单词搜索文档,因为这样的索引表是(单词,文档)其中索引位于word列上。考虑一个类似的问题:“在他们身上找到带有单词‘警察’、‘犯罪’、‘统计学’的文件。通过搜索单词索引,您可以进行三次日志(N)搜索,以获得其中一个单词所在的O(N)个文档。然后,您可以执行两个O(N)循环来构建一个包含所有三个单词的文档集。虽然理论上这是一个O(N)操作,但大多数文档并没有全部三个单词,所以它是O(N),其中N