使用 Solr 在复杂 JSON 中搜索的好设计是什么?例如,可能有这样的文件:
{
"books" : [
{
"title" : "Some title",
"author" : "Some author",
"genres" : [
"thriller",
"drama"
]
},
{
"title" : "Some other title",
"author" : "Some author",
"genres" : [
"comedy",
"nonfiction",
"thriller"
]
}
]
}
一个示例查询将获取所有具有作者为“某作者”且该书的类型之一为“戏剧”的书的文档。
现在我想出的设计是在 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”的一些巧妙组合?