Сортировка Elasticsearch по строке, не возвращающей ожидаемые результаты

При сортировке в поле строки с несколькими словами Elasticsearch разбивает строковое значение и использует значение min или max как значение сортировки. I.E.: При сортировке по полю со значением "Глаз тигра" в порядке возрастания значение сортировки: "Глаз", а при сортировке в порядке убывания значение равно "Тигр".

Допустим, что у меня есть "Глаз тигра" и "Колесо смерти" в качестве записей в моем индексе, когда я делаю восходящую сортировку в этом поле, я бы ожидал, что "Глаз тигра" будет первым, поскольку "E" предшествует "W", но то, что я вижу при сортировке на этом поле, "Колесо смерти" идет первым, так как "D" - это минимальное значение этого термина, а "E" - минимальное значение "Глаз тигра".

Кто-нибудь знает, как отключить это поведение и просто разрешить регулярную сортировку в этом поле строки?

Ответы

Ответ 1

Как упоминалось в mconlin, если вы хотите сортировать по неанализируемому полю doc, вам нужно указать "index": "not_analyzed" для сортировки, как описано. Но если вы хотите, чтобы это поле было открыто для поиска, этот пост от sloan показывает отличный пример. Использование multi-field для сохранения двух разных сопоставлений для поля очень часто встречается в Elasticsearch.

Надеюсь, что это поможет, дайте мне знать, если я могу предложить больше объяснений.

Ответ 2

Если вы хотите, чтобы сортировка была нечувствительной к регистру "index": "not_analyzed" не работает, поэтому я создал собственный анализатор сортировки.

индекс-settings.yml

index :   
    analysis :
        analyzer :
            sort :
                type : custom
                tokenizer : keyword
                filter : [lowercase]

Mapping:

...
"articleName": {
    "type": "string",
    "analyzer": "standard",
    "fields": {
        "sort": {
            "type": "string",
            "analyzer": "sort"
        }
    }
}
...