ElasticSearch未对结果进行排序



我正试图根据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
]
}

EDIT:-根据OP评论,他正在使用的python库支持搜索端点的POST方法,他使用该方法解决了问题。有关更多详细信息,请参阅对该问题的评论

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

Elasticsearch.search方法上没有定义名为sort的参数,这就是为什么我认为我应该在它所采用的paramsdict中使用它作为key

感谢@OpsterElasticSearchNinja和他的评论,我意识到图书馆或我使用的方式有问题

以CCD_ 17密钥为主体发送POST请求效果良好,所以我决定阅读整个源代码,找出哪里出了问题?

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

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

就在那时,我尝试了这个代码,不知怎么的,它成功了!

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

相关内容

  • 没有找到相关文章

最新更新