在超过1个字段中搜索solr多值字段

时间:2016-08-19 05:31:47

标签: solr multivalue

我在solr中有以下数据库结构

<doc>
<int name="bookid">123</int>
<str name="bookname">java</str>
<arr name="provider">
    <str>JMD</str>
     <str>BBH</str>
     <str>RBH</str>
</arr>
<arr name="price">
     <int>120</int>
     <int>125</int>
     <int>100</int>
</arr>
</doc>

............... 更像这样的文档。我想过滤器,如提供者是JMD,价格是100。 solr查询用于此目的。

2 个答案:

答案 0 :(得分:0)

使用过滤器(fq)

http://localhost:8983/solr/collection1/select?indent=on&q=*:*&wt=json&fq=provider:JMD&fq=price:100

替换主机和集合名称

答案 1 :(得分:0)

最简单的解决方案 - 只要你正在寻找你所描述的匹配 - 就是将两个值合并到一个字段中进行过滤:

<arr name="provider_price">
    <str>JMD__120</str>
    <str>BBH__125</str>
    <str>RBH__100</str>
</arr>

然后使用过滤器查询进行查询:fq=provider_price:JMD__100

另一种选择,只要字段数不是太大(如果字段数量很大,使用DocValues可能会有所帮助) - 这也可以让你正确地搜索范围(你也可以使用以前的方法,只要您将值前缀为给定长度为0,因此它们处于相同的词法排序顺序中):

<arr name="JMD_price">
    <str>120</str>
</arr>
<arr name="BBH_price">
    <str>125</str>
</arr>
<arr name="RBH_price">
    <str>100</str>
</arr>

查询:fq=JMD_price:100

第三种选择是为这些查询使用单独的核心:

<doc>
    <int name="bookid">123</int>
    <str name="bookname">java</str>
    <str name="provider">JMD</str>
    <int name="price">120</int>
</doc>
<doc>
    <int name="bookid">123</int>
    <str name="bookname">java</str>
    <str name="provider">BBH</str>
    <int name="price">125</int>
</doc>
<doc>
    <int name="bookid">123</int>
    <str name="bookname">java</str>
    <str name="provider">RBH</str>
    <int name="price">100</int>
</doc>

查询将为fq=provider:JMD AND price:100

第四个选项是使用父/子文档,但这会使针对索引的任何查询复杂化。