搜索引擎的第一步,做一个自己的全文引擎,所谓的全文引擎,就是一个倒排表,所谓的倒排表,就是指从词到文档的索引。对于我们通常的文章来讲,是一个文章包含了很多的词,也就是说,文章是关键字,词是内容。那么当我们需要在很多文章中找到所有存在某一个词的文章的时候,在没有倒排索引的情况下,问题出现了,我们必须使用这个词去匹配所有文章的内容,这个效率显然是不能忍受的。这个时候就是倒排索引闪亮登场的时候了,倒排索引就是词是关键字,内容是所有包含这个关键字的文档和位置信息。所以,从理论上来讲,建所引的过程就是从:
Doc => (Word1,Word2....) 转换成
Word1 => (Doc1,Doc2....)的过程。
转换的时候,需要考虑一个性能的问题,因为对于一个文档中的每一个词,首先要做得事情就是察看这个词是不是在文章中已经出现过。这里实际上有两个相似的操作,第一个操作是把这个文章的词转换成倒排的格式,第二个操作是把第一步产生的倒排索引合并到达的索引上面去。我觉得还是分开两部操作比较好,因为如果一次性的把文章中出现的词合并到大的索引上面去,会出现很多次没有必要的比较,从而降低性能。
为了提高创建索引的性能,我想在这里使用一个平衡二叉树,把所有的词作为这个平衡二叉树的节点,这样的话,插入一个节点比较的次数将是ln(n)次的比较,会比线形的n有很大的改善。明天是周末,把这个代码实现了。
To be continued.
Doc => (Word1,Word2....) 转换成
Word1 => (Doc1,Doc2....)的过程。
转换的时候,需要考虑一个性能的问题,因为对于一个文档中的每一个词,首先要做得事情就是察看这个词是不是在文章中已经出现过。这里实际上有两个相似的操作,第一个操作是把这个文章的词转换成倒排的格式,第二个操作是把第一步产生的倒排索引合并到达的索引上面去。我觉得还是分开两部操作比较好,因为如果一次性的把文章中出现的词合并到大的索引上面去,会出现很多次没有必要的比较,从而降低性能。
为了提高创建索引的性能,我想在这里使用一个平衡二叉树,把所有的词作为这个平衡二叉树的节点,这样的话,插入一个节点比较的次数将是ln(n)次的比较,会比线形的n有很大的改善。明天是周末,把这个代码实现了。
To be continued.