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

  • 相关阅读:
    [单链表]链表指针追赶问题
    二叉查找树与平衡二叉树
    二叉树的下一个结点
    fork进程函数总结
    《Effective C++》Item2:尽量以const,enum,inline替换#define
    Hash表的使用
    [数字]整数数字的算法
    算法题:找出整数数组中两个只出现一次的数字
    删除元素的操作
    [Reprinted] 使用Spring Data Redis操作Redis(一) 很全面
  • 原文地址:https://www.cnblogs.com/ivywenyuan/p/4842132.html
Copyright © 2020-2023  润新知