ElasticSearch не сортирует результаты - PullRequest
1 голос
/ 09 марта 2020

Я пытаюсь отсортировать результаты на основе поля numeric,

Вот мое отображение:

{
  "elasticie": {
    "mappings": {
      "properties": {
        "name": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "number": {
          "type": "long"
        }
      }
    }
  }
}

Я использую Python, и это мои данные тестирования:

data = [
    {'name': 'sElwUYiLXGHaQCKbdxtnvVzqIehfFWkJcPSTurgNoRD', 'number': 8583},
    {'name': 'XJEtNsIFfcwHTMhqAvRkiygjbUGzZQPdS', 'number': 8127},
    {'name': 'ZIeAGosUKJbjOdylM', 'number': 5862},
    {'name': 'HYvcafoXkC', 'number': 7458},
    {'name': 'tATJCjNuizOlGckXBpyVqSQL', 'number': 530},
    {'name': 'TFYixotjhXzNZPvHnkraRDpAMEImJfqdcVGLC', 'number': 7052},
    {'name': 'JCEGfoKDHRrcIkPQSqiVgNshZOBaMdXjAlxwUzmeWLy', 'number': 6168},
    {'name': 'IpCTwUAQynSizJtcsuDmbX', 'number': 6492},
    {'name': 'fTrcoXSBJNFhAkzWpDMxsEiLmZRvgnC', 'number': 382},
    {'name': 'ulVNmqKTpPXfEIdiykhDjMrUGOYazLBFvgnWwsRtJoQbxSe', 'number': 2061}
]

Используя следующий код, я создаю индекс и вставляю данные:

from elasticsearch import Elasticsearch
from data import data  # the data I've shown above

INDEX = 'elasticie'
es = Elasticsearch('http://127.0.0.1:9200')

for _ in data:
    es.index(index=INDEX, body=_)

Я пытаюсь отсортировать данные на основе числа, asc или desc Вот что я пытался сделать до сих пор:

es.search(index=INDEX, params={'sort': {'number': {'order': 'asc'}})
es.search(index=INDEX, params={'sort': {'number': 'asc'})
es.search(index=INDEX, params={'sort': [('number', 'asc')]})
es.search(index=INDEX, params={'sort': {'number': {'order': 'asc', 'ignore_unmapped': True}})
es.search(index=INDEX, params={'sort': {'number': {'order': 'asc', 'unmapped_type': 'integer'}})
es.search(index=INDEX, params={'sort': {'number': {'order': 'asc', 'unmapped_type': 'long'}})
es.search(index=INDEX, params={'sort': {'number.raw': 'asc'})

У меня не сработали вышеуказанные методы, результат такой же, как у вставленных данных, если я назначу вышеуказанные строки переменной с именем search_result и распечатайте результат, используя следующий код:

for index, result in enumerate(search_result['hits']['hits']):
    print(f'{index}. {result["_source"]["number"]}')

Я получу следующий результат:

0. 8583
1. 8127
2. 5862
3. 7458
4. 530
5. 7052
6. 6168
7. 6492
8. 382
9. 2061

Который явно не отсортирован с использованием поля number! !

Я не знаю, что я делаю неправильно, я использую ElasticSearch 7.6 и Python 3.8

Как мне заставить работать результаты сортировки?

Обновление

На основании журналов отладки Python отправляет запрос GET на следующий URL-адрес с использованием первого метода: http://127.0.0.1:9200/elasticie/_search?sort={%27number%27%3A+{%27order%27%3A+%27asc%27}}

Ответы [ 2 ]

2 голосов
/ 09 марта 2020

Я не знаком с python, но вот запрос Elasticsearch JSON, который сортирует ваши документы по номерам в порядке desc. Я пробовал с вашим набором данных, и он дает правильные результаты.

Сортировать поисковый запрос

{
    "sort": [
        {
            "number": {
                "order": "desc"
            }
        }
    ]
}

Результаты

"hits": [
         {
            "_index": "so-60598395-sort",
            "_type": "_doc",
            "_id": "1",
            "_score": null,
            "_source": {
               "name": "sElwUYiLXGHaQCKbdxtnvVzqIehfFWkJcPSTurgNoRD",
               "number": 8583
            },
            "sort": [
               8583
            ]
         },
         {
            "_index": "so-60598395-sort",
            "_type": "_doc",
            "_id": "2",
            "_score": null,
            "_source": {
               "name": "XJEtNsIFfcwHTMhqAvRkiygjbUGzZQPdS",
               "number": 8127
            },
            "sort": [
               8127
            ]
         },
         {
            "_index": "so-60598395-sort",
            "_type": "_doc",
            "_id": "4",
            "_score": null,
            "_source": {
               "name": "HYvcafoXkC",
               "number": 7862
            },
            "sort": [
               7862
            ]
         },
         {
            "_index": "so-60598395-sort",
            "_type": "_doc",
            "_id": "3",
            "_score": null,
            "_source": {
               "name": "ZIeAGosUKJbjOdylM",
               "number": 5862
            },
            "sort": [
               5862
            ]
         }

РЕДАКТИРОВАТЬ: - На основе OP комментарии, python библиотека, которую он использует, поддерживает метод POST конечной точки поиска, с помощью которого он решил проблему. Обратитесь к комментариям по этому вопросу для получения более подробной информации.

0 голосов
/ 09 марта 2020

Моя ошибка, я прочитал документацию и функциональность кода, используя функции help и dir

Нет параметра с именем sort, определенного в методе Elasticsearch.search, поэтому я подумал, что я следует использовать его как key в рамках params требуемого

Благодаря @ OpsterElasticSearchNinja и его комментарию , я понял, что что-то не так с библиотекой или с тем, как я ее использую

Отправка запроса POST с ключом sort в качестве тела сообщения работала хорошо, поэтому я решил прочитать весь исходный код и выяснить, что происходит не так?

@query_params(
    #...
    "size",
    "sort",
    #...
)
def search(self, body=None, index=None, doc_type=None, params=None):
    # ...

Так определяется параметр sort с использованием декоратора во время выполнения !!

Вот когда я попробовал этот код, и каким-то образом он заработал!

es.search(index=INDEX, sort=['number:asc'])
...