複数の JOIN を AND 条件で組み合わせること | KandaSearch Community Support Forum

複数の JOIN を AND 条件で組み合わせること

トピック作成者:ks-solruserml-bot (2025/05/29 15:14 投稿)
2
OpenOpen

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

こんにちは、皆さん。

私は Solr 9.3(VuFind と併用)を使っています。特定の著者(ファセットで選択)によって書かれた書籍の一覧を取得するために JOIN クエリを使いたいと考えています。

まず、JOIN を使わずに試してみてデータを用意するため、2つの準備ステップを行いました。


ステップ 1:

authority データベースをクエリし(4つのファセットを組み合わせて)著者一覧を取得します。

クエリ:

/solr/authority/select?fl=authority_str&fq=full_text_str_mv%3A"Matrika narozených"&fq=full_text_str_mv%3A"Matrika zemřelých"&fq=gender_facet%3A"žena"&fq=occupation_facet%3A"básníci"&indent=true&q.op=OR&q=*%3A*&useParams=&wt=json

fq の内容(わかりやすく記載):

occupation_facet:"básníci"
gender_facet:"žena"
full_text_str_mv:"Matrika narozených"
full_text_str_mv:"Matrika zemřelých"

レスポンスの例:

"docs": [
  {"authority_str":"jk01021170"},
  {"authority_str":"jk01110447"},
  {"authority_str":"jk01021755"},
  {"authority_str":"jk01080703"},
  {"authority_str":"jk01100238"},
  {"authority_str":"jk01152591"}
]

ステップ 2:

ステップ1で得た著者IDリストを使って、biblio データベースをクエリし書籍一覧を取得します。

クエリ:

/solr/biblio/select?indent=true&q.op=OR&q=authority_search_str_mv%3A(jk01021170 jk01021755 jk01080703 jk01100238 jk01110447 jk01152591)&useParams=

レスポンスの numFound1498 件。

結果を "jk01021170|jk01021755|... で grep し、期待通りの結果が含まれていることを確認しました。


ステップ 3:

JOIN クエリを使ってステップ1+2を結合する。

クエリ:

/solr/biblio/select?
fq={!join fromIndex='authority' from='authority_str' to='authority_search_str_mv' v='occupation_facet:"básníci"'}
&fq={!join fromIndex='authority' from='authority_str' to='authority_search_str_mv' v='gender_facet:"žena"'}
&fq={!join fromIndex='authority' from='authority_str' to='authority_search_str_mv' v='full_text_str_mv:"Matrika narozených"'}
&fq={!join fromIndex='authority' from='authority_str' to='authority_search_str_mv' v='full_text_str_mv:"Matrika zemřelých"'}
&q=*:*&q.op=OR&indent=true&useParams=

このクエリのレスポンス numFound1563 件 で、本来欲しい1498件以外に65件の余計な結果が含まれていました。

最初の10件中に本来の結果はわずか2件しか含まれていないことも気になります。


質問:

どうすれば、この不要な 65 件を除外できるでしょうか?


よろしくお願いします。
Josef

返信投稿者:ks-solruserml-bot (2025/05/29 15:14 投稿)

核心の問題にたどり着くのは難しいですが、あくまで勘としての提案です:

これらのフィルタは、JOIN の前に交差(AND)させてクロスマッチを避けるべきではないでしょうか?

つまり、次のようにすべきでは?

fq={!join fromIndex='authority' from='authority_str' to='authority_search_str_mv'}+
  occupation_facet:"básníci"
  +gender_facet:"žena"
  +full_text_str_mv:"Matrika narozených"
  +full_text_str_mv:"Matrika zemřelých"

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

返信投稿者:ks-solruserml-bot (2025/05/29 15:14 投稿)

こんにちは、Mikhail。

ご提案ありがとうございました!
あなたの提案で問題が解決しました。

良い一日をお過ごしください。
Josef

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

KandaSearch

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

投稿の削除

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