当前位置: 首页 > 知识库问答 >
问题:

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

海鸣
2023-03-14

我正在尝试从Lucene索引中删除文档。我只想从lucene索引中删除指定的文件。

我下面的程序是删除可以使用关键字分析器搜索的索引,但是我需要的文件名只能使用标准分析器搜索。因此,它是任何方式设置标准分析器在我的任期或代替任期如何使用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个答案

吕鸿文
2023-03-14

正如@dillippattnaik所指出的,多个术语会导致OR。我已经更新了他的代码,并使用BooleanQuery:

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 );
叶鸿煊
2023-03-14

为像我这样的人添加文档以供将来参考,在indexWriter上可以删除文档,您可以使用

索引编写器。删除文件(术语…术语)

而不是使用deleteDocuments(查询)方法;如果您只需要匹配一个字段,则可以减少麻烦。请注意,如果传递了多个术语,此方法将术语视为条件或条件。因此,它将匹配任何术语并删除所有记录。下面的代码将匹配存储的文档中的state=Tx,并将删除匹配的记录。

  indexWriter.deleteDocuments(
        new Term("STATE", "Tx")
      );

对于将不同字段与和条件组合,我们可以使用以下代码:

 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());
尹雅健
2023-03-14

我假设您使用的是Lucene 3.6或更早版本,否则IndexReader。删除文档不再存在。无论如何,您应该使用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);
 类似资料:
  • 问题内容: 我需要 从多个Lucene索引中 提取 频率最高的术语 ,以将其用于某些语义分析。 因此,我想获取可能出现次数最多的前30个词(仍未决定阈值,我将分析结果)及其按索引计数。我知道由于故意删除重复项,我可能会失去一些精度,但是就目前而言,我可以接受。 因此,对于所提出的解决方案,(不必说可能)速度并不重要,因为我会进行静态分析,所以我会强调实现的 简便性 ,因为我不太了解Lucene,也

  • 我是lucene的新用户,现在正试图获得一些基础知识。 null 这就是我如何将文档添加到索引中的方法: 如何让lucene索引也文件名?

  • 本文向大家介绍如何使用Java在MongoDB中删除索引?,包括了如何使用Java在MongoDB中删除索引?的使用技巧和注意事项,需要的朋友参考一下 在MongoDB中删除索引,您需要使用dropIndex()方法。 语法 在Java中,可以使用dropIndex()方法删除索引,您需要将索引的类型(升序或降序)和在其上创建字段的名称传递给该方法。 示例 输出结果

  • 我可以使用Lucene查询ElasticSearch索引吗? 我使用ElasticSearch创建了一个索引,并插入了以下三个文档: null 不幸的是,d.get(“_source”)也返回null。 如何检索匹配查询的文档字段? 谢谢你。