我想知道lucene搜索如何快速地运行。我在网上找不到任何有用的文档。如果您有任何内容(缺少lucene源代码),请告诉我。
使用带索引的mysql5文本搜索的文本搜索查询大约需要18分钟。 lucene搜索相同的查询只需不到一秒钟。
答案 0 :(得分:71)
Lucene是一个倒置的全文索引。这意味着它将获取所有文档,将它们分成单词,然后为每个单词构建索引 。由于索引是一个精确的字符串匹配,无序,它可以非常快。假设varchar
字段上的SQL无序索引可能同样快,事实上我认为在这种情况下你会发现大数据库可以很快地执行简单的字符串相等查询。
Lucene不必优化事务处理。添加文档时,无需确保查询即时。并且它无需针对现有文档的更新进行优化。
然而,在一天结束时,如果你真的想知道,你需要阅读来源。毕竟,你引用的两件事都是开源的。
答案 1 :(得分:32)
Lucene创造了一个大指数。索引包含单词id,单词存在的文档数以及单词在这些文档中的位置。因此,当您提供单个单词查询时,它只搜索索引(O(1)时间复杂度)。然后使用不同的算法对结果进行排名。对于多字查询,只需获取单词所在的文件集的交集。 因此,Lucene非常快。
有关详细信息,请阅读Google开发人员撰写的这篇文章 - http://infolab.stanford.edu/~backrub/google.html
答案 2 :(得分:18)
总之:索引。
Lucene创建了一个文档索引,允许它更快地搜索。
列表O(N)数据结构和哈希表O(1)数据结构之间的区别相同。该列表必须遍历整个集合以找到您想要的内容。哈希表有一个索引,可以让它准确地找出所需项目的位置,然后简单地获取它。
更新:
我不确定你的意思“Lucene索引搜索比mysql索引搜索快得多。”
我的猜测是你正在使用MySQL“WHERE document LIKE'%phrase%'”来搜索文档。如果这是真的,那么MySQL必须对每一行进行表扫描,这将是O(N)。
Lucene将文档解析为令牌,将它们分组为你方向的n-gram,并为每一个计算索引。在索引的Lucene文档中找到一个单词是O(1)。
答案 3 :(得分:5)
Lucene与 Term frequency and Inverse document frequency 合作。它创建了一个索引,将每个单词与文档以及它的频率计数映射为文档上的反索引。
示例:
文件1:随机存取存储器是主存储器。
文件2:硬盘是辅助内存。
Lucene创建反向索引,例如
文件1:
条款:随机
频率:1
位置:0
期限:记忆力
频率:2
位置:3
位置:6
因此它能够快速搜索和检索搜索到的内容。当搜索查询的匹配项过多时,它会根据权重输出结果。考虑搜索查询“主内存” ,它会分别搜索所有4个单词,结果就像
主要
文件1:频率-1
内存
文件1:频率-2
文件2:频率-1
结果为 File1 ,后跟 File2 。为了避免被诸如“和”,“或”之类的最常见单词的权重所困扰,“该”考虑了文档的倒数出现频率(即,“它降低了文档集中最受欢迎的单词的权重”)。 / p>