3

数値フィールドに基づいてドキュメントを更新(削除/挿入)する方法を知りたかっただけです。これまでのところ、私はこれを行いました:

LuceneManager.updateDocument(writer, new Term("id",  NumericUtils.intToPrefixCoded(sentenceId)), newDoc);

しかし、Lucene 4.0では、NumericUtilsクラスがこれに変更されましたこれは私にはよくわかりません。何か助けはありますか?

4

5 に答える 5

2

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);
于 2016-04-08T10:39:03.633 に答える
1

次のように使用できます。

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を使用してドキュメントを更新できるようになりました。

于 2013-01-24T15:50:41.873 に答える
1

Lucene 4 では、次のようにIntFieldLongFieldFloatFieldまたは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);
于 2012-12-19T18:21:54.393 に答える
0

可能であれば、ID を数値ではなくキーワード文字列として保存することをお勧めします。それが単なる一意の識別子である場合は、キーワードとしてインデックスを作成する方がはるかに理にかなっています。これにより、数値の書式設定をいじる必要がなくなります。

実際に数値として使用されている場合は、手動で更新する必要がある場合があります。つまり、更新するドキュメントを検索してフェッチし、古いドキュメントをtryDeleteDocumentで削除してから、更新されたバージョンをaddDocumentで追加します。私の知る限り、これは基本的に updateDocument が行うことです。

ただし、最初のオプションは確かに良い方法です。更新 ID として非数値フィールドを使用すると、作業が楽になります。

于 2012-12-20T18:51:17.317 に答える
0

Lucene 4.0.0のドキュメントによると、ID フィールドは StringField クラスで使用する必要があります。

「索引付けされているがトークン化されていないフィールド: 文字列値全体が単一のトークンとして索引付けされます。たとえば、これは「country」フィールドまたは「id」フィールド、またはソートに使用する予定の任意のフィールドに使用できますまたはフィールド キャッシュを介してアクセスします。」

私はあなたと同じ問題を抱えていましたが、この変更を加えることで解決しました。その後、私の更新と削除は完全に機能しました。

于 2013-07-29T16:15:12.987 に答える