Solr を使用して複雑な JSON を検索するには、どのような設計が適切でしょうか? たとえば、次のようなドキュメントがあります。
{
"books" : [
{
"title" : "Some title",
"author" : "Some author",
"genres" : [
"thriller",
"drama"
]
},
{
"title" : "Some other title",
"author" : "Some author",
"genres" : [
"comedy",
"nonfiction",
"thriller"
]
}
]
}
サンプル クエリは、著者が「Some author」で、本のジャンルの 1 つが「drama」である本を含むすべてのドキュメントを取得することです。
今私が思いついた設計は、schema.xml に dynamicField を用意することで、(今のところ) すべてをテキストとしてインデックス付けします。次のようになります。
<dynamicField name="*" type="text" index="true" stored="true"/>
次に、SolrJ を使用して JSON を解析し、各データのフィールドを含む SolrInputDocument を作成します。たとえば、上記の JSON の例で作成されるフィールド/値は次のとおりです。
books0.title : "Some title"
books0.author : "Some author"
books0.genres0 : "thriller"
books0.genres1 : "drama"
books1.title : "Some other title"
books1.author : "Some author"
books1.genres0 : "comedy"
books1.genres1 : "nonfiction"
books1.genres2 : "thriller"
この時点で、LukeRequestHandler を使用してインデックス内のすべてのフィールドを取得し、関心のあるすべてのフィールドをチェックする大きな Solr クエリを作成できます。上記のサンプル クエリの場合、クエリはすべての「books#.author」をチェックします。および「books#.genres#」フィールド。このソリューションは洗練されていないように見え、多くのフィールドがある場合、クエリが非常に大きくなる可能性があります。
フィールド名にワイルドカードを使用できると便利ですが、Solr ではそれができないと思います。
おそらくスキーマで「copyField」と「multiValued」の巧妙な組み合わせを使用して、これを達成するためのより良い方法はありますか?