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