在弹性中用“前导零”对字符串排序

zf2sa74q  于 2021-06-13  发布在  ElasticSearch
关注(0)|答案(1)|浏览(314)

有没有一种方法可以根据以下项目的文本和数值而不是仅基于字符串来排序?
0001型
bca0001型
0003型
00002型
现在我收到了这个订单
00002型
0001型
0003型
bca0001型
但我想要这样:
0001型
00002型
0003型
bca0001型
该字段的配置如下:

  1. 'type' => 'keyword',
  2. 'normalizer' => 'lowercase_normalizer',

我在文件里没有看到任何关于它的东西

wyyhbhjk

wyyhbhjk1#

如果字符串中总是有三个字母与一个零填充数字串联在一起,则可以使用基于脚本的排序。以下脚本将按您喜欢的方式排序:

  1. POST test/_search
  2. {
  3. "sort": {
  4. "_script": {
  5. "type": "string",
  6. "script": {
  7. "lang": "painless",
  8. "source": """
  9. def letters = doc['field'].value.substring(0, 3);
  10. def numbers = Integer.parseInt(doc['field'].value.substring(3));
  11. return letters + numbers;
  12. """
  13. },
  14. "order": "asc"
  15. }
  16. }
  17. }

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

展开查看全部

相关问题