代码之家  ›  专栏  ›  技术社区  ›  adesh singh

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

  •  5
  • adesh singh  · 技术社区  · 12 年前

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

    我下面的程序正在删除可以使用关键字分析器搜索的索引,但我所需的文件名只能使用StandardAnalyzer搜索。那么,在我的术语中设置标准分析器有什么方法吗?或者我如何使用QueryParser从lucene索引中删除Documents。

     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 回复  |  直到 12 年前
        1
  •  13
  •   femtoRgon    12 年前

    我认为您使用的是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);
    
        2
  •  1
  •   dillip    9 年前

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

    indexWriter.deleteDocuments(术语…术语)

    而不是使用deleteDocuments(query)方法;如果你只需要匹配一个字段,那么麻烦就少了。 请注意,如果传递了多个术语,则此方法将术语视为OR条件 。因此,它将匹配任何术语,并将删除所有记录。下面的代码将匹配存储的文档中的状态=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());
    
        3
  •  0
  •   Gerhard Powell    7 年前

    正如@dillippattnaik所指出的,多个术语导致 。我已经更新了他的代码 以及 使用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 );