如何在strfield

时间:2016-10-18 11:52:57

标签: solr lucene

我在solr schema.xml中定义了两种字段类型,如下所示:

<fieldType name="string" class="solr.StrField" sortMissingLast="true"/>

<fieldType name="myTextField" class="solr.TextField" positionIncrementGap="100">
  <analyzer>
    <tokenizer class="solr.StandardTokenizerFactory"/>
      <filter class="solr.LowerCaseFilterFactory" />
      <filter class="solr.ASCIIFoldingFilterFactory"/>
      <filter class="solr.LengthFilterFactory" min="4" max="255" />
  </analyzer>
</fieldType>

我将它们用于两个字段,如下所示:

<field name="exactName" type="string" multiValued="false" indexed="true" required="true" stored="true"/>

<field name="processedName" type="myTextField" indexed="true" stored="true" multiValued="true" />

最后我定义了一个处理程序:

<requestHandler name="/nameSearch" class="solr.SearchHandler" default="true">
  <lst name="defaults">
    <str name="echoParams">explicit</str>
    <str name="defType">edismax</str>
    <str name="qf">exactName^100 processedName^10</str>
    <str name="q.alt">*:*</str>
    <str name="rows">1</str>
    <str name="fl">*,score</str>
  </lst>
</requestHandler>

我想要实现的目标类似于described herehere。 &#34;完美&#34; exactName 字段中的匹配应该得分高于其他字段。

问题是,在调试时,我可以看到我的处理程序没有正确管理搜索中的 exactName 字段。它产生一个像这样的查询:

+((processedName:bob | exactName:bob) (processedName:rivers | exactName:rivers))

由于 exactName 未被标记化,因此在其中搜索令牌是无用的。

如果我通过添加:

来更改我的处理程序
<str name="pf">exactName^1</str>
<str name="ps">1</str>

Solr似乎忽略了它(可能 pf 需要 multiValued 字段)。结果查询是相同的。如果我将处理程序更改为

<str name="qf">processedName</str>
<str name="pf">processedName^10</str>
<str name="ps">1</str>

它更改查询如下:

+((processedName:bob) (processedName:rivers)) (processedName:\"bob rivers\"~1^10.0)

查询是正确的,在我看来,此 exactName strategy无效......

这个策略听起来很有意思,符合我的需求:来自&#34; bob rivers&#34;应该得分高于#34; bob somethig rivers&#34; (注意我不想压抑它,只是为了提高确切的名字分数)。

是否可以做这样的事情?

1 个答案:

答案 0 :(得分:1)

不将dismax查询处理程序作为标准,因为这会将查询字符串拆分为多个单独的查询,这些查询作为单独的查询字词连接。

我尝试使用edismax查询处理程序,因为它允许lucene查询语法与dismax的语法结合使用。这样你就可以在exactName中搜索确切的术语,让edismax在搜索的其余部分使用dismax扩展查询。

类似的东西:

defType=edismax&q=exactName:"Bob Rivers"^100 bob rivers&q.op=OR

..可以工作(可能需要一些调整)。

但是正如您已经发现的那样,您可以通过对processedName字段使用短语字段提升来获得相同的结果,因为它将评估为类似的东西。

另一个调整是拥有两个标记化字段(processedName和exactishName),后者可以处理较少(例如没有词干或语音等),然后在qf中获得更高的分数和pf

对于edismax,还有pf2pf3,它允许您放宽pf的要求,使所有条款按顺序存在(分别只有两个或三个)。