0

背景问题实现文档的搜索引擎


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

我的第一种方法(天真和不可扩展):


由于允许用户上传文件,每当我收到一个文档,我找了“势”的关键字和存储关键字作为关键并将其记录为值对或MYSQL表中。显然,这必须手动完成,看起来不像程序员会做什么。

我的第二个方法(稍好):


我把每个文档,扫描它的每一个字,该字添加到特里数据结构,因此对于100个文件我必须搜寻100尝试,如果查询的长度为l,则此方法将采用最差的O(所有文档中的字数*最大的单词长度)来构建查询树并查询O(查询的长度)。这很合理。 为了实现这个功能,我会为每个文档保留一个Trie根节点的向量,并遍历每个trie节点并在每个trie中进行搜索。如果至少有一半的查询词匹配,我将该文档存储为潜在结果。作为结果,我不会给出超过某些截止数量的文件。

我的问题给社区:


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

+0

看看[elasticsearch](https://www.elastic.co/)。它具有极高的可扩展性,应该完美地适合您的项目。 – CaptainTrunky

+0

@CaptainTrunky,请不要使用这个库,这个项目的全部内容都是由我自己来完成的。如果你能说出弹性搜索的核心是什么,对我来说是有用的。 –

+0

对于每个1000个单词和每秒1个请求的100个文档,grep应该就足够了。如果您坚持某种索引策略,请维护一个按字和二进制排序的(字,文档集)对列表。这可能只是一个文件。 –

回答

0

实现全文搜索的最基本的方法是建立一个inverted index和等级相符的文件与指标,如TF-IDF

随着新文件进来,你的文档中提取文字和文档添加到您的倒排索引。

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

除此之外,在Information Retrieval字段中有大量的研究使得操作更高效,并使结果(top-k文档)更好。