如何使用Term或QueryParser从Lucene索引中删除文档

时间:2013-09-19 10:30:02

标签: lucene indexing

我正在尝试从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();}

3 个答案:

答案 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 );