我正试图根据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使用第一种方法向以下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方法,他使用该方法解决了问题。有关更多详细信息,请参阅对该问题的评论
我的错误,我使用help
和dir
函数阅读了文档和代码功能
在Elasticsearch.search
方法上没有定义名为sort
的参数,这就是为什么我认为我应该在它所采用的params
dict中使用它作为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'])