2016-09-23 18 views
1

データベースから取得した値のLuceneインデックスを作成しています。私はインデックスOpenModeOpenMode.CREATE_OR_APPENDと設定しました。Lucene 6.0の重複したドキュメントのインデックス作成を避ける方法

索引作成ステップは、バッチ・バッチ・ジョブの一部です。

私の理解では、私が最初にジョブを実行する場合、インデックスはしばらく時間がかかるかもしれませんが、私は同じ未変更のソースデータのために再びジョブを再実行したときに文書がすでに存在するため、それが高速であるべきであるということであるので、UPDATE OR INSERTは実行されていません。

私の場合、の同じ変更されていないソースデータの後続のインデックス作成の試みは、遅くなり、遅くなります。

への回答this questionは、用語に基づいて自動的にが処理されると言います。

これを処理するために私の場合に用語を定義する方法はわかりません。以下は

私のサンプルコードは、私は元データに変化がないとき、インデックス作成を行わないために、上記のコードに変更する必要がありますどのような

 public Integer createIndex(IndexWriter writer, String str, LuceneIndexerInputVO luceneInputVO) throws Exception { 
      Integer count = 0; 
      Document d = null; 
      txtFieldType.setTokenized(false); 
      strFieldType.setTokenized(false); 

      List<IndexVO> indexVO = null; 

      indexVO = jdbcTemplate. 
        query(Constants.SELECT_FROM_TABLE1, 
          new Object[] {luceneInputVO.getId1(), luceneInputVO.getId2(), str}, 
          new IndexRowMapper()); 

      while (!indexVO.isEmpty()) { 
       d = new Document(); 
       d.add(getStringField(Constants.ID, String.valueOf(luceneInputVO.getId()))); 
       ..... 
       .... 
       writer.addDocument(d); 
       indexVO.remove(indexVO.get(count)); 
       count++; 
      } 
      return count; 
     } 

私はLuceneの初心者であり、二重性を決定する方法はTermを定義する方法は不明です。

インデックスを再作成する必要はありません。Documentがインデックスに既に存在する場合は、新しいDocumentをスキップする(何もしない)ことをお勧めします。

EDIT -私は長い質問をしますが、いくつかのLuceneに関する質問のためのSO読んだ後、私は重複の回避に焦点を当てたが、文書がRDBMSの列を表している間、私は単に増分インデックスアプローチを求めていますことを実現主キーを有するテーブル。 DB行が変更されている場合は、そうでない場合はドキュメントを更新し、新しい行のドキュメントを追加します。

Question 1Question 2

+0

'id'フィールドはドキュメントを識別します。一意のIDがない場合は、インポートする前に独自のロジックで確認する必要があります。 –

+0

'Document'の' id'をどのようにコードするのですか?この場合、すべての 'Fields'を組み合わせると' Document'が識別されます。私は、 'new Term(...、...)'のようなものを定義する必要があると思います。 –

+0

いいえ、SolrJを使用している場合は、ドキュメントのIDを指定するために、単に 'SolrInputDocument'を作成し、 'doc.setField( "ID"、...);' –

答えて

4

私はtermごとに見つかった場合、文書がすでに既存のドキュメントを存在し、更新していない場合はLucene 6.0.0、IndexWriter.updateDocument(Term term,Document doc);に新しいドキュメントを追加することを確認しました。

私の必要条件として、keyフィールドを定義しました。これは基本的にDocumentの他のすべての値フィールドの連結です。このようにして、keyは、内容が重複していることを識別する。すなわち、同一のkeyを有する2つの文書は、文書が内容重複した重複であることを意味する。

私はこのkey値にIndexWriter.updateDocument(Term term,Document doc);に渡されるtermを構築し、ちょうどIndexWriter.updateDocument(Term term,Document doc);の代わりIndexWriter.addDocument(Document doc)を呼び出して、問題を解決します。

関連する問題