如何按照提供的id顺序获取ElasticSearch文档

fdx2calv  于 2022-11-02  发布在  ElasticSearch
关注(0)|答案(2)|浏览(112)

我有我有id的顺序,[1,4,2,5]和一些过滤器{ match:{...} },并且我希望结果文档按[1,4,2,5]的顺序返回。实现此目的的最佳方法是什么?
示例文档:

{
    "id": <uuid>,
    "name": "Some name",
    "description": "Some description"
}

现在我知道每个文档的ES stores _id和es doc的_id以及我的doc中的id字段是相同的。
所以我想提供一个id数组,并在所有的过滤后按该顺序得到结果。
例如,我有4个文档

{
    "id": "abcd",
    "name": "test1",
    "description": "test1"
},
{
    "id": "bcde",
    "name": "test2",
    "description": "test2"
},
{
    "id": "cdef",
    "name": "test3",
    "description": "test3"
}

现在我有id数组[“cdef”,“abcd”,“bcde”],所以我想查询es并以上面指定的顺序得到结果,这意味着具有cdef的doc必须首先出现在命中中,然后是具有abcd的doc,最后是具有bcde的doc

iyfamqjs

iyfamqjs1#

这个答案是基于使用脚本排序的。在这里,您需要将所有数组项与score值一起传递,并基于此,当特定文档与id匹配时,脚本将为该文档分配分数。

{
  "sort": {
    "_script": {
      "type": "number",
      "script": {
        "lang": "painless",
        "source": """for (int i = 0; i < params.scoring.length; i++) { if(doc['id.keyword'].value ==  params.scoring[i]['id']) return params.scoring[i]['score']; } return 0;""",
        "params": {
          "scoring": [
            {
              "id": "cdef",
              "score": 1
            },
            {
              "id": "abcd",
              "score": 2
            },
            {
              "id": "bcde",
              "score": 3
            }
          ]
        }
      },
      "order": "asc"
    }
  },
  "query": {
    "terms": {
      "id": [
        "cdef",
        "abcd",
        "bcde"
      ]
    }
  }
}
1aaf6o9v

1aaf6o9v2#

我建议您使用如下脚本:

{
    "sort": {
        "_script": {
            "type": "number",
            "script": {
                "source": "params.get(doc._id.value);",
                "params": {
                    "5c357c0eb565e654fcc3507c": 0,
                    "5c3539f1b565e632d1c690ee": 1
                },
                "lang": "painless"
            },
            "order": "asc"
        }
    }
}

相关问题