Apache Solr8のnested documentの検索の仕方

表題の件について、結構苦労して色々なパラメータの使い方を理解して、一人で暖めておくのはもったいないのでメモ。

  • Solr8では2段以上(上限不明)のデータのネストが可能。
  • スキーマの作り方は今のところ十分に理解できていないが、dynamicFieldを用いることで基本的なスキーマを用いた自動的なindexingが可能。
  • dynamicFieldは、以下のような感じでフィールド名の末尾に記号をつける。たとえばtitleだったらtitle_s という風に。このリストは server/solr/configsets/_default/conf/managed-schema で得られる。
    <dynamicField name="*_i"  type="pint"    indexed="true"  stored="true"/>
    <dynamicField name="*_is" type="pints"    indexed="true"  stored="true"/>
    <dynamicField name="*_s"  type="string"  indexed="true"  stored="true" />
    <dynamicField name="*_ss" type="strings"  indexed="true"  stored="true"/>
    <dynamicField name="*_l"  type="plong"   indexed="true"  stored="true"/>
    <dynamicField name="*_ls" type="plongs"   indexed="true"  stored="true"/>
    <dynamicField name="*_t" type="text_general" indexed="true" stored="true" multiValued="false"/>
    <dynamicField name="*_txt" type="text_general" indexed="true" stored="true"/>
    <dynamicField name="*_b"  type="boolean" indexed="true" stored="true"/>
    <dynamicField name="*_bs" type="booleans" indexed="true" stored="true"/>
    <dynamicField name="*_f"  type="pfloat"  indexed="true"  stored="true"/>
    <dynamicField name="*_fs" type="pfloats"  indexed="true"  stored="true"/>
    <dynamicField name="*_d"  type="pdouble" indexed="true"  stored="true"/>
    <dynamicField name="*_ds" type="pdoubles" indexed="true"  stored="true"/>
    <dynamicField name="random_*" type="random"/>
    <dynamicField name="ignored_*" type="ignored"/>

次に、親子関係を使ったクエリをいくつか調べてみたので以下に並べておく。 なお、親子ともにhierarchy_sというフィールドを作成してあり、親にはparent、子にはchildの値を与えて区別している。

子を検索してその親だけを表示(hierarchy_s:parentは親、title_tは子)
curl 'http://localhost:8984/solr/skrt/select' -d 'omitHeader=true' -d 'q={!parent which="hierarchy_s:parent"}title_t:pra*&wt=json'

親を検索してその子だけを表示(condition_tは親)
curl 'http://localhost:8984/solr/skrt/select' -d 'omitHeader=true' -d 'q={!child of="*:* -_nest_path_:*"}condition_t:*pagination*&wt=json&rows=40'

親を検索してその子のタイトルだけを表示(hierarchy_s:parentは親、condition_tは子)
curl 'http://localhost:8984/solr/skrt/select' -d 'omitHeader=true' -d 'q={!child of="hierarchy_s:parent"}condition_t:*miss*&wt=json&rows=40&fl=title_t' 

親を検索して親も子も一緒に表示(msIdentifier-settlement_sは親)
curl 'http://localhost:8984/solr/skrt/select' -d 'omitHeader=true' -d 'q=msIdentifier-settlement_s:Tokyo&fl=*,[child]&wt=json&rows=40'

親を検索してから子だけを絞り込み表示。親は全部表示される(hierarchy_s:parentは親、title_tは子)
curl 'http://localhost:8984/solr/skrt/select' -d 'omitHeader=true' -d 'q=hierarchy_s:parent&wt=json&fl=*,[child childFilter=title_t:pra*]'

子を検索してその親と子を両方表示(hierarchy_s:parentは親、title_tは子)
curl 'http://localhost:8984/solr/skrt/select' -d 'omitHeader=true' -d 'q={!parent which="hierarchy_s:parent"}title_t:pra*&wt=json&fl=iiifmanifesturi_s,id,msItems,title_t,[child]&rows=100'