Sorting Elasticsearch按字母顺序排序,然后按数字排序
我在寻找一种优雅的方法来对结果进行排序,先是按字母表,然后按数字 我当前的解决方案是使用下一个排序脚本在数字之前插入“~”,按字典顺序,在“z”之后插入“~”: 但我想知道是否有一个更优雅、也许更高效的解决方案 输入:Sorting Elasticsearch按字母顺序排序,然后按数字排序,sorting,elasticsearch,Sorting,elasticsearch,我在寻找一种优雅的方法来对结果进行排序,先是按字母表,然后按数字 我当前的解决方案是使用下一个排序脚本在数字之前插入“~”,按字典顺序,在“z”之后插入“~”: 但我想知道是否有一个更优雅、也许更高效的解决方案 输入: ZBA ABC ... ABC SDK ... 123 RIU ... 12B BTE ... 11J TRE ... BCA 642 ... 期望输出: ABC SDK ... BCA 642 ... ZBA ABC ... 11J TRE ... 12B BTE ... 1
ZBA ABC ...
ABC SDK ...
123 RIU ...
12B BTE ...
11J TRE ...
BCA 642 ...
期望输出:
ABC SDK ...
BCA 642 ...
ZBA ABC ...
11J TRE ...
12B BTE ...
123 RIU ...
您可以在索引时使用一个利用。在索引时执行此操作比在搜索时为每个查询运行脚本排序更有效 它的工作原理与您的解决方案相同,即,如果我们检测到一个数字,我们会在值前面加上一个波浪号
~
,否则我们什么也不做,但我们会在索引时做,并在name.sort
字段中索引结果值
PUT /tests
{
"settings": {
"analysis": {
"char_filter": {
"pre_num": {
"type": "pattern_replace",
"pattern": "(\\d)",
"replacement": "~$1"
}
},
"analyzer": {
"number_tagger": {
"type": "custom",
"tokenizer": "keyword",
"filter": [],
"char_filter": [
"pre_num"
]
}
}
}
},
"mappings": {
"test": {
"properties": {
"name": {
"type": "string",
"fields": {
"sort": {
"type": "string",
"analyzer": "number_tagger",
"search_analyzer": "standard"
}
}
}
}
}
}
}
然后你可以索引你的数据
POST /tests/test/_bulk
{"index": {}}
{"name": "ZBA ABC"}
{"index": {}}
{"name": "ABC SDK"}
{"index": {}}
{"name": "123 RIU"}
{"index": {}}
{"name": "12B BTE"}
{"index": {}}
{"name": "11J TRE"}
{"index": {}}
{"name": "BCA 642"}
然后您的查询可以简单地如下所示:
POST /tests/_search
{
"sort": {
"name.sort": "asc"
}
}
您将得到的答复是:
{
"hits": {
"hits": [
{
"_source": {
"name": "ABC SDK"
}
},
{
"_source": {
"name": "BCA 642"
}
},
{
"_source": {
"name": "ZBA ABC"
}
},
{
"_source": {
"name": "11J TRE"
}
},
{
"_source": {
"name": "12B BTE"
}
},
{
"_source": {
"name": "123 RIU"
}
}
]
}
}
幸运吗?我喜欢在索引时进行更改,但没有比在数字前添加一个平铺更聪明的解决方案了?这无法说服我。波浪号只添加到一个仅用于排序的字段中。词典排序就是这样。原始输入完全没有改变。该解决方案与您刚才在索引时执行的解决方案相同,而不是在搜索时利用昂贵的脚本是的,我理解,但我想找到另一种不同的方法,而不是在数字I可以提供另一种解决方案来计算排序数之前使用波浪号(~)保存另一个字段,但这仍然需要添加另一个字段来进行排序,因为您希望改变词典排序的工作方式。
{
"hits": {
"hits": [
{
"_source": {
"name": "ABC SDK"
}
},
{
"_source": {
"name": "BCA 642"
}
},
{
"_source": {
"name": "ZBA ABC"
}
},
{
"_source": {
"name": "11J TRE"
}
},
{
"_source": {
"name": "12B BTE"
}
},
{
"_source": {
"name": "123 RIU"
}
}
]
}
}