1

使用 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”的一些巧妙组合?

4

2 回答 2

2

您可以将书籍实体索引为文档。

<field name="id" type="string" indexed="true" stored="true" required="true" />  
<field name="title" type="text_general" indexed="true" stored="true"/>   
<!-- Don't perform stemming on authors - You can use field with lower case, ascii folding for analysis -->   
<field name="authors" type="string" indexed="true" stored="true" multiValued="true"/>  
<field name="genre" type="string" indexed="true" stored="true" multiValued="true"/>  

使用Dismax 解析器搜索作者和流派。
在这些字段上匹配应该会返回文档。
您也可以使用流派过滤器查询进行过滤,例如 fq=genre:drama

如果您希望字段的搜索行为不同,您可以简单地使用copyField复制字段并对它们执行不同的分析。例如

<field name="genre_search" type="text_general" indexed="true" stored="true" multiValued="true"/>

<copyField source="genre" dest="genre_search"/>
于 2012-07-17T04:33:16.893 回答
0

也许值得你看看Solr Joins。它仅在 4.0 中可用,现在在 alpha 版本中,但可以让您至少对部分或所有这些复杂关系进行建模。性能不如没有连接的 vanilla solr,但可能完全有效,您应该验证。

于 2012-07-16T22:24:12.257 回答