我正在尝试将Elasticsearch集成到我的Rails应用程序中。当我尝试对模型进行导入时,问题就来了。 视频。__elasticsearch __。import。
因此,在Rails控制台中,我运行了 Video .__ elasticsearch __。import 。我收到此错误: myflix_development不存在要导入到的文件。使用create_index!或:force选项来创建它。
然后我运行了 Video .__ elasticsearch __。create_index!和 Video .__ elasticsearch __。create_index!(force:true),它们都返回了相同的非法参数异常错误:
PUT http://localhost:9200/myflix_development [status:400, request:0.027s, query:N/A]
2019-06-08 11:18:29 +0800: > {"settings":{},"mappings":{"_doc":{"properties":{}}}}
2019-06-08 11:18:29 +0800: < {"error":{"root_cause":[{"type":"illegal_argument_exception","reason":"The mapping definition cannot be nested under a type [_doc] unless include_type_name is set to true."}],"type":"illegal_argument_exception","reason":"The mapping definition cannot be nested under a type [_doc] unless include_type_name is set to true."},"status":400}
我了解到我在尝试进行导入时应该创建一个Elasticsearch索引,但我遇到了一个令我感到困惑的非法论点异常
这是我要做的设置:
1)在我的gemfile中包含了这些宝石:
gem 'elasticsearch-model'
gem 'elasticsearch-rails'
2)包含一个初始化程序:app / config / initializers / elasticsearch.rb
Elasticsearch::Model.client =
if Rails.env.staging? || Rails.env.production?
Elasticsearch::Client.new url: ENV['SEARCHBOX_URL']
elsif Rails.env.development?
Elasticsearch::Client.new log: true
else
Elasticsearch::Client.new
end
3)在我的视频模型中包含了弹性搜索
class Video < ActiveRecord::Base
include Elasticsearch::Model
index_name ["myflix", Rails.env].join("_")
...
end
4)Gemfile.lock
elasticsearch (7.1.0)
elasticsearch-api (= 7.1.0)
elasticsearch-transport (= 7.1.0)
elasticsearch-api (7.1.0)
multi_json
elasticsearch-model (6.0.0)
activesupport (> 3)
elasticsearch (> 1)
hashie
elasticsearch-rails (6.0.0)
elasticsearch-transport (7.1.0)
faraday
multi_json
任何帮助将不胜感激!
修改 1)尝试在模型中进行手动映射
class Video < ActiveRecord::Base
include Elasticsearch::Model
settings index: { number_of_shards: 1 } do
mappings dynamic: 'false' do
indexes :title, type: 'text'
indexes :description, type: 'text'
end
end
...
end
答案 0 :(得分:0)
从您遇到的错误中,我认为您正在使用Elasticsearch7。在您的索引查询中指定了类型imageView.setColorFilter(Color.parseColor("#ecf3f9"), PorterDuff.Mode.OVERLAY);
,但是类型是deprecated since es7。
您可以尝试更新您的Elasticsearch库以匹配es7或错误消息中的建议,可以在映射中使用参数_doc
。
答案 1 :(得分:0)
您可以通过设置elasticsearch-model
来明确定义document_type
传递给Elasticsearch的文档类型。例如:
class Video < ActiveRecord::Base
include Elasticsearch::Model
index_name ["myflix", Rails.env].join("_")
document_type "video"
...
end
您使用的名称是任意的。只要不是_doc
,就不应在v7及更高版本上遇到此错误。
答案 2 :(得分:0)
由于ElasticSearch引擎无法分析保留关键字,因此发生“非法参数异常”。 属性被认为是映射部分内的根字段。请通过以下方式更改请求,方法是排除“ _doc”关键字:
PUT {INDEX_NAME} {"settings":{},"mappings":{"properties":{}}}}