sorting - 在 Elastic 中排序带有“前导零”的字符串
问题描述
有没有办法根据它们的文本和数值而不是仅基于字符串来订购以下项目?
- ABC0001
- BCA0001
- ABC0003
- ABC00002
目前我得到这个订单
- ABC00002
- ABC0001
- ABC0003
- BCA0001
但我想要这样:
- ABC0001
- ABC00002
- ABC0003
- BCA0001
该字段的配置是这样的:
'type' => 'keyword',
'normalizer' => 'lowercase_normalizer',
我在文档中没有看到任何关于它的内容
解决方案
如果你的字符串总是由三个字母和一个零填充的数字连接,你可以使用基于脚本的排序。以下脚本将按照您喜欢的方式进行排序:
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"
}
}
}
但是,由于脚本可能会根据您的数据量而降低查询的性能,因此更好的方法是使用适当的分析器创建一个子字段,该分析器可以在索引时而不是搜索时进行此分析。这很容易做到。
推荐阅读
- ruby-on-rails - 从连接表 Ruby on Rails 中选择具有大写名称的列
- c# - UWP 将额外参数从 XAML 传递给方法
- python - cv2 Farneback 光流值太低
- android - 如何在 Google Play 管理中心拒绝/取消/删除 Beta 版本
- assembly - 使用 Tracer SCO 调试器程序集的奇数/偶数和左旋转问题
- java - 重定向根目录而不是 Google Domain 或 Google App Engine 中的文件夹
- reactjs - 如何解决 Typescript 错误 -- mapbox-gl & React hooks
- java - 如何使用界面在两个活动之间建立一个简单的桥梁?
- opencv - OpenCV- Trackbar 不会出现- 窗口不会调整大小
- html - 为什么我的 VBA 程序没有从网站获取所有等于“路径”的标签名称?