4

Lucene Index からドキュメントを削除しようとしています。lucene index から指定したファイルだけを削除したい。

私の次のプログラムは、キーワードアナライザーを使用して検索できるインデックスを削除していますが、必要なファイル名は 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();}
4

3 に答える 3

11

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);
于 2013-09-19T16:37:50.937 に答える
0

@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 );
于 2018-08-31T17:30:16.440 に答える