"structure"を含むフィールドを使用する/検索する

トピック作成者:ks-solruserml-bot (2024/07/02 11:14 投稿)
3
CloseClose

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

皆さん、

Solr / Luceneではドキュメント内で任意のフィールドを定義することができないため、ドキュメント内に構造化情報をどのように保存するのが推奨されるのか、気になっています。

私はエンティティに関する情報を保存し、関連エンティティ(インデックスに保存されていない)に特有の情報を保存したいと考えています。実際のユースケースではありませんが、例として、ユーザーが異なる場所で異なる特権を持っているとします。

もしSolr / Luceneがそれを許可していたら、次のようにモデル化するかもしれませんでした:

users: [
  {
    "username": "chris",
    "locations": ["denver", "chicago", "washington"],
    "location_denver_role": "admin",
    "location_chicago_role": "staff",
    "location_washington_role": "basic"
  },
  { ... }
]

私は「location_denver_role」、「location_chicago_role」などというフィールドを持てない(もちろん、持つことはできますが、多数の場所を扱う必要があり、それぞれのためにフィールドを定義するのは愚かなように思えます)、そのため、以下のような方法を考えています:

users: [
  {
    "username": "chris",
    "locations": ["denver", "chicago", "washington"],
    "location_roles": [
      { "denver": "admin", "chicago": "staff", "washington": "basic" }
    ]
  },
  { ... }
]

これで「location_roles」という1つのフィールドがありますが、その中に「構造」が含まれています。明らかにSolrで他のフィールドを直接検索して、その後手動で必要なレコードをフィルタリングすることができますが、Solrに対して、私がデンバーで管理者であるユーザーのみに関心があることを伝えるためには、インデックスをどのように構造化すればよいでしょうか?

インデックスを反転させて以下のように利用することができると思われるかもしれませんが:

{
  "admin": ["denver"],
  "staff": ["chicago"],
  "basic": ["washington"]
}

しかし、これはできません。「role」は単なるユーザーメタデータのプロキシであり、時間の経過とともに成長する可能性があり、さまざまな可能な値の範囲が広いため、インデックスを単純に反転させることはできません。

よろしくお願いします。
-chris

返信投稿者:ks-solruserml-bot (2024/07/02 11:22 投稿)

私たちは講師を科目に合わせてマッチングするために、location_denver_roleのようなものを実装しました。いくつかの千の科目と3種類のスコアがあり、そのため各講師レコードには約20,000のフィールドがありました。ランキングではその科目IDに対して3つのフィールドを取得してランキングを行いました。インデックスは大きくなく、20万件未満のドキュメントでしたが、応答時間は100ミリ秒未満でした、私の記憶が正しければ。

wunder
Walter Underwood
wunder@wunderwood.org
http://observer.wunderwood.org/ (私のブログ)

返信投稿者:ks-solruserml-bot (2024/07/02 11:23 投稿)

こんにちは、Chris

通常、値(列挙型)がフィールド名に漏れ出ると懸念されることがあります。フィールドのセットを制御する方が良いですね。私は別々の値を使用して、より速い検索やファセティングを行うことを好みますし、連結もします:

"locations": ["denver", "chicago", "washington"],
"roles": ["admin", "staff", "basic"],
"location_roles": ["denver_admin", "chicago_staff", "washington_basic"]

そのため、次のようにクエリを組み立てます:

q=location_roles:denver_admin

次の複雑なレベルは、依存するファセットです。例えば、デンバーでのロールのカウントです。この場合、"staff"や"basic"はファセットの値として貢献しないでしょうが、facet.field でカウントすることができます。また、トリッキーな後処理を使用して、これらの連結を介して依存するファセットをカウントすることもできます。

参考までに、この問題の防弾的な解決策は、ロールをユーザーのサブドキュメントとしてインデックス化することです。これは非常にパフォーマンスが良いですが、非常に複雑です。

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

返信投稿者:ks-solruserml-bot (2024/07/02 11:36 投稿)

Mikhail さん、

素晴らしいアイデアですね。残念ながら、実際の私のユースケースでは、任意の整数型のデータであり、明確に定義された列挙型ではありません。一方で、再検討した結果、私が本当に/searching/で必要としているのは、特定のリストにアイテムが存在することであり、その値ではありません。したがって、次のようにマルチバリューのフィールドを追加できると思います:

"locations": ["denver", "chicago", "washington"],
"flagged_locations": ["chicago"],
"location_roles": ["denver_admin", "chicago_staff", "washington_basic"]

そして、"flagged_locations:chicago" で検索できます。

一旦 "chicago" のユーザーを見つけたら、検索に実際には使用しなくても、ストアドフィールドの "location_roles" を使用してそのユーザーがシカゴでどのような役割を持っているかを表示できます。

以前の例が不正確だったことをお詫び申し上げます。誤ってシカゴでスタッフのユーザーを検索する必要があると述べましたが、インデックスを構築する際に、"シカゴ" が重要な場所であるかどうかはわかるはずです。

私は長年サブドキュメントについて知っていますが、その複雑さを解決するユースケースは見つかっていませんでした。今回はそれに近づいていますが、頭の中でよりシンプルな解決策を考えつつあります。

貴重なフィードバックをありがとうございます。

よろしくお願いします。

-chris

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

KandaSearch

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

投稿の削除

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