我有一个文件夹(MY_FILES),里面有大约500个文件,每天都有一个新文件到达并放在那里。每个文件的大小约为4Mb。
我刚刚开发了一个简单的"void main"来测试我是否可以在这些文件中搜索特定的通配符。它工作得很好。
问题是我正在删除旧indexed_folder并再次重新索引。这需要很多时间,而且显然效率低下。我正在寻找的是"增量索引"。这意味着,如果索引已经存在 - 只需将新文件添加到索引中即可。
我想知道 Lucene 是否有某种机制来检查"文档"是否已被索引,然后再尝试索引它。像 writer.isDocExists?
谢谢!
我的代码如下所示:
// build the writer
IndexWriter writer;
IndexWriterConfig indexWriter = new IndexWriterConfig(Version.LUCENE_36, analyzer);
writer = new IndexWriter(fsDir, indexWriter);
writer.deleteAll(); //must - otherwise it will return duplicated result
//build the docs and add to writer
File dir = new File(MY_FILES);
File[] files = dir.listFiles();
int counter = 0;
for (File file : files)
{
String path = file.getCanonicalPath();
FileReader reader = new FileReader(file);
Document doc = new Document();
doc.add(new Field("filename", file.getName(), Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field("path", path, Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field("content", reader));
writer.addDocument(doc);
System.out.println("indexing "+file.getName()+" "+ ++counter+"/"+files.length);
}
首先,您应该使用 IndexWriter.updateDocument(Term, Document)
而不是 IndexWriter.addDocument
来更新文档,这将防止索引包含重复的条目。
若要执行增量索引,应将last-modified
时间戳添加到索引的文档,并且仅为较新的文档添加索引。
编辑:有关增量索引的更多详细信息
您的文档应至少包含两个字段:
在
- 文件的路径
- 上次修改文件时的时间戳。
开始编制索引之前,只需在索引中搜索最新的时间戳,然后对目录进行爬网,以查找时间戳比索引的最新时间戳更新的所有文件。
这样,每次文件更改时,您的索引都会更新。
如果要检查索引中是否已存在文档,一种方法可能是生成关联的 Lucene 查询,该查询将与IndexSearcher
一起使用以搜索 Lucene 索引。
例如,在这里,您可以使用字段 filename
、 path
和 content
来构建查询,以检查文档是否已存在于索引中。
除了IndexWriter
之外,您还需要一个IndexSearcher
,并遵循 Lucene 查询语法生成您将提供给 Lucene 的全文查询(例如
filename:myfile path:mypath content:mycontent
)。
IndexSearcher indexSearcher = new IndexSearcher(directory);
String query = // generate your query
indexSearcher.search(query, collector);
在上面的代码中,collector
包含一个回调方法集合,如果索引中的某些数据与查询匹配,则将使用文档 ID 调用该方法集合。