Elasticsearch не удается сортировать из-за пустой строки - PullRequest
1 голос
/ 07 июня 2019

В основном структура json для поля выглядит следующим образом:

"myflag": {
        "type": "text",
          "fields": {
            "raw": {
              "type": "keyword",
              "normalizer": "case_insensitive"
            }
          }
      }

Если у меня есть эти 5 записей:

A
a
B

C

они будут отсортированы правильно, что означает:

A
a
B
C

И 1 строка с пустым значением.

Однако, похоже, что пустая строка (вполне уверенная в этом) не установлена. Это ноль или неопределенный. В этом случае сортировка работает хорошо.

Но как только я изменю пустую строку со значением и ТОГДА очищу его, сортировка будет неправильной.

Так, например, в приведенном выше примере я установил значение для пустого значения, поэтому в конце в дБ у меня есть это:

A
a
B
Z
C

Сортировка все равно будет правильной, показывая:

A
a
B
C
Z

Но как только я очищу значение в записи, эта запись будет первой в списке. Поэтому, если я очищу значение бывшего Z, сортировка даст мне:

(EMPTY)
A
a
B
C

ПУСТОЙ ряд стал первым. Есть ли еще один параметр, который необходимо добавить в схему?

Запуск

http://127.0.0.1:9200/tambur/_settings

дает это:

analysis: {
normalizer: {
case_insensitive: {
filter: "lowercase"
}
}

}

1 Ответ

1 голос
/ 07 июня 2019

В лексическом порядке, используемом эластичным поиском, сначала сортируется пустая строка. Чтобы изменить порядок для пустой строки, вам нужно использовать пользовательскую функцию сортировки:

{
    "query" : {
        ...
    },
    "sort" : {
        "_script" : {
            "type" : "string",
            "script" : {
                "lang": "painless",
                "source": "doc['myflag.raw'].value == '' ? 'zzzzzzzz' : doc['myflag.raw'].value"
            },
            "order" : "asc"
        }
    }
}

Здесь 'zzzzzzzz' соответствует последнему ожидаемому слову в алфавитном порядке. Я не мог найти другой способ заявить явно последняя позиция

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...