首页 > 解决方案 > 在 Elastic 中排序带有“前导零”的字符串

问题描述

有没有办法根据它们的文本和数值而不是仅基于字符串来订购以下项目?

目前我得到这个订单

但我想要这样:

该字段的配置是这样的:

'type'       => 'keyword',
'normalizer' => 'lowercase_normalizer',

我在文档中没有看到任何关于它的内容

标签: sortingelasticsearch

解决方案


如果你的字符串总是由三个字母和一个零填充的数字连接,你可以使用基于脚本的排序。以下脚本将按照您喜欢的方式进行排序:

POST test/_search
{
  "sort": {
    "_script": {
      "type": "string",
      "script": {
        "lang": "painless",
        "source": """
          def letters = doc['field'].value.substring(0, 3);
          def numbers = Integer.parseInt(doc['field'].value.substring(3));
          return letters + numbers;
        """
      },
      "order": "asc"
    }
  }
}

但是,由于脚本可能会根据您的数据量而降低查询的性能,因此更好的方法是使用适当的分析器创建一个子字段,该分析器可以在索引时而不是搜索时进行此分析。这很容易做到。


推荐阅读