我们如何根据关键字的位置对查询结果进行排序?
我只在标签字段上开始搜索
当我有
- Solr 搜索查询 titi 蒂
- 蒂测试倾斜 托
- 托蒂 塔
我们应该设置什么参数来恢复此订单?
- 蒂
- 蒂测试倾斜 托
- 托蒂 塔
- Solr 搜索查询 titi
我使用Drupal进行连接并将查询发送到solr。
如果您的域非常包含,并且您知道例如您期望的标签的大小,则可以使用复制字段和 dismax 查询解析器获得接近您想要的内容。具体来说,你可以这样构建N个"复制字段":
<field name="label" type="text_general" indexed="true" stored="true"/>
<field name="label_3" type="text_first_3" indexed="true" stored="true"/>
<field name="label_5" type="text_first_5" indexed="true" stored="true"/>
...
<fieldType name="text_first_3" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.LimitTokenPositionFilterFactory" maxTokenPosition="3" consumeAllTokens="false" />
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
</analyzer>
</fieldType>
<fieldType name="text_first_5" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.LimitTokenPositionFilterFactory" maxTokenPosition="5" consumeAllTokens="false" />
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
</analyzer>
</fieldType>
...
<copyField source="label" dest="label_3"/>
<copyField source="label" dest="label_5"/>
这要归功于限制代币位置过滤器[1]。然后,您可以使用 edismax 指定不同的提升:
qf="label_3^5 label_5^2 label">
这里也讨论了这个问题[2]。
这里提到了另一种方法[3]。
[1] https://lucene.apache.org/solr/guide/6_6/filter-descriptions.html#FilterDescriptions-LimitTokenPositionFilter
[2] https://issues.apache.org/jira/browse/SOLR-3925
[3] 索尔 - 如何提高早期比赛的得分?