SOLR - 在字段内提高词项匹配的得分

4

我已经寻找了解决方案,但都无济于事,但我想肯定有一种方法可以实现。

我们有一个SOLR实现,大约有30个字段,每个字段都有相关的加权值。有些字段的权重相等,大多数字段的值不同。

与在等权重字段之间命中相比,如果在给定字段内多个术语被命中,则我们希望提高文档得分。

例如:搜索计算机编程

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

我认为这可能涉及使用短语slop和接近度,但我希望还有其他方式来管理这个问题?

3个回答

2

1

如果给定的搜索字符串出现在特定字段中,我们可以提高文档的得分。

例如,一个文档有10个字段,其中一个是标题。假设我们想要在标题字段中提高搜索字符串“Searching for Computer Programming”的得分。在查询中,您需要传递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

关于接近搜索: 当您搜索“Searching for Computer Programming”而不是Searching for Computer Programming时,这被称为短语搜索。Solr将寻找精确的短语匹配(用引号括起来)。接近搜索是指Solr在给定的接近程度内查找搜索词彼此更接近。
Example: 
Normal search: Searching for Computer Programming
Phrase search: "Searching for Computer Programming"
Proximity search : "Searching for Computer Programming"~10

你可能已经给我指出了一些问题 - 当我调试我们的查询时,它会将单个术语分开处理,即在所有字段中平等地查找“搜索”,“计算机”和“编程”,然后组合得分。我最初没有设置这个 - 也许有什么需要调整的地方? - Topcat

1

可以通过使用带有正则表达式查询的Boost Query (bq)来实现。例如,在我的应用程序中,我通过添加bq参数来提高exactName或exactSynonym以查询字符串开头的匹配项的优先级。

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;

  }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接