Как исправить «недопустимое исключение аргумента» при создании индекса Elasticsearch для модели Rails? - PullRequest
1 голос
/ 08 июня 2019

Я пытаюсь интегрировать Elasticsearch в мое приложение rails. Проблема возникает, когда я пытаюсь выполнить импорт моей модели. Видео .__ elasticsearch __. Импорт.

Итак, в консоли rails я запустил Video .__asticsearch __. Import . Я получаю эту ошибку: myflix_development не существует для импорта. Используйте create_index! или параметр: force для его создания.

Затем я запустил Видео .__ эластичный поиск __. Create_index! и Видео .__ эластичный поиск __. 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}

Я понимаю, что я должен создать индекс эластичного поиска, когда я пытаюсь выполнить импорт, но я получаю это недопустимое исключение аргумента, о котором я озадачен

Вот что я сделал для настройки:

1) Включены драгоценные камни в мой gemfile:

gem 'elasticsearch-model'
gem 'elasticsearch-rails'

2) Включен инициализатор: app / config / initializers /asticsearch.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

Ответы [ 2 ]

0 голосов
/ 19 июля 2019

Вы можете явно определить тип документа, который elasticsearch-model передает Elasticsearch, установив document_type.Например:

class Video < ActiveRecord::Base
  include Elasticsearch::Model
  index_name ["myflix", Rails.env].join("_")
  document_type "video"
  ...
end

Какое имя вы используете, является произвольным.Пока это не _doc, вы не должны сталкиваться с этой ошибкой на v7 и выше.

0 голосов
/ 08 июня 2019

Исходя из вашей ошибки, я думаю, что вы используете эластичный поиск 7. Тип _doc указан в вашем запросе индекса, но типы устарели, поскольку es7 .

Вы можете попытаться обновить библиотекуasticsearch, чтобы она соответствовала es7, или, как указано в сообщении об ошибке, вы можете использовать параметр include_type_name в отображении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...