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"
}
]
Но, конечно, это работает, только если все значения идентичны, кроме последнего раздела.
В общем случае у меня есть ощущение, что я упускаю что-то очень простое. Это просто желаемое за действительное?
Спасибо Бен