ruby-on-rails - 如何使用 Ruby on Rails 将 ElasticSearch 从 6.8 升级到 7.X
问题描述
我有一个使用ElasticSearch
服务器的 Rails 应用程序,它们都在各自的 Docker 映像中。
我想升级我的 ElasticSearch 服务器。实际上我正在跑步image: docker.elastic.co/elasticsearch/elasticsearch:6.8.1
,我想将其更新为7.X
使用第 7 版时,我在重建索引时遇到此错误:
{
"error": {
"root_cause": [
{
"type": "mapper_parsing_exception",
"reason": "Root mapping definition has unsupported parameters: [listing : {dynamic=true, properties={uid={analyzer=id_analyzer, type=text}, bee_id={analyzer=id_analyzer, type=text}, address={analyzer=address_analyzer, type=text}, location={type=geo_point}}}]"
}
],
"type": "mapper_parsing_exception",
"reason": "Failed to parse mapping [_doc]: Root mapping definition has unsupported parameters: [listing : {dynamic=true, properties={uid={analyzer=id_analyzer, type=text}, bee_id={analyzer=id_analyzer, type=text}, address={analyzer=address_analyzer, type=text}, location={type=geo_point}}}]",
"caused_by": {
"type": "mapper_parsing_exception",
"reason": "Root mapping definition has unsupported parameters: [listing : {dynamic=true, properties={uid={analyzer=id_analyzer, type=text}, bee_id={analyzer=id_analyzer, type=text}, address={analyzer=address_analyzer, type=text}, location={type=geo_point}}}]"
}
},
"status": 400
}
我知道错误是由重大更改引起的,但我不知道如何修复它。
我正在使用gem elasticsearch-model
:
我的定义如下所示:
include Elasticsearch::Model
after_destroy { |record| ElasticIndexer.new(:delete, record.class.name, record.id) }
after_save { ElasticIndexer.new(:index, self.class.name, self.id)}
index_name "#{Rails.application.class.parent_name.underscore}_#{Rails.env} mydoc"
document_type "mydoc"
def as_indexed_json(options={})
[....]
end
settings index: { number_of_shards:5, number_of_replicas:0 } do
settings :analysis => {
char_filter: {
dash_remover: {
type: "mapping",
mappings: ["-=>"]
}
},
filter: {
english_stemmer: {
type: "stemmer",
language: "english"
}
},
tokenizer: {
id_tokenizer: {
type: "ngram",
min_gram: 3,
max_gram: 3,
token_chars: ["letter", "digit"]
},
address_tokenizer: {
type: "edgeNGram",
min_gram: 3,
max_gram: 3,
token_chars: ["letter", "digit"]
}
},
analyzer: {
description_analyzer: {
type: 'custom',
tokenizer: 'standard',
filter: ['asciifolding', 'lowercase']
},
id_analyzer: {
tokenizer: "id_tokenizer",
char_filter: ["dash_remover"],
filter: ['asciifolding', 'lowercase']
},
english_description_analyzer: {
tokenizer: "whitespace",
char_filter: ["html_strip"],
filter: ['asciifolding', 'lowercase', "english_stemmer"]
},
address_analyzer: {
tokenizer: "address_tokenizer",
filter: ['asciifolding', 'lowercase']
},
}
}
mappings dynamic: true do
indexes :location, :type => 'geo_point'
indexes :uid, :analyzer => 'id_analyzer'
indexes :bee_id, :analyzer => 'id_analyzer'
indexes :address, :analyzer => 'address_analyzer'
end
end
我应该应用哪些更改?
解决方案
最后我转向别的事情。过了好久,是时候回过头来了。
读了很多之后,我在看我的代码时遇到了这行微妙的代码
我评论了它:
document_type "mydoc"
我试一试。
当控制台中没有出现错误时,我感到很惊讶!有用。(好故事)
推荐阅读
- python - 带有预测训练的 ImageAI 对象检测
- angular - 在前一个操作通过 NgRx 成功后调度一个操作
- python - 通过广播简化这个三重循环
- sql - 在创建依赖视图时授予问题
- c++ - 在 qt QFileDialog setsuffix 在 linux 中不起作用,如何解决?
- asp.net - IIS 重写 - 匹配 URL 覆盖
- bash - 为什么将参数从管道传递给函数时,结果会有所不同?
- mysql - 如何通过 R 代码设置 sql 分隔符?
- jenkins - Docker 映像无法在 Jenkins Kubernetes 构建管道中保持活力
- python - 想使用循环按索引添加值