如何根据分数对 ElasticSearch 文档进行排名

时间:2021-04-29 08:43:37

标签: elasticsearch search tf-idf

我有一个包含数千个文档的弹性搜索索引,每个文档代表一个用户。

每个文档都有一组字段(is_verified:boolean,country:string,is_creator:boolean),我还有另一个服务调用 ES 搜索来查找文档,我如何根据这些字段对检索到的文档进行排名?例如,经过验证的匹配用户应该比未验证的用户排在第一位。

在索引文档时是否有某种文档评分?如果是,我可以根据我的标准修改它吗?

我应该阅读/看什么来了解如何在弹性搜索中排名。

谢谢

2 个答案:

答案 0 :(得分:1)

您可以考虑在您的搜索查询中使用 Sort Api,在下面的示例中,我们使用了字段 country 的搜索并根据布尔字段 (is_verified) 对结果进行了排序,您还可以在 Sort 括号内添加其他布尔字段.

GET /yourindexname/_search
{
    "query" : {
        "match" : {
            "country": "Iceland"
        }
    },
    "sort" : [
      {
      "is_verified": {
        "order": "desc"
      }
    }
    ]
}

答案 1 :(得分:1)

我猜 Mikael 提到的排序功能非常简单,应该涵盖您的用例。查看 Elastic Doc 了解更多信息。

但是,如果您想进行真正花哨的排序,也许您可​​以使用 bool 查询和不同的提升值来为每个匹配的字段设置所需的相关性。它试图提出一个现实生活中的例子,但老实说没有找到。为完整起见,下面的代码片段应该让您了解如何获得与使用 sort API 类似的结果(但我仍然更喜欢使用 sort)。

GET /yourindexname/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "Monica"
          }
        }
      ],
      "should": [
        {
          "term": {
            "is_verified": {
              "value": true,
              "boost": 2
            }
          }
        },
        {
          "term": {
            "is_creator": {
              "value": true,
              "boost": 2
            }
          }
        }
      ]
    }
  }
}
<块引用>

在索引文档时是否有某种文档评分?如果是,我可以根据我的标准修改它吗?

我不会在索引时为文档分配固定分数,因为分数应该取决于查询。但是,如果您坚持要为每个文档预定义相关性,理论上您可以添加一个具有该值的字段 relevancy 用于排序并稍后在查询中使用它:

GET /yourindexname/_search
{
    "query" : {
        "match" : {
            "name": "Monica"
        }
    },
    "sort" : [
      {
        "relevancy": {
          "order": "desc"
        },
        "_score"
      }
    ]
}
相关问题