Elasticsearch 中的自定义排序

Bri*_*ian 5 php elasticsearch

有谁知道是否可以在 elasticsearch 中自定义排序?

我对类别字段进行了排序。按类别将所有记录组合在一起。这很好用。

但是,您能否给排序一个列表,例如汽车、书籍、食物。

然后它会先展示汽车,然后是书籍,最后是食物?

小智 6

您可以使用function_score 查询,如下所示:

{
    "query": {
        "function_score": {
          "query": { "match_all": {} },
          "boost": "5", 
          "functions": [
              {
                  "filter": { "match": { "category": "cars" } },
                  "weight": 100
              },
              {
                  "filter": { "match": { "category": "books" } },
                  "weight": 50
              },
              {
                  "filter": { "match": { "category": "food" } },
                  "weight": 1
              }
          ],
          "score_mode": "max",
          "boost_mode": "replace"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当然,您可以在何处放置您现在使用的任何查询而不是match_all查询,并保留sort(默认值是按分数,这就是您在这里想要的)。

这是用每个类别的自定义分数替换 elasticsearch 通常生成的分数。您可以尝试其他方式boost_mode,以便在类别中获得合理的排名。如果您需要了解评分发生了什么,您可以添加"explain": true到顶级查询。