如何使用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的QueryParser

Lucene系列:(10)多条件搜索 QueryParser

Wordpress-如何从 term_ID 获取术语名称?

Lucene 高阶查询的六脉神剑 —— QueryParser

Plackett-Luce模型算法介绍

L'opzione di luce del puntatore laser