SOLR - 提高字段内术语匹配的字段分数

时间:2017-10-10 14:24:01

标签: solr

我四处寻找解决方案无济于事,但我想有办法解决这个问题。

我们有一个包含30个字段的SOLR实现,每个字段都有相关的提升值。有些字段的权重相同 - 大多数都有不同的值。

如果在给定字段内与同等加权字段匹配多个字词,我们希望提高文档分数。

示例:搜索计算机编程

如果计算机编程出现在文档的同一个字段中,我希望得分高于“计算机”出现在一个字段中,并且“编程”出现在另一个字段中。我们当前的配置是对它们进行相同评分(假设字段的权重相等)。

我认为这可能涉及使用slop和proximity这个短语,但是我希望有另一种方法来管理它?

3 个答案:

答案 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;

  }