如何使用Term或QueryParser从Lucene索引中删除文档
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Term或QueryParser从Lucene索引中删除文档相关的知识,希望对你有一定的参考价值。
我正在尝试从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();}
我假设您使用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);
添加以供像我这样的人使用,其中删除文档在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());
正如@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 );
以上是关于如何使用Term或QueryParser从Lucene索引中删除文档的主要内容,如果未能解决你的问题,请参考以下文章
Lucene系列:(10)多条件搜索 QueryParser