ElasticSearch естественная сортировка по одному сложному полю

Это для ElasticSearch 6.4.1.

Клиент является архивом, и записи имеют поле "RefNo" (ссылочный номер), в котором они в основном идентифицируют записи. Однако это не простое поле, а поле, разделенное косой чертой, которое представляет иерархию записей, где каждый раздел идентификации может представлять собой смесь цифр и букв, так что, например, "abc" представляет одну коллекцию, а "a142" - другую: abc/foo", "abc/bar", "a142/1/letters", "a142/2/letters", "a142/10/letters"- это различные элементы на разных уровнях. Они выглядят довольно абстрактно для меня, но для архивариусов они действительно значимы.

Я думаю, вы можете предвидеть проблему. Я хочу иметь возможность упорядочить это поле (на самом деле это ключевое слово с именем 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 ответов

Другие вопросы по тегам