Elasticsearch,按照精确字符串匹配排序

3

我希望对结果进行排序,使得如果一个特定字段(比如'first_name')等于某个确切的值(比如'Bob'),那么这些文档会首先被返回。

这将导致所有名字为'Bob'的文档被首先返回,然后才是其他文档。请注意,我不打算排除那些名字不是'Bob'的文档,只是将它们排序,以便在所有Bobs之后返回。

我了解如何在Elasticsearch中进行数字或字母排序,但我找不到文档中涵盖这种类型排序的部分。

这是否可能实现,如果可以,应该怎么做?

1个回答

3
一个解决方案是操作那些名字字段中包含 "Bob" 的结果的分数。
例如:
POST /test/users
{
  "name": "Bob"
}

POST /test/users
{
  "name": "Alice"
}

GET /test/users/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "name": {
              "query": "Bob", 
              "boost" : 2
            }
          }
        }, 
        {
          "match_all": {}
        }
      ]
    }
  }
}

在这个例子中,返回的顺序是Bob和Alice(大约得分分别为1和0.2)。

来自该书

查询时间加权是您可以用来调整相关性的主要工具。任何类型的查询都接受一个boost参数。将boost设置为2并不仅仅是将最终的_score翻倍;实际应用的boost值会经过标准化和一些内部优化。然而,这意味着具有boost值为2的子句比具有boost值为1的子句重要两倍。

这意味着,如果您还希望“Fred”在Bob之前出现,您可以在上面的示例中使用3倍因子进行增强。


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