每周一个算法(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信息(关键字属于的字段)