EAVやダイナミックファセット属性のためのスキーマ設計

トピック作成者:ks-solruserml-bot (2024/06/18 20:00 投稿)
1
CloseClose

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

こんにちは皆さん、

私たちは、任意の属性と値を持つドキュメントに対してファセット検索を提供するスキーマを作成しようとしています。RDBMSモデルでは、これは通常、Entity Attribute Value(EAV)スキームと呼ばれます。

以下は一種類のドキュメントの例です。trait_typeにはVariant、Rank、Chest、Face、Handsなどがあります。

{
  "name": "ここに名前が入ります。",
  "description": "ここにテキストが入ります。",
  "attributes": [
    {
      "trait_type": "Variant",
      "value": "Service Unit"
    },
    {
      "trait_type": "Rank",
      "value": 5861
    },
    {
      "trait_type": "Chest",
      "value": "Robe",
      "occurrence": 10.0
    },
    {
      "trait_type": "Face",
      "value": "Shades",
      "occurrence": 9.8
    },
    {
      "trait_type": "Hands",
      "value": "Handheld Console",
      "occurrence": 2.6
    }
  ]
}

上記のような「ドキュメントタイプ」のドキュメントが1万件あります。

別の「ドキュメントタイプ」では異なる特性を持つかもしれません。

上記のドキュメントに関して、以下のようなファセットブラウザを希望しています:

Variant
- Service Unit (122)
- Combat Unit (100)
- Other (231)
Chest
- Robe (122)
- Amber (231)
- Diamond (100)
Face
- Shades (123)
- VR (23)
Hands
- Handheld Console (23)
- Sword (87)
- Gun (12)

この実験として、これらのドキュメントを「スキーマレス」および「管理されたスキーマ」コアにインポートしました。その結果得られたSolrドキュメントは以下の通りです:

{
  "name": ["ここに名前が入ります"],
  "description": ["ここに説明が入ります..."],
  "attributes.trait_type": [
    "Variant",
    "Rank",
    "Antenna",
    "Chest",
    "Face",
    "Head",
    "Hands"
  ],
  "attributes.value": [
    "Automaton",
    "309",
    "Boosted Signal",
    "Gold",
    "Glowering",
    "Baseball Cap",
    "Baseball Bat"
  ],
  "attributes.occurrence": [8.7, 3.4, 9.6, 4.7, 4.7],
  "id": "4a972d2a-df0b-4112-90f2-eef8d153d874",
  "_version_": 1723919631435956224
}

以下は古いStackoverflowの質問とその回答ですが、類似の問題を説明しています:
https://stackoverflow.com/questions/7512392/facet-dynamic-fields-with-apache-solr/14529566#14529566

ただし、他にどんなアプローチが考えられるか、ご意見や提案があれば教えていただけますでしょうか?私たちが持つドキュメントタイプは非常に多くないため、完全に「汎用化」された解決策が必要なわけではないかもしれません。つまり、インデックス化する際にvariant、chest、face、handsなどの既知のフィールドにドキュメントを「正規化」することができます(必要に応じて新しいフィールドを作成し、その後、ドキュメントタイプでフィルタリングします)。

ご意見や提案をお待ちしております。

よろしくお願いします。

Tony

返信投稿者:ks-solruserml-bot (2024/06/18 20:01 投稿)

どのようなファセットクエリが必要かによって異なりますが、"trait_type"と"value"を連結して、その結果を単一のフィールドに入れることで対応できる場合があります。

{
  "name": "ここに名前が入ります。",
  "traits": ["Variant=Service Unit", "Rank=5861", "Chest=Robe", ...]
}

その後、"traits"フィールドでファセットを行った後、クライアント側で"trait_type"(接頭辞でグループ化)ごとにすべてをグループ化する必要があります。
これにより、フィールドごと(またはtrait_typeごと)のファセット制限や、レンジファセティングはできませんが。

Yonik

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

KandaSearch

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

投稿の削除

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