不知道如何对 elasticsearch-model 结果进行排序
Don't know how to sort elasticsearch-model results
我在我的 RoR 应用程序上使用 elasticsearch-model 来执行搜索并对结果进行排序。
我可以执行查询并得到未排序的结果,但是当我添加排序时,一切都中断了:
Elasticsearch::Transport::Transport::Errors::BadRequest: [400] {"error":{"root_cause":[{"type":"illegal_argument_exception","reason":"Fielddata is disabled on text fields by default. Set fielddata=true on [name] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead."}],"type":"search_phase_execution_exception","reason":"all shards failed","phase":"query","grouped":true,"failed_shards":[{"shard":0,"index":"profiles","node":"mad6gavaR3yTFabsF9m0rg","reason":{"type":"illegal_argument_exception","reason":"Fielddata is disabled on text fields by default. Set fielddata=true on [name] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead."}}]},"status":400}
from /Users/ngw/.rvm/gems/ruby-2.2.2@utelier/gems/elasticsearch-transport-5.0.4/lib/elasticsearch/transport/transport/base.rb:202:in `__raise_transport_error'
这显然是在告诉我,我配置索引的方式是错误的。
这是我正在编制索引的内容
def as_indexed_json(options={})
{
profile_type: profile_type,
name: name,
specialisation: specialisation,
description: description,
tags: tags,
minimum_order: minimum_order,
company_city: company_city,
company_address: company_address,
continent_id: country.try(:continent).try(:id),
country_id: country.try(:id),
industry: industry.try(:id)
}
end
查询可以使用这些字段中的任何一个,但不能使用 :name,它仅用于排序目的。
我的索引配置很简单:
settings index: { number_of_shards: 1 } do
mapping dynamic: false do
indexes :name, type: 'text'
indexes :description, analyzer: 'english'
end
end
我很确定我的索引设置有误,但在 elasticsearch-model 测试中搜索了一段时间后,我找不到任何相关内容。
有人可以帮我解决这个问题吗?提前致谢。
确定问题是名称的类型是文本。
在弹性搜索 5 中,默认情况下您无法对分析字段进行排序
可以在启用 field_data 或 doc_values 的字段上进行排序 -> elasticsearch 用于排序和聚合的数据结构。
- Doc_values 无法在分析的字符串字段上启用。
- 并且 field_data 默认情况下在分析的字符串字段上禁用。
你可以做两件事
- 要么更改名称到关键字的映射->这将是 non_analyzed,然后将在其上启用 doc_values。
- 或者您可以使用 "fielddata" 在字段 name 上启用 field_data: true
这是引用此内容的链接
https://www.elastic.co/guide/en/elasticsearch/reference/current/fielddata.html
https://www.elastic.co/guide/en/elasticsearch/reference/current/doc-values.html
您可以使用多字段:
你的 indexes
:
settings index: { number_of_shards: 1 } do
mapping dynamic: false do
indexes :name, type: 'text', fields: { keyword: { type: :keyword } }
indexes :description, analyzer: 'english'
end
end
在您的搜索中:
Model.search(
query: ...
sort: {
'name.keyword': { order: 'asc' }
}
)
或者直接将fielddata
设置为true
(警告:不推荐,因为它会占用更多资源):
settings index: { number_of_shards: 1 } do
mapping dynamic: false do
indexes :name, type: 'text', fielddata: true
indexes :description, analyzer: 'english'
end
end
看看这些链接:
我在我的 RoR 应用程序上使用 elasticsearch-model 来执行搜索并对结果进行排序。 我可以执行查询并得到未排序的结果,但是当我添加排序时,一切都中断了:
Elasticsearch::Transport::Transport::Errors::BadRequest: [400] {"error":{"root_cause":[{"type":"illegal_argument_exception","reason":"Fielddata is disabled on text fields by default. Set fielddata=true on [name] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead."}],"type":"search_phase_execution_exception","reason":"all shards failed","phase":"query","grouped":true,"failed_shards":[{"shard":0,"index":"profiles","node":"mad6gavaR3yTFabsF9m0rg","reason":{"type":"illegal_argument_exception","reason":"Fielddata is disabled on text fields by default. Set fielddata=true on [name] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead."}}]},"status":400}
from /Users/ngw/.rvm/gems/ruby-2.2.2@utelier/gems/elasticsearch-transport-5.0.4/lib/elasticsearch/transport/transport/base.rb:202:in `__raise_transport_error'
这显然是在告诉我,我配置索引的方式是错误的。 这是我正在编制索引的内容
def as_indexed_json(options={})
{
profile_type: profile_type,
name: name,
specialisation: specialisation,
description: description,
tags: tags,
minimum_order: minimum_order,
company_city: company_city,
company_address: company_address,
continent_id: country.try(:continent).try(:id),
country_id: country.try(:id),
industry: industry.try(:id)
}
end
查询可以使用这些字段中的任何一个,但不能使用 :name,它仅用于排序目的。 我的索引配置很简单:
settings index: { number_of_shards: 1 } do
mapping dynamic: false do
indexes :name, type: 'text'
indexes :description, analyzer: 'english'
end
end
我很确定我的索引设置有误,但在 elasticsearch-model 测试中搜索了一段时间后,我找不到任何相关内容。 有人可以帮我解决这个问题吗?提前致谢。
确定问题是名称的类型是文本。 在弹性搜索 5 中,默认情况下您无法对分析字段进行排序
可以在启用 field_data 或 doc_values 的字段上进行排序 -> elasticsearch 用于排序和聚合的数据结构。
- Doc_values 无法在分析的字符串字段上启用。
- 并且 field_data 默认情况下在分析的字符串字段上禁用。
你可以做两件事
- 要么更改名称到关键字的映射->这将是 non_analyzed,然后将在其上启用 doc_values。
- 或者您可以使用 "fielddata" 在字段 name 上启用 field_data: true 这是引用此内容的链接
https://www.elastic.co/guide/en/elasticsearch/reference/current/fielddata.html
https://www.elastic.co/guide/en/elasticsearch/reference/current/doc-values.html
您可以使用多字段:
你的 indexes
:
settings index: { number_of_shards: 1 } do
mapping dynamic: false do
indexes :name, type: 'text', fields: { keyword: { type: :keyword } }
indexes :description, analyzer: 'english'
end
end
在您的搜索中:
Model.search(
query: ...
sort: {
'name.keyword': { order: 'asc' }
}
)
或者直接将fielddata
设置为true
(警告:不推荐,因为它会占用更多资源):
settings index: { number_of_shards: 1 } do
mapping dynamic: false do
indexes :name, type: 'text', fielddata: true
indexes :description, analyzer: 'english'
end
end
看看这些链接: