Сортировка Elasticsearch на основе нескольких полей, а затем случайным образом - PullRequest
0 голосов
/ 30 сентября 2019
[
    {
        "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"
    }
]

У меня есть следующие элементы в индексе эластичного поиска, и я могу легко сортировать по нескольким полям, но я не нашел способа сортировки по нескольким полям, а затем по случайному.

Так, например, я бынужно сделать это:

  "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 Ответ

1 голос
/ 30 сентября 2019

Тьфу, я думаю, вам нужно сформулировать правильный вопрос, прежде чем вы сможете найти правильное решение.

В любом случае, вот ответ для всех потомков:


{
  "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"
    }
  ]
}

Вот как вы смешиваете оценку функции с фильтрацией запросов и множественной сортировкой, используя также случайное начальное число.

...