问题
I have problem with .sort()
method. For example I have Index with Text() field:
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()
when I try to execute search query with sort I get an error:
elasticsearch.exceptions.RequestError: TransportError(400, 'search_phase_execution_exception', 'Fielddata is disabled on text fields by default. Set fielddata=true on [title] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory.')
How can I sort by title
field properly in this case without setting fieldata=true
?
回答1:
You cannot sort on a text
field, that is a limitation in elasticsearch. It needs to be a type keyword
.
Unfortunately type keyword
cannot have an analyzer, it can, however, have a normalizer
which performs similar, albeit a bit limited, function. Essentially the difference is that you cannot specify a tokenizer since then any sorting would not make much sense (which token would you use for sorting when you have multiple?)
hope this helps
来源:https://stackoverflow.com/questions/45220352/elasticsearch-dsl-py-sorting-by-text-field