我的文档在我的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响应任何与我的查询相关的文档。 我想我做错了什么。这样做的正确方法是什么?
答案 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你可以找到一个例子来解释如何实现我上面解释的内容。