首页 > 解决方案 > 基于元素的Elasticsearch脚本排序存在于数组中

问题描述

我有这样一份文件清单:

[
  {
    "id": 123,
    "name": "Ram",
    "status": 1,
    "activity": "Poster Design",
    "categories": [1, 2, 3, 4, 5]
  },
  {
    "id": 124,
    "name": "Leo",
    "categories": [5],
    "status": 1,
    "activity": "Brochure"
  },
  {
    "id": 126,
    "name": "Leo",
    "categories": [3],
    "status": 1,
    "activity": "Brochure"
  },
  {
    "id": 134,
    "name": "Levin",
    "categories": [1],
    "status": 1,
    "activity": "3D Printing"
  }
]

如果我对包含 1 的类别进行排序(这可以是 3 或 5 或 7),我想要输出。因此,它将首先对所有类别包含 1 的所有记录进行排序。

所以如果排序是由 3 输出应该是

    [
      {
        "id": 123,
        "name": "Ram",
        "status": 1,
        "activity": "Poster Design",
        "categories": [1, 2, 3, 4, 5]
      },
      {
        "id": 126,
        "name": "Leo",
        "categories": [3],
        "status": 1,
        "activity": "Brochure"
      },
      {
        "id": 124,
        "name": "Leo",
        "categories": [5],
        "status": 1,
        "activity": "Brochure"
      },
      {
        "id": 134,
        "name": "Levin",
        "categories": [1],
        "status": 1,
        "activity": "3D Printing"
      }
    ]

标签: elasticsearch

解决方案


按数组字段排序时,需要指定排序方式。

POST /_search
{
  "sort": [{ "categories": { "order": "asc", "mode": "min" } }]
}

在您的情况下-它将1对开头包含类别的文档进行排序。

在文档中阅读更多信息:https ://www.elastic.co/guide/en/elasticsearch/reference/current/sort-search-results.html#_sort_mode_option

更新

您可以完全避免排序并使用查询来提升具有特定值的值category_id

{
  "query": {
    "bool": {
      "must": [
        {
          "match_all": {}
        }
      ],
      "should": [
        {
          "term": {
            "categories": {
              "value": 3,
              "boost": 2.0
            }
          }
        }
      ]
    }
  }
}

mustpart 将匹配所有文档,并且该子句将为其should中的文档添加额外的提升,从而有效地将它们排名更高。3categories


推荐阅读