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=_)
我正在尝试根据数字对数据进行排序,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
]
}
编辑:- 根据 OP 评论,他使用的 python
库支持搜索端点的 POST 方法,他使用该方法解决了问题。详情请参考问题的评论。
我的错误,我使用 help
和 dir
函数阅读了文档和代码功能
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'])
我正在尝试根据 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
]
}
编辑:- 根据 OP 评论,他使用的 python
库支持搜索端点的 POST 方法,他使用该方法解决了问题。详情请参考问题的评论。
我的错误,我使用 help
和 dir
函数阅读了文档和代码功能
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'])