ElasticSearch 不对结果进行排序

ElasticSearch not sorting results

我正在尝试根据 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=_)

我正在尝试根据数字对数据进行排序,ascdesc 到目前为止,这是我尝试过的:

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 正在使用第一种方法向以下 URL 发送 GET 请求: http://127.0.0.1:9200/elasticie/_search?sort={%27number%27%3A+{%27order%27%3A+%27asc%27}}

我不熟悉 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 方法,他使用该方法解决了问题。详情请参考问题的评论。

我的错误,我使用 helpdir 函数阅读了文档和代码功能

Elasticsearch.search 方法中没有定义名为 sort 的参数,这就是为什么我认为我应该将它用作 params dict 中的 key 的原因需要,

感谢 @OpsterElasticSearchNinja and his ,我意识到库或我的使用方式有问题

使用 sort 键作为 post 正文发送 POST 请求效果很好, 所以我决定阅读整个源代码并找出问题所在?

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

这就是 sort 参数的定义方式,在运行时使用装饰器!!

那是我尝试这段代码的时候,不知何故它奏效了!

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