为Rails模型创建Elasticsearch索引时如何解决“非法参数异常”?

时间:2019-06-08 06:03:01

标签: ruby-on-rails elasticsearch

我正在尝试将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

3 个答案:

答案 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":{}}}}