我正在尝试从Lucene Index中删除文档。 我想只从lucene索引中删除指定的文件。
我的以下程序正在删除可以使用关键字分析器搜索的索引,但只能使用StandardAnalyzer搜索我所需的文件名。那么在我的术语中设置标准分析器的方法是什么,或者代替术语我如何使用QueryParser从lucene索引中删除文档。
try{
File INDEX_DIR= new File("D:\\merge lucene\\abc\\");
Directory directory = FSDirectory.open(INDEX_DIR);
IndexReader indexReader = IndexReader.open(directory,false);
Term term= new Term("path","fileindex23005.htm");
int l= indexReader.deleteDocuments(term);
indexReader.close();
System.out.println("documents deleted");
}
catch(Exception x){x.printStackTrace();}
答案 0 :(得分:9)
我假设您使用的是Lucene 3.6或之前,否则IndexReader.deleteDocuments
不再存在。但是,无论如何,你应该使用IndexWriter。
如果您只能使用查询解析器找到该文档,那么只需运行一个普通查询,然后遍历返回的文档,然后通过docnum删除它们,如下所示:
Query query = queryParser.parse("My Query!");
ScoreDoc[] docs = searcher.search(query, 100).scoreDocs;
For (ScoreDoc doc : docs) {
indexReader.deleteDocument(doc.doc);
}
或者更好(更简单,使用非解散,不推荐使用的功能),只需使用IndexWriter
,然后直接传递查询:
Query query = queryParser.parse("My Query!");
writer.deleteDocuments(query);
答案 1 :(得分:1)
为像我这样的人添加以供参考,其中删除文档在indexWriter上,您可以使用
indexWriter.deleteDocuments(Term ... terms)
而不是使用deleteDocuments(查询)方法;如果你只需要匹配一个字段就可以减少麻烦。 请注意,如果传递多个术语,此方法会将术语视为OR条件。因此它将匹配任何术语并将删除所有记录。下面的代码将匹配存储的文档中的state = Tx,并将删除匹配的记录。
indexWriter.deleteDocuments(
new Term("STATE", "Tx")
);
为了将不同的字段与AND条件组合,我们可以使用以下代码:
BooleanQuery.Builder builder = new BooleanQuery.Builder();
//note year is stored as int , not as string when document is craeted.
//if you use Term here which will need 2016 as String, that will not match with documents stored with year as int.
Query yearQuery = IntPoint.newExactQuery("year", 2016);
Query stateQuery = new TermQuery(new Term("STATE", "TX"));
Query cityQuery = new TermQuery(new Term("CITY", "CITY NAME"));
builder.add(yearQuery, BooleanClause.Occur.MUST);
builder.add(stateQuery, BooleanClause.Occur.MUST);
builder.add(cityQuery, BooleanClause.Occur.MUST);
indexWriter.deleteDocuments(builder.build());
答案 2 :(得分:0)
正如@dillippattnaik所指出的,多个术语导致 OR 。我已经使用BooleanQuery更新了他的代码以使其 AND :
BooleanQuery query = new BooleanQuery
{
{ new TermQuery( new Term( "year", "2016" ) ), Occur.MUST },
{ new TermQuery( new Term( "STATE", "TX" ) ), Occur.MUST },
{ new TermQuery( new Term( "CITY", "CITY NAME" ) ), Occur.MUST }
};
indexWriter.DeleteDocuments( query );