每周一个算法(1)---倒排索引

倒排索引 inverted index,第一次接触是在elasticsearch里面,里面的索引就是用的这个,其实es也是使用的Lucene作底层,inverted index是Lucene的核心算法。

网上说,“倒排索引”是实现单词到文档映射关系的最佳实现方式。

为什么叫做倒排索引呢?其实我认为中文翻译的这个名字并不好,(其实感觉编程上面的术语十有八九都没翻好,这也是阻碍程序员理解学习的重要原因之一,但是大家都这么叫了,你也得跟着这么叫,有的时候真正明白这个概念的时候,你确实觉得中文名字起的太差劲,所以经验就是:看到一个术语,立即去查英文,和英文文档),这个“排”字很有误导性,其实我觉得翻译成“反向索引”更好。

因为,inverted index的意思是,“使用内容来索引位置”,而不是通常的“使用位置索引内容”。

接下来,说说个人理解:

在Lucene中,对于一篇文档的处理,首先要Analyze,(对于英文来说)就是把“停用词”去掉,把大小写统一,把词性变化去掉(都还原成最原始的单词),ES里面也强调这个analyze的过程,并且支持用户指定analyzer(特定语言使用特定的analyzer)。

然后呢,就是建立索引的过程:

详细的过程就是这篇博客里写到的,灰常明白。

http://www.cnblogs.com/fly1988happy/archive/2012/04/01/2429000.html

基本意思就是对于一个词(关键词(也即上面analyze步骤生成的结果)),要统计出它所在的文章,出现的次数,以及在各个文章中的位置。

这样就对应生成了词典文件(Term Dictionary)、频率文件(frequencies)、位置文件 (positions)

其中词典文件还记录了一些附加信息:该关键字指向频率文件和位置文件的指针,及field信息(关键字属于的字段)

 

posted @ 2015-09-27 12:55  ivywenyuan  阅读(2509)  评论(0编辑  收藏  举报