我有一个包含以下数据的索引:
{
"_index":"businesses",
"_type":"business",
"_id":"1",
"_version":1,
"found":true,
"_source":{
"business":{
"account_level_id":"2",
"business_city":"Abington",
"business_country":"United States of America",
}
}
}
当我查询索引时,我想按account_level_id排序(这是1-5之间的数字)。问题是,我不想按ASC或DESC顺序排序,而是通过以下方式排序:4..3..5..2..1。这是由几年前的不良做法造成的,其中帐户级别最高为4级,但随后添加了一个较低级别的帐户,其值为5.有没有办法告诉ES我希望返回的结果是特定订单?
答案 0 :(得分:1)
你可以写一些sort based script之类的东西(未经测试):
doc['account_level_id'].value == "5" ? 3 : doc['account_level_id'].value == "4" ? 5 : doc['account_level_id'].value == "3" ? 4 : doc['account_level_id'].value == "2" ? 2 : 1;
或者,如果可能,您可以创建另一个字段sort_level
,将account_level_id
映射到您可以排序的合理值。
{
"_index":"businesses",
"_type":"business",
"_id":"1",
"_version":1,
"found":true,
"_source":{
"business":{
"account_level_id":"4",
"business_city":"Abington",
"business_country":"United States of America",
"sort_level": 5
}
}
}
答案 1 :(得分:0)
如果可以在DESC中排序,则可以创建映射整数并使用它排序的函数 DESC应该将它们排序为(5 4 3 2 1),5替换为4,4替换为3,3替换为5.
int map_to(int x){
switch(x){
case 1: case 2: return x;
case 3: return 4;
case 4: return 5;
case 5: return 3;
}
}
并将其用于排序算法(因此,当排序算法必须比较x与y时,它应该比较map_to(x)vs map_to(y),这将使得4在3和5之前得到你想要的。