单个复杂字段上的ElasticSearch自然排序

时间:2018-11-23 11:23:18

标签: sorting elasticsearch elasticsearch-6

这是针对ElasticSearch 6.4.1。

客户端是一个存档,记录中有一个“ RefNo”(参考号)字段,这是它们主要标识记录的方式。不过,这不是一个简单的字段,而是一个以斜杠分隔的字段,它表示记录的层次结构,其中每个标识节可以是数字和字母的混合,因此,例如“ abc”代表一个集合,而“ a142”代表另一个集合:“ abc / foo”,“ abc / bar”,“ a142 / 1 /字母”,“ a142 / 2 /字母”,“ a142 / 10 /字母”都是不同级别的各种项目。他们对我来说看起来很抽象,但对档案管理员而言,它们实际上是有意义的。

我想您可以预见到问题。我希望能够以一种显而易见的自然顺序在此字段上进行排序(实际上是它的关键字版本称为RefNo.keyword):

a15
a142
abc
abc/bar
abc/bar/1
abc/bar/2
abc/bar/10/letters
abc/bar/10/letters/1
abc/bar/10/letters/2
abc/foobar/

,依此类推。诀窍是让数字部分按自然数字顺序而不是字母顺序排列,而其余部分按字母顺序排列。

在另一种情况下,我具有单个记录的子记录列表,在这种情况下,解决方案是先按字段长度排序,然后按数字顺序排序:

"sort:[
    "_script":{
        "script":"doc['RefNo.keyword'].value.length()",
        "type":"number",
        "order":asc"
    },
    "RefNo.keyword":{
        "order":"asc"
    }
]

但是,当然,只有当值与上一节相同时,所有值都相同。

对于一般情况,我觉得我缺少一些非常简单的东西。那只是一厢情愿吗?

谢谢, 本

0 个答案:

没有答案