如何对大量的txt文件进行索引?(Java/C/C++)

4
我需要对大量文本进行索引。搜索结果必须给出包含查询的文件名称以及每个文件中匹配查询的所有位置 - 这样,我就不必加载整个文件来查找匹配部分。您可以推荐哪些库来完成这项工作?
更新:已经有人建议使用Lucene。您能否给我一些关于如何使用Lucene实现这一点的信息?(我看到了一些示例,其中搜索查询仅返回匹配的文件)

查询是否只包含一个词?还是您希望直接查找整个段落? - Benoît
查询可以包含多个单词。 - George
当一个查询包含多个单词时,您是否期望它们在返回的文件中按相同顺序找到,还是不一定? - Benoît
我需要它们按照相同的顺序被找到。即使是一个单词的方法也可以帮助我尝试为每个单词匹配周围的内容。 - George
这是我考虑过的用于多个单词查询的选项。 - Benoît
显示剩余2条评论
8个回答

8

如果需要使用Java,可以尝试使用Lucene


2
这完全取决于你将如何访问它。当然,还要考虑将有多少人访问它。请阅读关于MapReduce的内容。
如果你要自己创建,你需要创建一个索引文件,它是唯一单词和类似于(文件、行、偏移量)的元组之间的映射。当然,你可以想到其他的内存数据结构,比如trie(前缀树)、Judy array等等……
一些第三方解决方案在这里列出。

2

Lucene - Java

Lucene是开源的,因此您可以自由地在应用程序中使用和部署。

据我所知,Eclipse IDE 的帮助文件由Lucene提供支持-已经通过了数百万次测试。


2

请看一下http://www.compass-project.org/,它可以被视为Lucene的一个封装,Compass简化了Lucene的常见使用模式,比如Google风格的搜索,索引更新以及更高级的概念,如缓存和索引分片(子索引)。Compass还使用了并发提交和合并的内置优化。

有关详细信息,请参见概述页面:http://www.compass-project.org/overview.html

我已经将其轻松集成到Spring项目中。它非常容易使用,并且能够给您的用户提供类似于Google的搜索结果。


2
我相信您要查找的Lucene术语是“highlighting”。这里有一份关于Lucene高亮的最新报告。为了获取您要查找的片段,您可能需要存储单词位置信息。Token API可能会有所帮助。请参考以下链接:highlightingLucene highlightingToken API

2

0

你为什么不尝试通过读取所有文件来构建一个状态机呢?状态之间的转换将是字母,而状态将是终态(一些文件包含所考虑的单词,在这种情况下,列表可在那里获得)或者中间态。

至于多单词查找,您必须在交集结果之前单独处理它们。

我相信Boost::Statechart库可能对此有所帮助。


我不认为状态机会很有效率。 - George
为什么不呢?如果它的效率不如你所期望的那样高,你可以添加更复杂的转换(字符串)。它只是一个二叉树。你可以决定它的大小并尽可能地平衡它! - Benoît

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接