我需要索引很多文字。搜索结果必须给出包含查询的文件的名称以及查询在每个文件中匹配的所有位置 - 因此,我不必加载整个文件来查找匹配部分。你可以推荐哪些图书馆这样做?
更新:Lucene已被建议。你能告诉我一些关于我应该如何使用Lucene实现这一目标的信息吗? (我见过搜索查询只返回匹配文件的例子)
答案 0 :(得分:8)
对于java,请尝试Lucene
答案 1 :(得分:2)
这完全取决于您将如何访问它。当然,有多少人会访问它。阅读MapReduce。
如果你打算自己动手,你需要创建一个索引文件,它是一个独特的单词和一个元组之间的映射(文件,行,偏移)。当然,您可以考虑其他内存数据结构,如trie(前缀树)和Judy array等...
列出了一些第三方解决方案here。
答案 2 :(得分:2)
答案 3 :(得分:2)
看看http://www.compass-project.org/它可以作为Lucene顶部的包装器,Compass简化了Lucene的常见使用模式,例如谷歌式搜索,索引更新以及更高级的概念,如缓存和索引分片(子索引)。 Compass还使用内置优化进行并发提交和合并。
概述可以为您提供更多信息 http://www.compass-project.org/overview.html
我已经很快将它整合到一个弹簧项目中。它非常易于使用,并且可以让用户看到谷歌般的结果。
答案 4 :(得分:2)
我相信你所寻求的术语是highlighting。这是a very recent report on Lucene highlighting。您可能需要存储字位置信息才能获得您要查找的片段。 Token API可能会有所帮助。
答案 5 :(得分:2)
另请查看Lemur Toolkit。
答案 6 :(得分:0)
为什么不尝试通过读取所有文件来构建状态机?状态之间的转换将是字母,状态将是最终的(某些文件包含所考虑的单词,在这种情况下列表可用于那里)或中间。
就多字查找而言,在交叉结果之前,您必须独立处理它们。
我相信Boost::Statechart库可能对此有所帮助。
答案 7 :(得分:0)
我知道你要求建立一个图书馆,只是想指出building an inverted index的基本概念(来自Introduction to Information Retrieval的Christopher D. Manning,Prabhakar Raghavan和HinrichSchütze)。