2013-05-17 37 views
0

考虑与存储在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等真实世界的搜索引擎如何处理这个问题?

回答

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. 对于任何一个新单词(再见,你好),添加到数据库中该字的条目。对于数据库中的任何现有单词(Hello),将新数据添加到该值。

    下面是你的数据库是什么样子加入文档后。

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]} 
    -------------------------------------------------------------

快速回答你的另一个问题是:是的,这是可持续发展的大型索引。倒排索引通常针对查找进行优化,使用散列表或二叉树,使得检索实际上与文档集合的大小无关。

对于大型搜索引擎如何处理这个问题:我不知道的细节(即使我想)。他们显然使用数据集群将负载分散到多个服务器上(是的,我说传播负载,这不是故意的)。我敢打赌,他们已经预处理一堆东西,和缓存像“堆栈溢出”通用查询,以便已经有一个解决方案页面为。