我在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 here和here。 &#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; (注意我不想压抑它,只是为了提高确切的名字分数)。
是否可以做这样的事情?
答案 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,还有pf2
和pf3
,它允许您放宽pf的要求,使所有条款按顺序存在(分别只有两个或三个)。