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
которая выполняет аналогичную, хотя и немного ограниченную, функцию. По сути, разница в том, что вы не можете указать токенайзер, так как тогда любая сортировка не будет иметь большого смысла (какой токен вы бы использовали для сортировки, когда у вас есть несколько?)
надеюсь это поможет