ElasticSearch естественная сортировка по одному сложному полю - PullRequest
0 голосов
/ 23 ноября 2018

Это для 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"
    }
]

Но, конечно, это работает, только если все значения идентичны, кроме последнего раздела.

В общем случае у меня есть ощущение, что я упускаю что-то очень простое.Это просто желаемое за действительное?

Спасибо, Бен

...