gpt4 book ai didi

java - Lucene 3.0.3 不删除文件

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:31:10 25 4
gpt4 key购买 nike

我们使用 Lucene 来索引一些内部文档。有时我们需要删除文件。这些文档有一个唯一的 id,并由 DocItem 类表示,如下所示(所有代码都是一个简化版本,只有重要的(我希望)部分):

public final class DocItem {

public static final String fID = "id";
public static final String fTITLE = "title";

private Document doc = new Document();
private Field id = new Field(fID, "", Field.Store.YES, Field.Index.ANALYZED);
private Field title = new Field(fTITLE, "", Field.Store.YES, Field.Index.ANALYZED);

public DocItem() {
doc.add(id);
doc.add(title);
}

... getters & setters

public getDoc() {
return doc;
}
}

因此,为了索引文档,将创建一个新的 DocItem 并将其传递给索引器类,如下所示:

public static void index(DocItem docitem) {
File file = new File("indexdir");
Directory dir= new SimpleFSDirectory(file);
IndexWriter idxWriter = new IndexWriter(dir, new StandardAnalyzer(Version.LUCENE_30), IndexWriter.MaxFieldLength.UNLIMITED);
idxWriter.addDocument(docitem.getDoc());
idxWriter.close();
}

我们创建了一个辅助方法来遍历索引目录:

public static void listAll() {
File file = new File("indexdir");
Directory dir = new SimpleFSDirectory(file);
IndexReader reader = IndexReader.open(dir);

for (int i = 0; i < reader.maxDoc(); i++) {
Document doc = reader.document(i);
System.out.println(doc.get(DocItem.fID));
}
}

运行 listAll,我们可以看到我们的文档正在被正确索引。至少,我们可以看到 id 和其他属性。

我们使用 IndexSearcher 检索文档,如下所示:

public static DocItem search(String id) {
File file = new File("indexdir");
Directory dir = new SimpleFSDirectory(file);
IndexSearcher searcher = new IndexSearcher(index, true);
Query q = new QueryParser(Version.LUCENE_30, DocItem.fID, new StandardAnalyzer(Version.LUCENE_30)).parse(id);
TopDocs td = searcher.search(q, 1);
ScoreDoc[] hits = td.scoreDocs;
searcher.close();
return hits[0];
}

因此在检索到它之后,我们尝试使用以下方法删除它:

public static void Delete(DocItem docitem) {
File file = new File("indexdir");
Directory dir= new SimpleFSDirectory(file);
IndexWriter idxWriter = new IndexWriter(dir, new StandardAnalyzer(Version.LUCENE_30), IndexWriter.MaxFieldLength.UNLIMITED);
idxWriter.deleteDocuments(new Term(DocItem.fID, docitem.getId()));
idxWriter.commit();
idxWriter.close();
}

问题是它不起作用。该文档永远不会被删除。如果我在删除后运行 listAll(),文档仍然存在。我们尝试使用 IndexReader,但运气不佳。

通过这个post还有这个post , 我们认为我们正在使用它。

我们做错了什么?有什么建议吗?我们使用的是 lucene 3.0.3 和 java 1.6.0_24。

TIA,

鲍勃

最佳答案

我建议使用 IndexReader DeleteDocumets , 它返回删除的文档数。这将帮助您缩小删除是否在第一次计数时发生的范围。

与 indexwriter 方法相比,它的优势在于它返回已删除的文档总数,如果没有则返回 0。

另见 How do I delete documents from the index?this发布

编辑:我还注意到您以只读模式打开索引阅读器,您可以更改 listFiles() 索引阅读器吗 open 第二个参数为 false,这将允许读写,这可能是错误的来源

关于java - Lucene 3.0.3 不删除文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5515087/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com