asticsearch-dsl-py Сортировка по тексту () поле

У меня проблема с .sort() метод. Например, у меня есть поле Index with Text():

FILTER = token_filter(
    'FILTER', 'edge_ngram', min_gram=3, max_gram=40)
ANALYZER = analyzer(
    'ANALYZER', tokenizer='standard', type='custom', filter=[
        'standard', 'lowercase', 'stop', 'asciifolding',FILTER])

class Article(DocType):
    title = Text(analyzer=ANALYZER)
    body = Text(analyzer='snowball')
    tags = Keyword()

search = Article.search().sort('title')
search.execute()

когда я пытаюсь выполнить поисковый запрос с сортировкой, я получаю сообщение об ошибке:

asticsearch.exceptions.RequestError: TransportError(400, 'search_phase_execution_exception', 'Fielddata отключена для текстовых полей по умолчанию. Установите fielddata=true в [title], чтобы загружать fielddata в память путем инвертирования инвертированного индекса. Обратите внимание, что это может, однако, использовать значительную память.')

Как я могу сортировать по title поле правильно в этом случае без настройки fieldata=true?

1 ответ

Решение

Вы не можете сортировать по text поле, которое является ограничением в эластичном поиске. Это должен быть тип keyword,

К сожалению типа keyword не может иметь анализатор, он может, однако, иметь normalizer которая выполняет аналогичную, хотя и немного ограниченную, функцию. По сути, разница в том, что вы не можете указать токенайзер, так как тогда любая сортировка не будет иметь большого смысла (какой токен вы бы использовали для сортировки, когда у вас есть несколько?)

надеюсь это поможет

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