数値フィールドに基づいてドキュメントを更新(削除/挿入)する方法を知りたかっただけです。これまでのところ、私はこれを行いました:
LuceneManager.updateDocument(writer, new Term("id", NumericUtils.intToPrefixCoded(sentenceId)), newDoc);
しかし、Lucene 4.0では、NumericUtilsクラスがこれに変更されました。これは私にはよくわかりません。何か助けはありますか?
Lucene 5.x では、これは以下のコードで解決できます。
int id = 1;
BytesRefBuilder brb = new BytesRefBuilder();
NumericUtils.intToPrefixCodedBytes(id, 0, brb);
Term term = new Term("id", brb.get());
indexWriter.updateDocument(term, doc); // or indexWriter.deleteDocument(term);
次のように使用できます。
FieldType
まず、の数値型を設定する必要があります。
FieldType TYPE_ID = new FieldType();
...
TYPE_ID.setNumericType(NumericType.INT);
TYPE_ID.freeze();
その後:
int idTerm = 10;
BytesRef bytes = new BytesRef(NumericUtils.BUF_SIZE_INT);
NumericUtils.intToPrefixCoded(id, 0, bytes);
Term idTerm = new Term("id", bytes);
idTerm
を使用してドキュメントを更新できるようになりました。
Lucene 4 では、次のようにIntField、LongField、FloatFieldまたはDoubleFieldを作成できるようになりました。
document.add(new IntField("id", 6, Field.Store.NO));
変更したドキュメントを記述するには、次のようにします。
indexWriter.updateDocument(new Term("pk", "<pk value>"), document);
編集: そして、この数値フィールドを含むクエリを作成する方法は次のとおりです。
// Query <=> id <= 7
Query query = NumericRangeQuery.newIntRange("id", Integer.MIN_VALUE, 7, true, true);
TopDocs topDocs = indexSearcher.search(query, 10);
可能であれば、ID を数値ではなくキーワード文字列として保存することをお勧めします。それが単なる一意の識別子である場合は、キーワードとしてインデックスを作成する方がはるかに理にかなっています。これにより、数値の書式設定をいじる必要がなくなります。
実際に数値として使用されている場合は、手動で更新する必要がある場合があります。つまり、更新するドキュメントを検索してフェッチし、古いドキュメントをtryDeleteDocumentで削除してから、更新されたバージョンをaddDocumentで追加します。私の知る限り、これは基本的に updateDocument が行うことです。
ただし、最初のオプションは確かに良い方法です。更新 ID として非数値フィールドを使用すると、作業が楽になります。
Lucene 4.0.0のドキュメントによると、ID フィールドは StringField クラスで使用する必要があります。
「索引付けされているがトークン化されていないフィールド: 文字列値全体が単一のトークンとして索引付けされます。たとえば、これは「country」フィールドまたは「id」フィールド、またはソートに使用する予定の任意のフィールドに使用できますまたはフィールド キャッシュを介してアクセスします。」
私はあなたと同じ問題を抱えていましたが、この変更を加えることで解決しました。その後、私の更新と削除は完全に機能しました。