以下代码不会按预期按术语删除文档:
RAMDirectory idx = new RAMDirectory();
IndexWriter writer = new IndexWriter(idx,
new SnowballAnalyzer(Version.LUCENE_30, "English"),
IndexWriter.MaxFieldLength.LIMITED);
Document doc = new Document();
doc.add(new Field("title", "mydoc", Field.Store.YES, Field.Index.NO));
doc.add(new Field("content", "some content, deleteme", Field.Store.YES, Field.Inde
x.ANALYZED));
writer.addDocument(doc);
Document doc2 = new Document();
doc2.add(new Field("title", "mydoc2", Field.Store.YES, Field.Index.NO));
doc2.add(new Field("content", "other content, don't deleteme", Field.Store.YES, Field.I
ndex.ANALYZED));
writer.addDocument(doc2);
writer.optimize();
writer.close();
/*
IndexReader reader = IndexReader.open(idx, false);
int docs_up_for_deletion = reader.docFreq(new Term("title"));
int before = reader.numDocs();
int docs_deleted = reader.deleteDocuments(new Term("title", "mydoc"));
reader.close();
*/
IndexWriter writer2 = new IndexWriter(idx,
new SnowballAnalyzer(Version.LUCENE_30, "English"),
IndexWriter.MaxFieldLength.LIMITED);
int before = writer2.numDocs();
writer2.deleteDocuments(new Term("title", "mydoc"));
writer2.commit();
writer2.optimize();
int after = writer2.numDocs();
writer2.close();
int docs_deleted = before - after;我尝试过用IndexReader和IndexWriter删除,但都不起作用。
我还尝试在上面的代码后面添加另一个IndexReader搜索,以防只有在关闭writer2 (在this FAQ中提到)之后才更新数字,但这没有帮助。执行writer.deleteAll()是可行的,但不是按术语删除。
我发现了一个旧的引用,即只有Field.Keyword类型的字段可以删除,但在Lucene3.x中这不再是有效的字段类型
发布于 2010-09-15 01:01:53
您的标题字段未编制索引。变化
new Field("title", "mydoc", Field.Store.YES, Field.Index.NO)至
new Field("title", "mydoc", Field.Store.YES, Field.Index.ANALYZED)或
new Field("title", "mydoc", Field.Store.YES, Field.Index.NOT_ANALYZED)这取决于您是否希望分析您的字段。
https://stackoverflow.com/questions/3710941
复制相似问题