2017-06-30 12 views
1

writer.update(Term t、Document doc)メソッドを使用してインデックス内のドキュメントを更新しようとしています。 アップデートは、私は言葉でTextFieldを指定した場合成功しているが、私は
用語 に私のコードのサンプルをLongPointを供給したときに失敗します。
Lucene - Writer.updateDocuments()のLongPointフィールドをTermとして使用してドキュメントを更新する

package com.luceneserver.core; 

import java.io.IOException; 

import org.apache.lucene.document.Document; 
import org.apache.lucene.document.Field.Store; 
import org.apache.lucene.document.LongPoint; 
import org.apache.lucene.document.StoredField; 
import org.apache.lucene.document.TextField; 
import org.apache.lucene.index.DirectoryReader; 
import org.apache.lucene.index.IndexReader; 
import org.apache.lucene.index.IndexWriter; 
import org.apache.lucene.index.IndexWriterConfig; 
import org.apache.lucene.index.Term; 
import org.apache.lucene.search.IndexSearcher; 
import org.apache.lucene.search.MatchAllDocsQuery; 
import org.apache.lucene.search.ScoreDoc; 
import org.apache.lucene.store.RAMDirectory; 

public class SampleDocUpdates { 

    public static void main(String[] args) throws IOException { 
     IndexWriter writer = new IndexWriter(new RAMDirectory(), new IndexWriterConfig()); 
     IndexReader reader; 
     IndexSearcher searcher; 


     // first document in the index 
     Document initialDoc = new Document(); 
     // adding a text field 
     initialDoc.add(new TextField("foo_text", "abc", Store.YES)); 
     // adding a numeric field 
     initialDoc.add(new LongPoint("foo_number", 1000)); 
     // adding stored field to display hits 
     initialDoc.add(new StoredField("foo_number", 1000)); 


     writer.addDocument(initialDoc); 


     // second document in index which should update the first one.. 
     Document newDoc = new Document(); 
     newDoc.add(new TextField("foo_text", "def", Store.YES)); 
     newDoc.add(new LongPoint("foo_number", 2000)); 
     newDoc.add(new StoredField("foo_number", 2000)); 


     // update doc with foo_text:abc with the newDoc instance. 
     writer.updateDocument(new Term("foo_text", "abc"), newDoc); 

     reader = DirectoryReader.open(writer); 
     searcher = new IndexSearcher(reader); 

     ScoreDoc[] scoreDocs = searcher.search(new MatchAllDocsQuery(), 1000).scoreDocs; 

     for (ScoreDoc scoreDoc : scoreDocs) { 
      System.out.println(searcher.doc(scoreDoc.doc).get("foo_text")+"\t"+searcher.doc(scoreDoc.doc).get("foo_number")); 
      //'def 2000' 
     } 


    } 

} 

このコードが正常に第2の文書との最初の文書を更新します。.. 。
が、私は

writer.updateDocument(新しい用語( "foo_number"、1000年)、newDoc)を使用する場合、

それが失敗した...私の要件は一意LongPointフィールドに基づいて文書を識別することにより、文書を更新する..です
ドキュメント(Luceneの6.3.0)が選択基準となどの用語でのみupdateDocumentsを()ありLongPointフィールドではありません。
これを達成する別の方法はありますか?

答えて

0

すべてupdateDocumentは、この用語を含む文書を削除してから、新しい文書を追加します。したがって、代わりにdeleteDocumentsを使用して、代わりにクエリを渡してから、addDocumentを入力して同じことを達成できます。

writer.deleteDocuments(LongPoint.newExactQuery("foo_number", 1000)); 
writer.addDocument(newDoc); 
関連する問題