Elasticsearch基于多个字段排序,然后按随机种子排序

时间:2019-09-30 12:39:56

标签: sorting elasticsearch random

[
    {
        "id": "1",
        "title": "example title 1",
        "priority": "high"
    },
    {
        "id": "2",
        "title": "example title 2",
        "priority": "high"
    },
    {
        "id": "3",
        "title": "example title 3",
        "priority": "high"
    },
    {
        "id": "4",
        "title": "example title 4",
        "priority": "low"
    },
    {
        "id": "5",
        "title": "example title 5",
        "priority": "low"
    },
    {
        "id": "6",
        "title": "example title 6",
        "priority": "low"
    }
]

我的Elasticsearch索引中包含以下项目,我可以轻松地按多个字段进行排序,但是我没有找到按多个字段进行排序然后随机的方法。

例如,我需要这样做:

  "sort": [
    {
      "priority": "asc"
    },

    _script: {
        script: "Math.random() * 200000",
        type: "number",
        params: {},
        order: "asc"
    }

  ]

因此,假设在第一个查询中,您会得到以下结果:

3,2,1 (高优先级排在第一位,但是随机的), 5,4,6 (低优先级排在其后,也是随机的)

第二个查询也可能像这样:

2,1,3 (高), 6,5,4 (低)

1 个答案:

答案 0 :(得分:1)

嗯,我想您需要先阐明一个正确的问题,然后才能找到合适的解决方案。

无论如何,这是所有后代的答案:


{
  "size": 3,
  "query": {
    "function_score": {
      "query": {
        "bool": {
          "must": [
            {
              "term": {
                "my_column1": "805"
              }
            },
            {
              "match": {
                "my_column2": "30"
              }
            },
            {
              "range": {
                "product_price": {
                  "gt": "500",
                  "lt": "1000"
                }
              }
            },
            {
              "match": {
                "my_column3": "0"
              }
            }
          ]
        }
      },
      "functions": [
        {
          "random_score": {
            "seed": "1477072619038"
          }
        }
      ]
    }
  },
  "sort": [
    {
      "priority": "asc"
    },
    {
      "date_added": "asc"
    },
    {
      "_score": "asc"
    }
  ]
}

这是将函数分数与查询过滤和还使用随机种子的多重排序混合在一起的方式。