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
执行类似的功能,尽管有点受限。本质上的区别是你不能指定一个分词器,因为那样的话任何排序都没有多大意义(当你有多个分词时,你会使用哪个分词来排序?)
希望这对您有所帮助
我对 .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
执行类似的功能,尽管有点受限。本质上的区别是你不能指定一个分词器,因为那样的话任何排序都没有多大意义(当你有多个分词时,你会使用哪个分词来排序?)
希望这对您有所帮助