仅搜索Solr多值字段的单个值,而不搜索值

时间:2015-11-19 23:54:28

标签: search solr multivalue

我的架构中有一个名为citation的多值字段。数据库中的一个文档具有此字段的值,如:

 "citation":["13-33",
             "12-44"],

我希望能够执行以下查询:citation:(13 44)并且不会返回此文档。换句话说,我希望查询跨越字段的单个值。

有办法做到这一点吗?

使用上述文档的一些其他示例,我想要这个如何工作:

  • 引用:(13 33) - >退货。
  • 引用:(12 44) - >退货。
  • 引用:(12) - >退货。
  • 引用:(33 13) - >退货。
  • 引用:(33 12) - >不回报它。

3 个答案:

答案 0 :(得分:0)

Solr不支持这种查询,但也许您可以尝试使用块连接来实现它。 https://cwiki.apache.org/confluence/display/solr/Other+Parsers#OtherParsers-BlockJoinQueryParsers

答案 1 :(得分:0)

SurroundQueryParser是确定两个术语是否与multiValued字段的值相同的最佳选择。多值字段实际上是内部一长串令牌,但属于的令牌之间存在较大差距不同的"值"。它由schema.xml中的positionIncrementGap参数控制,通常为100.因此,将最大间隙设置为低于100将要求两个项都在一个字段值内。

答案 2 :(得分:0)

我认为您可以使用citation字段的正确字段类型和标记化来解决此问题。如果您使用这样的字段类型:

<fieldType name="citation" class="solr.TextField" positionIncrementGap="100">
 <analyzer type="index">
   <tokenizer class="solr.KeywordTokenizerFactory"/>
   <filter class="solr.PatternCaptureGroupFilterFactory" 
           pattern="([0-9]+)-[0-9]+" preserve_original="true"/>
 </analyzer>
</fieldType>

然后您的示例文档将被编入索引:

“引用”:[“13”,“13-33”,“12”,“12-44”]

这意味着该文档将匹配citation:"13"citation:"13-33",但不会citation:"13-12"citation:"13-44"