考虑一个倒置索引,其位置记录存储在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 :(得分:0)
将新文档添加到您的收藏集时,操作将是:
为文档分配一个id,比如20,它唯一地标识文档。对于添加到集合中的每个新文档,此ID通常会增加1。
列出新文档中的所有字词以及它们出现在什么位置。
对于文档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]}
对于任何新单词(Bye,Hi),在数据库中为该单词添加一个条目。对于数据库中的任何现有单词(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]}
-------------------------------------------------------------
您对其他问题的快速回答是:是的,这对于大型索引来说是可持续的。反向索引通常针对查找进行优化,使用哈希表或二叉树,使检索实际上与文档集的大小无关。
对于大型搜索引擎如何处理这个:我不知道细节(即使我愿意)。他们显然使用数据集群将负载分散到多个服务器上(是的,我说扩散负载。这不是故意的)。我打赌他们已经预处理了一堆东西,并缓存了像“Stack Overflow”这样的常见查询,因此已经有了解决方案页面。