我正在尝试提高从 solr 中搜索返回的文档的分数。
我想要实现的提升是:
field1:(value1)^5 OR field2:(value2)^2
如果文档确实有 field1 匹配 value1,则增加 5。 如果文档确实有 field2 匹配 value2,则增加 2。
文档有很多字段,我们称它们为 field1、field2...,并且可能缺少某些字段。
文档不需要有field1或field2分别匹配value1,value2。
我还有其他过滤器查询,例如:
fq: field1:[* TO *] <- checking for presence of
fq: field3: ("something" "somethingelse")
fq: field4: 1
我按未在任何查询中使用的特定字段对结果进行分组。
原始查询参数:
group=true&group.facet=true&group.field=anIndependentField
我在尝试不同的查询解析器时使用相同的 fq。
solr 中有足够多的文档带有 field1:value1 和/或 field2:value2 以及这些字段的其他值。
到目前为止,我已尝试使用查询解析器:
- 标准查询解析器
method a) q: field1:(value1)^5 OR field2:(value2)^2 // no results
method b) q: *:* OR field1:(value1)^5 OR field2:(value2)^2 // no results
method c) q: (value1)^5 OR (value2)^2 // incorrect. looks for complete match.
method d) q: (value1)^5 (value2)^2 // incorrect. looks for complete match
- EDisMax 查询解析器
(defType=edismax)
问:*:*
bq: field1:(value1)^5 OR field2:(value2)^2
这个问题的问题是结果没有按预期顺序排列。 具有 field1:somethingElse 和 field2:somethingElse2 的文档比具有 field1:somethingElse 和 field2:value2 的文档得分更高。
任何人都可以看到我做错了什么或有建议来提高我的搜索查询的相关性吗?
最佳答案
您可以通过以下方式使用eDismax queryParser的bf参数:
bf=if(termfreq(field1,"value1"),5,if(termfreq(field2,"value2"),2,1))
请在下面找到完整的查询。
https://<MY_SERVER_NAME>:9443/solr/<MY_COLLECTION>/select?q=*%3A*&wt=json&indent=true&defType=edismax&bf=if(termfreq(field1%2C%22value1%22)%2C3%2Cif(termfreq(field2%2C%22value2%22)%2C2%2C0))
关于Solr 提升特定字段值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39114582/