实现文档搜索引擎

hul*_*aba 4 algorithm search full-text-search search-engine data-structures

问题背景


大家好,我正在根据提供的查询在一堆文档中搜索相关文档的项目。由于这是一个小型项目,我有一个典型的内存架构,我假设我没有超过 100 个文档,每个文档包含不超过 1000 个单词(一个单词不超过 10 个字符)。我收到很多查询,我必须尽可能快地处理查询(绝对不超过一秒)。

我的第一种方法(幼稚且不可扩展):


由于允许用户上传文档,每当我收到文档时,我都会查找“潜在”关键字并将关键字存储为键,将文档存储为值对或存储在 MYSQL 表中。显然,这必须手动完成,看起来不像程序员会做的。

我的第二种方法(稍微好一点):


我获取每个文档,扫描其中的每个单词并将这个单词添加到 Trie 数据结构中,因此对于 100 个文档,我必须搜索 100 次尝试,如果查询的长度为 l,则这种方法将采用最坏的 O(单词数)跨所有文档*最大单词的长度)以构建特里树并查询 O(查询长度)。这是很合理的。为了实现这一点,我将在每个文档中保留一个 Trie 根节点向量,并迭代每个 trie 节点并在每个 trie 中搜索。如果我得到至少一半的查询词匹配,我就会将该文档存储为潜在结果。结果,我不会提供超过一些截止数量的文件。

我对社区的问题:


我会问你如何看待我的方法?我如何优化它们,我可以在现有方法中做哪些其他改进?通过使用其他算法或数据结构可以更有效地完成这项工作吗?在网上冲浪时,我遇到了像 Boyer-Moore 和 Aho-Corasick 这样的算法,以及一些调整 Lucene Apache 实现的算法等的建议。你在这里有什么建议?

Che*_*ang 5

实现全文搜索最基本的方法是构建倒排索引并使用TF-IDF等指标对匹配文档进行排名

当新文档进来时,您提取文档中的单词并将文档添加到倒排索引中。

当查询进来时,您会从索引中找到匹配的文档,并根据 TF-IDF(或您关心的其他指标)执行一些排序。然后,您返回 k 个排名靠前的文档作为查询的结果。

除此之外,信息检索领域的大量研究使操作更高效,并使结果(top-k 文档)更好。