【问题标题】:Elastic Search sort numbers in string弹性搜索对字符串中的数字进行排序
【发布时间】:2015-02-25 06:49:49
【问题描述】:

在弹性搜索中,我使用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');

【问题讨论】:

  • 查看natsort()
  • 酷,我一直在寻找弹性搜索的解决方案,但由于我在弹性搜索中只返回一小部分文档,所以在 php 中排序很好。结果在一个多维数组中,所以我将发布代码作为答案。
  • 在 PHP 客户端排序不起作用。大多数情况下,您将一次处理一页文档(Say 10),而这种排序仅适用于此。但随后您需要将其应用于整个文档。
  • @VineethMohan “在 PHP 客户端排序”这句话让我觉得你不明白 PHP 是如何工作的……PHP 严格来说是服务器端的。
  • 但是它可以从 Elasticsearch“服务器”内部运行吗?假设我们有 10 亿个地址。对于每个搜索请求,可能无法将这整个 10 亿个地址带到 PHP 端,根据上述函数对其进行排序并获取前 10 或 20 个结果......在这种情况下,我们需要从 Elasticsearch 运行它“服务器”端,使用我在答案部分给出的代码。

标签: php elasticsearch lucene


【解决方案1】:

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

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

usort($array, 'nat_multi_sort');

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-12
      • 1970-01-01
      • 2018-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-21
      相关资源
      最近更新 更多