Elasticsearch - 按输入选项排序

时间:2014-08-13 16:23:59

标签: sorting elasticsearch

我有一个包含以下数据的索引:

{  
  "_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我希望返回的结果是特定订单?

2 个答案:

答案 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之前得到你想要的。