elasticsearch 按值列表中的位置排序,elasticsearch,elasticsearch" /> elasticsearch 按值列表中的位置排序,elasticsearch,elasticsearch" />

elasticsearch 按值列表中的位置排序

elasticsearch 按值列表中的位置排序,elasticsearch,elasticsearch,我需要构建elasticsearch查询,通过数组中的字段值定位进行排序 与MySQL类似: SELECT * FROM `comments` ORDER BY FIELD(`id`,'17','3','5','12') DESC, id DESC; 或博士后: SELECT * FROM comments LEFT JOIN unnest('{12,5,3,17}'::int[]) WITH ORDINALITY t(id, ord) USING (id) ORDER BY t.ord,

我需要构建elasticsearch查询,通过数组中的字段值定位进行排序

与MySQL类似:

SELECT * FROM `comments` ORDER BY FIELD(`id`,'17','3','5','12') DESC, id DESC;
或博士后:

SELECT * FROM comments
LEFT JOIN unnest('{12,5,3,17}'::int[]) WITH ORDINALITY t(id, ord) USING (id) ORDER  BY t.ord, id DESC;

您正在elasticsearch中查找自定义排序
可以通过无痛脚本来实现
我就是这么做的

PUT my_test
{
  "mappings": {
    "properties": {
      "animal": {
        "type": "keyword"
      }
    }
  }
}
填充文档

POST my_test/_doc
{
  "animal": "mouse"
}
POST my_test/_doc
{
  "animal": "cat"
}
POST my_test/_doc
{
  "animal": "dog"
}
自定义排序

GET my_test/_search
{
  "query": {
    "match_all": {}
  },

    "sort": {
        "_script": {
            "type": "number",
            "script": {
                "lang": "painless",
                "source": "if(params.scores.containsKey(doc['animal'].value)) { return params.scores[doc['animal'].value];} return 100000;",
                "params": {
                    "scores": {
                        "dog": 0,
                        "cat": 1,
                        "mouse": 2
                    }
                }
            },
            "order": "asc"
        }
    }
}

只是为了赞美上面的答案

您可以结合使用这种方法将某些项目提升到顶部,并根据搜索结果中所有其他项目的相关性保持原始排序

"sort": {
    "_script": {
        "type": "number",
        "script": {
            "lang": "painless",
            "source": "if(params.scores.containsKey(doc['sku'].value)) { return params.scores[doc['sku'].value];} return 10",
            "params": {
                "scores": {
                    "3JK76": 0,
                    "8UF78": 1
                }
            }
        },
        "order": "asc"
    },
    "_score": { "order": "desc" }
}