如何在solr搜索中使用多个多值字段

时间:2016-08-02 13:47:41

标签: search solr lucene multivalue

我的文档在我的solr中有多值字段。我想根据这些多值字段进行搜索。 当我想查询;

http://localhost:8983/solr/demo/select?q=*:*&fq=id:FEAE38C2-ABFF-4F0C-8AFD-9B8F51036D8A

它为我提供了以下查询结果。

response": {
    "numFound": 1,
    "start": 0,
    "docs": [
      {
        "created_date": "2016-03-23T13:47:46.55Z",
        "solr_index_date": "2016-04-01T08:21:59.78Z",
        "TitleForUrl": "it-s-a-wonderful-life",
        "modified_date": "2016-03-30T08:45:44.507Z",        
        "id": "FEAE38C2-ABFF-4F0C-8AFD-9B8F51036D8A",        
        "title": "It's a wonderful life",        
        "article": "An angel helps a compassionate but despairingly frustrated businessman by showing what life would have been like if he never exis",
        "Cast": [
          "James Stewart",
          "Donna Reed",
          "Lionel Barrymore"
        ],
        "IsCastActive": [
          "false",
          "true",
          "true"
        ]
      }
    ]
  }

如您所见,我有2个名为“Cast”和“IsCastActive”的maltivalue字段。 我的问题是当我添加像Cast这样的过滤器时:“James Stewart”和IsCastActive =“true”,如下所示:

http://localhost:8983/solr/demo/select?q=*:*&fq=id:FEAE38C2-ABFF-4F0C-8AFD-9B8F51036D8A&fq=Cast:"James Stewart"&fq=IsCastActive:"true"

Solr仍然给出了相同的结果,但“James Stewart”在文档中没有激活。因此,我不希望Solr响应任何与我的查询相关的文档。   我想我做错了什么。这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

这在Solr中以直截了当的方式看起来不太可能。但我认为更有效的方法是将Cast成员的名称保留为键,然后将其与值关联为true或false,然后将用户名作为键过滤。这样的事情:James Stewart :["true"]。或者您可以使用单个字段来存储由冒号.分隔的演员姓名和他/她的活动状态。这样的事情castInfo:["James Stewart:false","John Sanders:true"]。您可以通过类似fq=castInfo:"James Stewart:false"的内容对其进行过滤。

答案 1 :(得分:0)

我想为您的问题提出另一种解决方案。此类解决方案将true / false存储为payloads整数。因此,我们的想法是在模式中有一个名为 cast 的字段,其中包含:

<field name="cast" type="payloads" indexed="true" stored="true"/>

<fieldtype name="payloads" stored="false" indexed="true" class="solr.TextField" >
  <analyzer>
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.DelimitedPayloadTokenFilterFactory" encoder="integer"/>
  </analyzer>
  <similarity class="payloadexample.PayloadSimilarityFactory" />
</fieldtype>

可以将内容编入索引,例如:

  

James Stewart | 0
  唐娜里德| 1

其中0/1为真/假。 使用有效负载还可以让您直接从发布列表中读取,从而提高相关查询的性能。 Here你可以找到一个例子来解释如何实现我上面解释的内容。