2015-11-19 65 views
0

我的架构中有一个多值字段,名为citation。在一个数据库中的文件有值这个领域,如:只搜索Solr多值字段的单个值,不跨越值

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

我希望能够做一个查询,如:citation:(13 44)并没有这个文件返回。换句话说,我做而不是希望查询跨越该字段的各个值。

有没有办法做到这一点?


使用文档的某些其它例子上面的我怎么这个工作:

  • 引文:(13 33) - >返回。
  • 引用:(12 44) - >将其返回。
  • 引用:(12) - >将其返回。
  • 引用:(33 13) - >返回它。
  • 引用:(33 12) - >不回复它。

回答

0

SurroundQueryParser是搞清楚两个词是否在多值字段的值相同您最好的选择。该多值字段实际上是一个内部长令牌集但属于不同的令牌之间存在很大的差距“值”。这由schema.xml中的positionIncrementGap参数控制,通常为100.因此,将最大差距设置为低于100将需要两个项都在一个字段值内。

+0

这假定整个值小于99级的令牌长,是吗? – mlissner

+0

如果您的文字较长,请将间距设置为1000或10000.它不会占用额外的空间,该值只是令牌索引位置的增量。 –

+0

今天我使用了这个工具,看起来我可以使用'〜'工作,但不使用'{〜surround}'。这可能是我无法弄清'surround'的语法,但是这两者之间有区别吗? – mlissner

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"

+0

这是一个有趣的策略,但实际上引用并不经常。不幸的是,不同的法院使用不同的格式,我不认为正则表达式可以匹配所有的格式。 – mlissner