弹性搜索按字符串对数字进行排序


Elastic Search sort numbers in string

在弹性搜索中,我使用sort按地址的第一行进行排序。但是,如果地址以数字开头,则排序为:

1 Some Street
10 Some Street
12 Some Street
2 Some Street
22 Some Street
24 Some Street

我宁愿将其订购为 1、2、10、12、22、24 等。

在 php 中对下面的代码进行排序:

$params['sort'] = array('line_1:asc');

在多维数组中进行自然排序的函数:

function nat_multi_sort ($a, $b) {
    return strnatcmp($a['line_1'], $b['line_1']);
}
usort($array, 'nat_multi_sort');

这需要使用脚本来解决。如果地址中的第一个标记是数字,则单独使用该数字进行排序。或者传递正无穷大作为排序值。

{
  "sort": [
    {
      "_script": {
        "script": "try { Integer.parseInt(doc['address'].value); } catch(Exception e){ return Integer.MAX_VALUE;}",
        "type": "number",
        "order": "asc",
        "lang": "groovy"
      }
    }
  ]
}

这样,不以数字开头的地址将被发送到末尾。带有数字的将根据其数值进行排序