Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lucene是如何工作的_Lucene - Fatal编程技术网

Lucene是如何工作的

Lucene是如何工作的,lucene,Lucene,我想了解lucene搜索是如何如此快速地工作的。我在网上找不到任何有用的文档。如果你有任何东西(除了lucene源代码)需要阅读,请告诉我 在我的例子中,使用带索引的mysql5文本搜索进行文本搜索查询大约需要18分钟。lucene搜索同一查询只需不到一秒钟。一句话:索引 Lucene为您的文档创建一个索引,使其能够更快地搜索 列表O(N)数据结构和哈希表O(1)数据结构之间的区别是相同的。该列表必须遍历整个集合才能找到您想要的内容。哈希表有一个索引,可以让它准确地找出所需项的位置,并简单地获取

我想了解lucene搜索是如何如此快速地工作的。我在网上找不到任何有用的文档。如果你有任何东西(除了lucene源代码)需要阅读,请告诉我

在我的例子中,使用带索引的mysql5文本搜索进行文本搜索查询大约需要18分钟。lucene搜索同一查询只需不到一秒钟。

一句话:索引

Lucene为您的文档创建一个索引,使其能够更快地搜索

列表O(N)数据结构和哈希表O(1)数据结构之间的区别是相同的。该列表必须遍历整个集合才能找到您想要的内容。哈希表有一个索引,可以让它准确地找出所需项的位置,并简单地获取它

更新:

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

我猜您正在使用MySQL“WHERE document,比如“%phrase%”来搜索文档。如果这是真的,那么MySQL必须对每一行进行表扫描,这将是O(N)


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