elasticsearch-dsl-py Sorting by Text() field

2019-07-25 15:42发布

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条回答
狗以群分
2楼-- · 2019-07-25 16:17

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

查看更多
登录 后发表回答