如何将新文档添加到倒排索引中

时间:2013-05-17 04:32:00

标签: search-engine inverted-index

考虑一个倒置索引,其位置记录存储在MySQL数据库中:

  Word (VARCHAR)  |    Documents (LONGTEXT)
-------------------------------------------------------------
     Hello        | {id: 11, freq: 4, pos: [18, 37, 43, 119]}, 
                  | {id: 19, freq: 2, pos: [17, 32]}
-------------------------------------------------------------

现在,出现了一个新文档,其大部分词语已经编入索引。现在索引操作应该是什么?基本方法似乎是,如果单词已存在于数据库中,则获取其文档并将当前文档添加到其中并更新记录。

这是否可持续,因为文件数量增加达到数百万?像Solr,Xapain,Google,Bing等现实世界搜索引擎如何处理这个问题?

1 个答案:

答案 0 :(得分:0)

将新文档添加到您的收藏集时,操作将是:

  1. 为文档分配一个id,比如20,它唯一地标识文档。对于添加到集合中的每个新文档,此ID通常会增加1。

  2. 列出新文档中的所有字词以及它们出现在什么位置。

    对于文档Hi Hello Hello Bye,这将是:

    Bye:   {id: 20, freq: 1, pos: [15]} 
    Hello: {id: 20, freq: 2, pos: [3, 9]} 
    Hi:    {id: 20, freq: 1, pos: [0]}
  3. 对于任何新单词(Bye,Hi),在数据库中为该单词添加一个条目。对于数据库中的任何现有单词(Hello),将新数据添加到该值。

    下面是添加文档后数据库的外观。

  4.     Word (VARCHAR)  |    Documents (LONGTEXT)
        -------------------------------------------------------------
           Bye          | {id: 20, freq: 1, pos: [15]}
           Hello        | {id: 11, freq: 4, pos: [18, 37, 43, 119]}, 
                        | {id: 19, freq: 2, pos: [17, 32]}
                        | {id: 20, freq: 2, pos: [3, 9]}
           Hi           | {id: 20, freq: 1, pos: [0]}
        -------------------------------------------------------------

    您对其他问题的快速回答是:是的,这对于大型索引来说是可持续的。反向索引通常针对查找进行优化,使用哈希表或二叉树,使检索实际上与文档集的大小无关。

    对于大型搜索引擎如何处理这个:我不知道细节(即使我愿意)。他们显然使用数据集群将负载分散到多个服务器上(是的,我说扩散负载。这不是故意的)。我打赌他们已经预处理了一堆东西,并缓存了像“Stack Overflow”这样的常见查询,因此已经有了解决方案页面。