在上一篇博客中,我们记录了如何使用Elasticsearch的查询表达式进行一些简单的搜索。接下来将记录如何对查询的数据进行排序。
在之前的博客中有提到,Elasticsearch默认是按照_score
的值来进行倒叙排序的:
curl -XGET 'http://localhost:9200/pycharm/python/_search' -d '
{
"query":{
"match":{
"name":"老王"
}
}
}
'
将获得如下数据:
{
"hits": {
"total": 2,
"max_score": 0.51623213,
"hits": [
{
"_index": "pycharm",
"_type": "python",
"_id": "AV91thbjDeJV7vg4lrC0",
"_score": 0.51623213,
"_source": {
"name": "老王",
"age": 20,
"single": true,
"sinature": "一切皆有可能",
"addr": "广西"
}
},
{
"_index": "pycharm",
"_type": "python",
"_id": "AV91tbWcDeJV7vg4lrCz",
"_score": 0.25811607,
"_source": {
"name": "老张",
"age": 18,
"single": false,
"sinature": "一切皆不可能",
"addr": "江西"
}
}
]
}
}
从查询到的数据结果可以看出,数据是按照_score
的大小进行排序的,_score
值越大,越靠前,而且匹配程度越高,_score
值越大。
在日常的开发中,我们不可能每次都是按照默认的排序进行获取数据,有时,需要数据按照我们指定的字段的值来进行排序,此时,我们可以使用sort
参数来进行实现:
curl -XGET 'http://localhost:9200/pycharm/python/_search' -d '
{
"query":{
"match":{
"name":"老王"
}
},
"sort":{
"age":{
"order":"asc"
}
}
}
'
将获得如下结果:
"hits": {
"total": 2,
"max_score": null,
"hits": [
{
"_index": "pycharm",
"_type": "python",
"_id": "AV91tbWcDeJV7vg4lrCz",
"_score": null,
"_source": {
"name": "老张",
"age": 18,
"single": false,
"sinature": "一切皆不可能",
"addr": "江西"
},
"sort": [
18
]
},
{
"_index": "pycharm",
"_type": "python",
"_id": "AV91thbjDeJV7vg4lrC0",
"_score": null,
"_source": {
"name": "老王",
"age": 20,
"single": true,
"sinature": "一切皆有可能",
"addr": "广西"
},
"sort": [
20
]
}
]
}
从结果数据可以看出,数据真的按照指定的字段值进行排序。因为修改了默认排序的缘故,数据将不再返回_score
值。
值得注意的是,修改了默认排序之后,在每个的结果中都会有一个新的名为
sort
的元素,它包含了我们用于排序的值。倘若数据是按照日期进行排序,即假设数据中包含了一个日期字段,并且按照日期进行排序,那么sort将会包含这个日期的long类型,即将日期转换成毫秒数的值。
在日常开发中,只对一个字段进行排序往往不能满足我们的需求,此时,我们需要对多个字段进行排序,我们可以这样:
curl -XGET 'http://localhost:9200/pycharm/python/_search' -d '
{
"query":{
"match":{
"name":"老王"
}
},
"sort":{
"age":{
"order":"asc"
},
"_score":{
"order":"desc"
}
}
}
'
将会获得如下结果:
"hits": {
"total": 2,
"max_score": null,
"hits": [
{
"_index": "pycharm",
"_type": "python",
"_id": "AV91tbWcDeJV7vg4lrCz",
"_score": 0.25811607,
"_source": {
"name": "老张",
"age": 18,
"single": false,
"sinature": "一切皆不可能",
"addr": "江西"
},
"sort": [
18,
0.25811607
]
},
{
"_index": "pycharm",
"_type": "python",
"_id": "AV91thbjDeJV7vg4lrC0",
"_score": 0.51623213,
"_source": {
"name": "老王",
"age": 20,
"single": true,
"sinature": "一切皆有可能",
"addr": "广西"
},
"sort": [
20,
0.51623213
]
}
]
}
此时我们就能够根据多个条件进行排序了。如果我们将排序中age
和_score
的顺序调换一下,你会发现有这截然不同的结果(这里我就补贴代码进行举证了,有兴趣的同学可以自己进行验证一下),此时我们可以判断sort
排序是根据字段的前后顺序来进行优先级排序的。
有的字段是列表类型的,那我们该如何根据这个类型的字段进行排序呢?此时,我们可以将此字段减为单值,这样就可以通过使用min
,max
,sum
或者是avg
模式进行排序,假设有这样一组数据:
"hits": {
"hits": [
{
"_index": "pycharm",
"_type": "python",
"_id": "2",
"_source": {
"name": "laozhang",
"info": [
80,
95,
85
]
}
},
{
"_index": "pycharm",
"_type": "python",
"_id": "1",
"_source": {
"name": "laowang",
"info": [
80,
95,
77
]
}
}
]
}
从数据可以看出,字段info
是数组类型,接下来我们通过info
字段进行排序,info
列表中的最小值进行升序排序:
curl -XGET 'http://localhost:9200/pycharm/python/_search' -d '
{
"sort":{
"info":{
"order":"asc",
"mode":"min"
}
}
}
'
将会获得如下结果:
"hits": {
"total": 2,
"max_score": null,
"hits": [
{
"_index": "pycharm",
"_type": "python",
"_id": "1",
"_score": null,
"_source": {
"name": "laowang",
"info": [
80,
95,
77
]
},
"sort": [
77
]
},
{
"_index": "pycharm",
"_type": "python",
"_id": "2",
"_score": null,
"_source": {
"name": "laozhang",
"info": [
80,
95,
85
]
},
"sort": [
80
]
}
]
}
从结果数据中可以看出,在每个的结果中都会有一个新的名为sort
的元素,它包含了我们用于排序的值,第一组数组中是77,即info
列表中的最小值。可以看出数据正是按照我们想要的排序方式进行获取数据。
上面的栗子是针对于字段为列表类型,然后对该字段的最小值,最大值,平均值或者和来进行排序,如果字段是字典类型,那么该怎么对其进行排序呢?下面有这样一组数据:
"hits": {
"total": 2,
"hits": [
{
"_index": "pycharm",
"_type": "python",
"_id": "2",
"_score": 1,
"_source": {
"name": "laozhang",
"userInfo": {
"addr":"深圳",
"age":18
}
}
},
{
"_index": "pycharm",
"_type": "python",
"_id": "1",
"_score": 1,
"_source": {
"name": "laowang",
"userInfo": {
"addr":"广州",
"age":20
}
}
}
]
}
我们需要对userInfo
中的age
值进行倒序排序,如下:
curl -XGET 'http://localhost:9200/pycharm/python/_search' -d '
{
"sort":{
"userInfo.age":{
"order":"desc"
}
}
}
'
将会获得如下数据:
"hits": {
"total": 2,
"max_score": null,
"hits": [
{
"_index": "pycharm",
"_type": "python",
"_id": "1",
"_score": null,
"_source": {
"name": "laowang",
"userInfo": {
"addr": "广州",
"age": 20
}
},
"sort": [
20
]
},
{
"_index": "pycharm",
"_type": "python",
"_id": "2",
"_score": null,
"_source": {
"name": "laozhang",
"userInfo": {
"addr": "深圳",
"age": 18
}
},
"sort": [
18
]
}
]
}
从结果数据可以看出,数据的排列正是按照我们想要的排序方式排列的。