LUCENE索引结构是以2叉树为基础的B树倒排结构,这决定了索引数据时要维护2叉树为基础的B树倒排结构,例如查找并增量,将耗费一定的时间消耗,其时间复杂度为O(LOGN),而sphinx是以HASH哈希树为基础的倒排结构,其时间复杂度为O(1),所以随着数据的增多,LUCENE索引树的维护将超过sphinx索引树的维护。导致sphinx索引速度是LUCENE索引速度的10倍这么大的差距。
北京-普通人(409031406) 22:58:26
你用过sphinx?
横瓜(601069289) 23:10:08
我写过横瓜搜索,一个类似LUCENE全新的搜索,写的代码接近百万行吧,最清楚索引效率的瓶口所在。
有啥区别
横瓜(601069289)23:21:43
搜索用的哈希与计算机课本上的哈希,有很大差别,sphinx只能说用的类哈希算法,与计算机课本上的哈希,有很大差别
你说得类哈希是指什么
北京-普通人(409031406)23:23:40
讲清楚就行了
Phil(545075328)23:24:17
采用不同的冲突消解策略什么就差不多了
横瓜(601069289)23:25:03
类哈希:sphinx要考虑存储和查询,sphinx要考虑空间效率和时间效率的平衡,那么sphinx用的哈希,已经是混合算法了.但是计算机课本上的哈希是sphinx的基础.
附:Lucene 倒排序索引原理
Lucene 倒排序索引原理
Lucene是apache软件基金会[4] jakarta项目组的一个子项目,是一个高性能的java全文检索框架。lucene索引结构中最核心的部分是倒排序索引。
用一个例子描述一下倒排序。
假设有两篇文章:
文章1的内容是:共和国。
文章2的内容是:中国。
1、Lucene在建立索引前先通过分词器找出文章中的关键词。我们采用一元分词举例。那么文章1的关键词是[共][和][国],文章二的关键词是[中][国]。
2、倒排序索引
通过分词器找出的对应关系是文章到关键词映射,这样处理后的结果不利于检索,几乎是全扫描。lucene再用倒排序建立索引,把这种关系转换成关键词到文章的映射,并对关键词做字符串排序。当然lucene还补充了关键词在文章中出现的频度和位置等信息,这里不做描述。到排序后的结果见下表:
关键词
文章号
共
国
1,2
和
中
简单的说lucene倒排序就是把分词词元映射到文章位置并对这些记录按分词词元做字符串排序。
对于这样的存储结构,lucene采用了二元搜索算法来做检索。这也是lucene高效的原因之一。
对二元搜索算法做一下简单介绍:即二分查找或折半查找算法,对于有n个元素的数组来说,二元搜索算法进行最多1+log2(n)次比较. 即有2的n次方个元素,最多比较n+1次。那么1024*1024*1024个元素,也就比较31次而已。
违禁词分词过滤思路
违禁词分词思路:建立违禁词词典,词元是一个违禁词(包括特殊符号,并且不考虑正向和逆向最大匹配)。那么用违禁词分词器分词后的倒排序就是把违禁词映射到文章位置并对这些记录按违禁词做字符串排序。
例如:共和国是违禁词
对文章1和文章2的倒排序索引就是:
关键词
文章号
共和国
明显地,索引记录数等于违禁词数。这样,通过一次建倒排序索引的过程就直接找出目标记录,可大大提高计算效率。