一尘不染

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

elasticsearch

我的.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’,’默认情况下,文本字段上的字段数据是禁用的。在[title]上设置fielddata
= true以便通过反转索引来将字段数据加载到内存中。请注意,这可以使用大量的内存。”)

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


阅读 404

收藏
2020-06-22

共1个答案

一尘不染

您无法在text字段上排序,这是elasticsearch的限制。它必须是一种类型keyword

不幸的是,类型keyword不能具有分析器,但是,它可以具有normalizer执行类似的功能,尽管功能有所限制。本质上的区别在于,您无法指定令牌生成器,因为那样排序就没有多大意义(当有多个令牌时,您将使用哪个令牌进行排序?)

希望这可以帮助

2020-06-22