我四处寻找解决方案无济于事,但我想有办法解决这个问题。
我们有一个包含30个字段的SOLR实现,每个字段都有相关的提升值。有些字段的权重相同 - 大多数都有不同的值。
如果在给定字段内与同等加权字段匹配多个字词,我们希望提高文档分数。
示例:搜索计算机编程
如果计算机编程出现在文档的同一个字段中,我希望得分高于“计算机”出现在一个字段中,并且“编程”出现在另一个字段中。我们当前的配置是对它们进行相同评分(假设字段的权重相等)。
我认为这可能涉及使用slop和proximity这个短语,但是我希望有另一种方法来管理它?
答案 0 :(得分:0)
如果给定的搜索字符串出现在特定字段中,我们可以提高文档的分数。
实施例。文件说10个字段,其中一个是标题。让我们说如果搜索字符串“搜索计算机编程”出现在标题字段中,我们希望提高doc的分数。在查询中,您需要传递q=<searchstring> OR <field to boost>:(<searchstring>)^<boost factor>
example:
http://Solrserver:solrport/solr/mycollection/select?q=(Searching for Computer Programming) OR (title:(Searching for Computer Programming)^5)&wt=json&indent=true&debugQuery=true
关于邻近搜索: 当您搜索“搜索计算机编程”而不是“搜索计算机编程”时,它称为短语搜索。 Solr将查找精确的短语匹配(包含在“)中。邻近搜索是指solr在给定的邻近区域中寻找搜索词彼此更接近的位置。
Example:
Normal search: Searching for Computer Programming
Phrase search: "Searching for Computer Programming"
Proximity search : "Searching for Computer Programming"~10
答案 1 :(得分:0)
这是dismax / edismax查询解析器的一个很好的用例。
我建议首先使用 qf 参数来设置字段和提升。 然后你可以开始玩 pf 和 ps 来提升某个特定范围内的短语匹配。 如果你更大胆(并且你需要它),你也可以使用带状疱疹。
供参考:
https://lucene.apache.org/solr/guide/6_6/the-dismax-query-parser.html https://lucene.apache.org/solr/guide/6_6/the-extended-dismax-query-parser.html
答案 2 :(得分:0)
这可以通过将Boost Query (bq)与正则表达式查询一起使用来实现。例如,在我的应用程序中,我通过添加bq参数来增强匹配,其中精确名称或确切同义词以查询字符串开头
bq:(exactname:/<your_lucene_escaped_query_string_here>.*/) OR (exactSynonyms:/<your_lucene_escaped_query_string_here>.*/)
这是我逃脱lucene特殊字符的方式:
escapeLucene: function (value, addQuotes) {
if (typeof(value) == "object") {
value = value.join("");
}
var specials = ['+', '-', '&', '!', '(', ')', '{', '}', '[', ']', '^', '"', '~', '*', '?', ' ', ':', ';', '\\', '/', '|'];
var regexp = new RegExp("(\\" + specials.join("|\\") + ")", "g");
var escapedVal = value.replace(regexp, "\\$1");
if (escapedVal.indexOf('\\') > -1 && addQuotes) {
escapedVal = "\"" + escapedVal + "\"";
}
return escapedVal;
}