【问题标题】:Relevance Scores and Sorting with ElasticSearch使用 ElasticSearch 进行相关性得分和排序
【发布时间】:2023-03-18 18:35:01
【问题描述】:

我正在尝试将相关性得分和另一个字段的排序结合起来,但不知道该怎么做。

我的文档有许多文本字段,我想针对某个词进行搜索。该术语可能出现在文档的多个字段中。

我正在使用以下内容进行基本过滤:

  "query_string": {
    "query": "Burger",
    "default_field": "*"
  }
}

我还有一个字段 popularityScore 可以衡量文档的受欢迎程度。我尝试按此排序:

  "query": {
    "query_string": {
      "query": "Burger",
      "default_field": "*"
    }
  },
  "sort": [
    {
      "popularityScore": {
        "order": "desc"
      }
    }
  ]
}

通过这样做,查询的相关性变得无关紧要,如果没有它,相关性的微小偏差可能会导致非常受欢迎的文档显示较低。有没有一种方法可以将流行度得分和相关性结合起来,或者设置一个上限(例如,只返回相关性 > x 然后对它们进行排序)?

【问题讨论】:

  • 您能否详细说明您希望如何结合流行度得分和相关性。分数是相对于返回的文档的,这些不是绝对值,因此将它们与静态值进行比较没有意义
  • popularityScore 本身也是一个相对值(预先计算),所以我认为某种类型的加权乘数会起作用。也就是说,我对其他方法持开放态度,我试图避免的是非常高相关性分数和非常低人气分数(或相反)的长尾。

标签: elasticsearch


【解决方案1】:

您可以使用字段function_scorefield_value_factor

查询

{
  "query": {
    "function_score": {
      "query": {
        "query_string": {
          "query": "Burger",
          "default_field": "*"
        }
      },
      "functions": [
        {
          "field_value_factor": {
            "field": "popularityScore",
            "factor": 1.2,
            "modifier": "sqrt",
            "missing": 1
          }
        }
      ],
      "boost_mode": "sum"
    }
  }
}

结果

"hits" : [
      {
        "_index" : "index35",
        "_type" : "_doc",
        "_id" : "gLyT6XsBQ6SrO4ATYGUQ",
        "_score" : 3.9282646,
        "_source" : {
          "title" : "Burger",
          "popularityScore" : 12
        }
      },
      {
        "_index" : "index35",
        "_type" : "_doc",
        "_id" : "fryS6XsBQ6SrO4AT_WXV",
        "_score" : 3.5976331,
        "_source" : {
          "title" : "Burger",
          "popularityScore" : 10
        }
      },
      {
        "_index" : "index35",
        "_type" : "_doc",
        "_id" : "f7yT6XsBQ6SrO4ATC2WI",
        "_score" : 3.231918,
        "_source" : {
          "title" : "Burger",
          "popularityScore" : 8
        }
      }
    ]

field_value_factor 函数允许您使用文档中的字段来影响分数。

function_score = sqrt(1.2 * doc['popularityScore'].value)"

document_score = function_score + query_score。

您可以根据要影响查询分数的程度来选择“修饰符”。您可以在 field_value_factor 文档中找到多个选项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-05
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    • 2020-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多