elasticsearch-dsl-py 按 Text() 字段排序

elasticsearch-dsl-py Sorting by Text() field

我对 .sort() 方法有疑问。例如,我有带有 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()

当我尝试使用排序执行搜索查询时出现错误:

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.')

在这种情况下,如何在不设置 fieldata=true 的情况下按 title 字段正确排序?

您不能对 text 字段进行排序,这是 elasticsearch 的一个限制。它需要是 keyword.

类型

不幸的是,类型 keyword 不能有分析器,但是,它可以有一个 normalizer 执行类似的功能,尽管有点受限。本质上的区别是你不能指定一个分词器,因为那样的话任何排序都没有多大意义(当你有多个分词时,你会使用哪个分词来排序?)

希望这对您有所帮助