部分ドキュメントの更新に関する疑問点[アトミックアップデート vs インプレースアップデート] | KandaSearch Community Support Forum

部分ドキュメントの更新に関する疑問点[アトミックアップデート vs インプレースアップデート]

トピック作成者:ks-solruserml-bot (2025/04/30 10:57 投稿)
9
OpenOpen

(The bot translated the original post https://lists.apache.org/thread/34s12kxbxqlnpo8b5r8hd2o21cdbpdy7 into Japanese and reposted it under Apache License 2.0. The copyright of posted content is held by the original poster.)

皆さん、こんにちは。

私たちは現在、インプレースアップデートを使ってインデックス処理の高速化を図る PoC(概念実証)を実施しています。
バージョン:v9.6.1

Solr におけるアトミックアップデートおよびインプレースアップデートの実装方法について、いくつか疑問点があります。

参照した Solr ドキュメント:
https://solr.apache.org/guide/solr/latest/indexing-guide/partial-document-updates.html

ドキュメントによると、

アトミックアップデート:
これは stored=true または docValues=true のフィールドで機能し、ドキュメント全体を再インデックスせずに、フィールド単位で更新されます。

インプレースアップデート:
これはインデックスされておらず、保存されてもいないフィールド(indexed=false, stored=false)で機能し、こちらもフィールド単位での更新となります。

  1. つまり、このフィールドは検索も表示もできないということになります。
     → この点について、この仕様がどのように役立つのか教えていただけませんか?

  2. インプレースアップデートのセクションに矛盾しているように思える記述を見つけました:
    リンク

通常のアトミックアップデートでは、更新を適用する際にドキュメント全体が内部的に再インデックスされます。しかしこの方法(インプレースアップデート)では、更新されるフィールドだけが影響を受け、それ以外のドキュメントは内部的に再インデックスされません。

これはアトミックアップデートの基本的な考え方と矛盾していませんか?

もし私たちが何か見落としていることがあれば教えてください。

よろしくお願いいたします。
Uday Kumar

返信投稿者:ks-solruserml-bot (2025/04/30 10:57 投稿)
  1. そのようなフィールド(インデックスも保存もされていないフィールド)は、少なくともレンジクエリパーサーでクエリされる可能性がありますが、私の記憶が正しければ(間違っているかもしれません)、通常の term:query 構文においてもそのようなフィールドを扱う処理があるはずです。

  2. はい。私には明確に理解できています。矛盾は感じません。

実験結果が出たら、ぜひ共有してください。

よろしくお願いします、
Mikhail Khludnev

返信投稿者:ks-solruserml-bot (2025/04/30 10:58 投稿)

了解しました!

では、まとめとして:

フィールドを更新する必要がある場合、

  • 従来のアップデート(traditional update)の場合:
    すべてのフィールドが変更され、ドキュメント全体が再インデックス/置換される。

  • アトミックアップデート(atomic update)の場合:
    特定のフィールドが変更されるが、ドキュメント全体が再インデックスされる。

  • インプレースアップデート(in-place update)の場合:
    特定のフィールドのみが変更され、そのフィールドだけが再インデックスされる。

私の理解は正しいでしょうか…?

よろしくお願いいたします。
Uday Kumar

返信投稿者:ks-solruserml-bot (2025/04/30 10:58 投稿)

はい。「アトミックアップデート(atomic update)」の唯一の利点は、アップデート時にすべてのフィールドを送信する必要がないという点です。しかし、実際にはすべてのフィールドが再解析されます(リクエストに含まれていないフィールドは、格納された値から復元されます)し、再インデックスもされます。これは、パフォーマンス向上というよりも、利便性のための機能です。

インプレースアップデート(in-place update) は DocValues のみに対して行われます。それらは新しい値で上書きされ、ドキュメントの他の部分には影響を与えません。

eコマースのユースケースとしては、在庫数や価格情報のように変動しやすい数値データが該当します。これらの値はフィルターやファセットにも使用できますし、ドキュメントレスポンスの一部として取得することも可能です。

返信投稿者:ks-solruserml-bot (2025/04/30 10:58 投稿)

確認ありがとうございます。

返信投稿者:ks-solruserml-bot (2025/04/30 10:58 投稿)

こんにちは、
インプレースアップデートのPoCの一環として、スキーマと機能をテストするために、さまざまなファンクションクエリを使用してクエリを実行しています。

サンプルスキーマ:

<fieldType name="int" class="solr.IntPointField" omitNorms="true"
positionIncrementGap="0" docValues="true"/>
<field name="InPlaceField" type="int" indexed="false" stored="false"
required="false" omitNorms="true" multiValued="false"/>

確認したこと:
termfreq() 関数は PointField では機能せず、常に "0" を返します。

サンプルクエリ:

q.alt=*:*&fl=testValue:*termfreq(InPlaceField,699)*

機能しなかった他の関数:

  • sumtotaltermfreq()
  • tf()
  • totaltermfreq() など

このリンク(https://issues.apache.org/jira/browse/SOLR-13757)を見つけましたが、そこでサポートされていないことが記載されています。

Solr のパフォーマンスに影響を与えずに、これに代わる方法はありますか?

よろしくお願いいたします。
Uday Kumar

返信投稿者:ks-solruserml-bot (2025/04/30 10:59 投稿)

これらの term* 関数は、本質的にインデックス付きフィールド(反転インデックス)用のものです。
ポイントフィールドや DocValues カラムに対して、これらを実装することが本当に可能なのか疑問です。

よろしくお願いします
Mikhail Khludnev

返信投稿者:ks-solruserml-bot (2025/04/30 10:59 投稿)

こんにちは、Uday さん

特定の数値がドキュメント内の(DocValues の)フィールドにどれくらいの頻度で現れるかを知りたいということですが、
そのような情報を必要とするユースケースが何かあるのでしょうか?興味があります。

Matt

返信投稿者:ks-solruserml-bot (2025/04/30 10:59 投稿)

こんにちは、Matthias さん

特定の数値がドキュメントの(DocValues の)フィールドにどれくらい現れるかを知りたい理由についてですが、
私たちはクエリ内でのブーストに if() 関数と組み合わせて使用しています。

サンプル:
boost=if(termfreq(prefdistrictid, $districtid),10,1)&districtid=1234

このようにして、特定の districtid が存在する場合にそのドキュメントのスコアをブーストしています。

よろしくお願いいたします
Uday Kumar

返信投稿者:ks-solruserml-bot (2025/04/30 10:59 投稿)

こんにちは、Uday

つまり、districtid がドキュメントの prefdistrictid と等しい(またはその一つの値である)場合、ドキュメントに 10 倍のブーストを適用したいということですね。

いくつかの代替案(未テスト):

  • フィールドが単一値の場合
    DocValue: if(eq(prefdistrictid,$districtid),10,1)
  • フィールドが複数値の場合
    DocValue: if(query({!v='prefdistrictid:$districtid'}),10,1)
    (後者の場合、$districtid を自分で解決する必要があるかもしれません)

頑張ってください!
Matthias

トピックへ返信するには、ログインが必要です。

KandaSearch

Copyright © 2006-2025 RONDHUIT Co, Ltd. All Rights Reserved.

投稿の削除

この投稿を削除します。よろしいですか?