【问题标题】:How to use more than one multivalued field in solr search如何在 solr 搜索中使用多个多值字段
【发布时间】:2016-08-02 13:47:41
【问题描述】:

我的 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”的多值字段。 我的问题是当我添加像 Cast:"James Stewart" AND 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 根据我的查询响应任何文档。 我想我做错了什么。正确的做法是什么?

【问题讨论】:

  • 我认为不可能像这样过滤多字段。
  • “在文档中不活动”具体是什么意思?您已经将搜索限制为具有 id 匹配的单个文档,其余的只是重复缩小范围。

标签: search solr lucene multivalue


【解决方案1】:

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

【讨论】:

  • 非常感谢您分享您的好意建议。由于 solr 顺序索引多值字段,它还应该具有顺序查询的能力。不是吗?
  • 是的,就我使用 Solr 的经验而言,它没有选项可以让您以键值方式跟踪两个字段中的索引。尽管如此 , 话虽如此 , 我们 可能 会 像 上面 那样 调整 索引 以满足 我们 的 要求 .
【解决方案2】:

我想为您的问题提出一个替代解决方案。这种解决方案将真/假存储为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>

内容可以被索引,例如:

詹姆斯·斯图尔特|0
唐娜·里德|1

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-06
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    • 1970-01-01
    相关资源
    最近更新 更多