親フィールドで子ドキュメントの一致を拡張

トピック作成者:ks-solruserml-bot (2024/09/22 21:48 投稿)
7
OpenOpen

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

皆さんこんにちは、

私は、音共有サイト「Freesound」(https://freesound.org)の開発者の一人です。私たちはSolrを検索エンジンとして使用しており、現在、Solrを使って新機能の実装を試みています。簡単に言うと、私たちのデータベースには音ごとに1つのSolrドキュメントがあり、通常の検索操作を行っています。しかし、各メインドキュメントに対して、異なる時間点での音に関する特定の情報を含む子ドキュメントを追加したいと考えています。例えば、メインドキュメントには、音のタイトルやタグのような基本的なプロパティがありますが、N個の子ドキュメントがタイムスタンプフィールドとそのタイムスタンプに関連する追加情報を持っています。インデックス化できるドキュメントの簡単な例は以下の通りです(通常、私の子ドキュメントには密ベクターフィールドも含まれます):

[
{
  "ID": "1",
  "title": "街の環境音の録音",
  "tags": ['都市', '環境', '犬', '鳥'],
  "duration": 1:21,
  "events": [{
    "ID": "1/events#0",
    "timestamp": 0:23,
    "event_description": "犬の鳴き声"
  },{
    "ID": "1/events#1",
    "timestamp": 0:47,
    "event_description": "鳥のさえずり"
  },{
    "ID": "1/events#2",
    "timestamp": 1:05,
    "event_description": "犬の鳴き声"
  },
  ...
  ]
},
...
]

私が実現したいのは、子ドキュメントにマッチするクエリを実行し、スコアに基づいてそれらをソートすることですが、親ドキュメントのフィールドに基づいてファセットを行いたいということです。例えば、「犬の鳴き声」イベントが発生するすべてのドキュメントを取得したい(例のように、1つのドキュメントに2つの該当イベントがあれば、2回返される)、その際、子ドキュメントのスコアでソートしたいのですが、親ドキュメントの「duration」フィールドのようなファセットデータを含めたいのです。

1つの解決策は、すべての親ドキュメントのフィールドを、インデックス時に各子ドキュメントに複製することです。これで機能しますが、インデックス内に多くの冗長な情報が生成されてしまいます。

私が最適だと考えるのは、子ドキュメントのフィールドを拡張し、クエリ時に親のフィールドを含める方法です。たとえば、フィールドリストにfl=timestamp,event_description,__parent__.durationのように指定できれば理想的です。それは可能でしょうか?

他にもいくつかのアプローチを試しましたが、親ドキュメントクエリパーサーのような方法では、特定の条件に一致する子ドキュメントの親ドキュメントを返すことはできるものの、どの子ドキュメントがクエリに一致したのかがわからないという問題があります。また、スコアが親ドキュメントに伝播しないため、期待通りにソートされません。

以上です。サポートに感謝します!

よろしくお願いします、
Frederic

返信投稿者:ks-solruserml-bot (2024/09/22 21:48 投稿)

こんにちは、Federic、

これは、blockParent ドメイン変更に関する話のようです。詳細はこちらを参照してください。
https://solr.apache.org/guide/solr/latest/query-guide/json-faceting-domain-changes.html#block-join-domain-changes

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

返信投稿者:ks-solruserml-bot (2024/09/22 21:48 投稿)

こんにちは、Mikhail、

迅速な返信をありがとうございます!その情報は知りませんでしたが、まさに私が探していたもののようです。JSON facets API を使って少しテストしてみました(以前は非JSONのファセットメソッドを使用していましたが)、これで子ドキュメントをクエリしながら親でファセット化できることが確認できました。これは私にとって完璧な解決策です。

前回のメールで触れなかった追加の問題が1つあります。ファセットの問題と似ているのですが、今回は子ドキュメントを親のフィールドでグループ化したいというグループ化の問題です。またしても、親のフィールドを子ドキュメントにインデックスすれば解決できます(今回は1つのフィールドだけなので、それほど問題ではないかもしれません)。しかし、ファセットの解決策に似た方法があるかもしれません。ドキュメントを探しましたが、見つけることができませんでした。

どうもありがとうございます!!!

Frederic

返信投稿者:ks-solruserml-bot (2024/09/22 21:48 投稿)

おそらく、親を検索してから、親を子に展開する方法について話していると思います。
https://solr.apache.org/guide/solr/latest/query-guide/document-transformers.html#child-childdoctransformerfactory

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

返信投稿者:ks-solruserml-bot (2024/09/22 21:49 投稿)

こんにちは、

ご提案ありがとうございます。それは試してみましたが、残念ながら私が必要としているものではありません。なぜなら、子のスコアに基づいて結果をソートすることができず(これが必要です)、また、複数の子が一致しても親を1つだけ返すからです。

現在、JSONファセットモードのドメインプロパティを使用し、子ドキュメントにグルーピングフィールドを複製する方法でうまくいっています。

ご協力ありがとうございました!

Fredric

返信投稿者:ks-solruserml-bot (2024/09/22 21:49 投稿)

こんにちは、

完全には理解していませんが、子ドキュメントに一致する親ドキュメントをソートするための関数があることを覚えています。以下のリンクをご参照ください:
https://solr.apache.org/guide/solr/latest/query-guide/function-queries.html#childfieldfield-function

残念ながら、その逆の機能はまだ実装中で進捗が止まっています:
https://issues.apache.org/jira/browse/SOLR-10701

sort=parentfield()があなたの問題に適しているかどうか、確認していただけますか?

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

返信投稿者:ks-solruserml-bot (2024/09/22 21:49 投稿)

こんにちは、

確かにそれは別の解決策になるかもしれませんが、現在の解決策の方が好ましいです。というのも、実際に子ドキュメントを照合しているため、親ドキュメントごとに複数の一致を得ることができるからです。例えば、同じ親の3つの子ドキュメントがクエリに一致した場合、これらのすべての一致を知りたいので、子ドキュメントを検索するのが本当に望んでいることです。ファセット処理や親ドメインでのフィルタリングに関しては、完璧に動作しています。また、子ドキュメントを親のフィールドでグループ化するのは不可能なようですが、このフィールドを子ドキュメントにも追加することで対処しています(少量の情報を重複させていますが)。

改めてご助力いただきありがとうございます!

fredric

返信投稿者:ks-solruserml-bot (2024/09/22 21:49 投稿)

Fredric、あなたが求めていることは理解しました。実際、私も同じ問題に対する解決策を探しています。

私が必要としているのは以下の点です。

  • 子ドキュメントに含まれるテキストの断片に基づいて検索すること
  • そのスコアを使用して結果をソートすること
  • 親ドキュメントのフィールドに基づいて結果をフィルタリングすること
  • 親ごとに最も高いスコアを持つ子ドキュメントのみを返すこと

これまでのところ、唯一成功を収めたアプローチは、インデックス作成時にフィルタリングするフィールドも子ドキュメントに追加することです。しかし、これには多くの重複データを管理する必要があり、手間がかかります。

ありがとう、
Kumar

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

KandaSearch

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

投稿の削除

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