首页 > 解决方案 > ElasticSearch 按值排序

问题描述

我有 ElasticSearch 5,我想根据字段值进行排序。想象一下具有类别的文档,例如可以具有科幻、戏剧、喜剧等值的类型,在进行搜索时,我想排序值,以便首先出现喜剧,然后是科幻和戏剧。然后,我当然会按其他标准在组内排序。有人可以指出我如何做到这一点吗?

标签: sortingelasticsearch

解决方案


使用手动排序的 Elasticsearch 排序

elasticsearch在您可以根据字段的特定值分配顺序的情况下,这是可能的。

我已经使用基于脚本的排序实现了您正在寻找的内容,该排序利用了无痛脚本。您可以参考我提到的链接以了解更多关于以下查询的信息,这足以满足您的需求。

还假设你有genremovie作为关键字,下面的映射。

PUT sampleindex
{
  "mappings": {
    "_doc": {
      "properties": {
        "genre": {
          "type": "text",
          "fields": {
            "raw": { 
              "type":  "keyword"
            }
          }
        },
        "movie": {
          "type": "text",
          "fields": {
            "raw": { 
              "type":  "keyword"
            }
          }
        }
      }
    }
  }
}

您可以使用以下查询来获取您要查找的内容

GET sampleindex/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [{
        "_script": {
            "type": "number",
            "script": {
                "lang": "painless",
                "inline": "if(params.scores.containsKey(doc['genre.raw'].value)) { return params.scores[doc['genre.raw'].value];} return 100000;",
                "params": {
                    "scores": {
                        "comedy": 0,
                        "sci-fi": 1,
                        "drama": 2
                    }
                }
            },
            "order": "asc"
        }
    },
    { "movie.raw": { "order": "asc"}
    }]
}

请注意,我已经为genre和包括了排序movie。基本上排序会发生genre并发布,它将根据movie每种类型进行排序。

希望能帮助到你。


推荐阅读