问题背景
大家好,我正在开发一个项目,根据提供的查询在一堆文档中搜索相关文档。由于这是一个迷你项目,我有一个典型的内存架构,我假设我没有更多的100个文档,每个文档包含不超过1000个单词(一个单词不超过10个字符)。我收到很多查询,我必须尽可能快地处理查询(绝对不超过一秒)。
我的第一种方法(天真和不可扩展):
由于允许用户上传文档,每当我收到文档时,我会查找“潜在”关键字并将关键字存储为键和文档作为值对或存储在MYSQL表中。显然,这必须手动完成,而不是像程序员那样。
我的第二种方法(稍好一点):
我收集每个文档,扫描它的每个单词并将此单词添加到Trie Data结构中,因此对于100个文档,我必须搜索100个Tries,如果查询的长度为l,则此方法将采用最差的O(所有文档中的单词数*最大单词的长度)构建trie和查询O(查询的长度)。这很合理。 为了实现这一点,我将Trie根节点的向量保存到每个文档,并迭代每个trie节点并在每个trie中搜索。如果我得到匹配的查询的至少一半的单词,我将该文档存储为潜在结果。因此,我不会给出一些截止数量的文件。
我的社区问题:
我会问你对我的方法怎么看?如何优化它们,我可以在现有方法中做哪些其他改进?使用其他算法或数据结构可以更有效地完成这项工作吗? 浏览网页我遇到了像Boyer-Moore和Aho-Corasick这样的算法以及调整Lucene Apache实现的算法的一些建议等。你在这里有什么建议?
答案 0 :(得分:2)
实施全文搜索的最基本方法是构建inverted index并使用TF-IDF等指标对匹配的文档进行排名
随着新文档的出现,您将提取文档中的单词并将文档添加到倒排索引中。
当查询进入时,您会从索引中找到匹配的文档,并根据TF-IDF(或您关注的其他指标)执行一些排序。然后,您将返回k排名靠前的文档作为查询结果。
除此之外,Information Retrieval领域的大量研究使得操作更有效,并且使结果(top-k文档)更好。