Heroku上的Rails 4应用程序获得Elasticsearch IndexMissingException
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Heroku上的Rails 4应用程序获得Elasticsearch IndexMissingException相关的知识,希望对你有一定的参考价值。
- 有一个Rails 4应用程序,想要使用ElasticSearch添加全文搜索。
- 该应用程序在本地使用工头运行正常,但在heroku上部署的版本中提交搜索查询时出现错误:“IndexMissingException”(请参阅下面的完整错误日志。)
- 我认为这个问题与我没有正确指向heroku上的ElasticSearch索引有关。我试过跟随heroku instructions,但说实话我并不完全理解“使用你的索引部分”,我认为这是问题的根源。
任何有关在Heroku上使用ElasticSearch正确设置Rails 4应用程序的建议都将不胜感激!
这里有一些细节,希望可以帮助调试这个。
Ruby / Rails版本
ruby 2.1.3p242 (2014-09-19 revision 47630) [x86_64-darwin14.0]
Rails 4.2.1
来自Heroku Logs
2015-04-12T20:52:36.506728+00:00 app[web.1]: Started GET "/posts?utf8=%E2%9C%93&q=better" for 98.14.231.17 at 2015-04-12 20:52:36 +0000
2015-04-12T20:52:36.553113+00:00 app[web.1]:
2015-04-12T20:52:36.553116+00:00 app[web.1]: ActionView::Template::Error ([404] {"error":"IndexMissingException[[posts] missing]","status":404}):
2015-04-12T20:52:36.553118+00:00 app[web.1]: 7: <% end %>
2015-04-12T20:52:36.553120+00:00 app[web.1]: 8:
2015-04-12T20:52:36.553131+00:00 app[web.1]:
2015-04-12T20:52:36.553121+00:00 app[web.1]: 9: <ul>
2015-04-12T20:52:36.553123+00:00 app[web.1]: 10: <% @posts.each do |post| %>
2015-04-12T20:52:36.550831+00:00 app[web.1]: Rendered posts/index.html.erb within layouts/application (27.2ms)
2015-04-12T20:52:36.553124+00:00 app[web.1]: 11: <li>
2015-04-12T20:52:36.553126+00:00 app[web.1]: 12: <%= post.content %>
2015-04-12T20:52:36.553129+00:00 app[web.1]: app/views/posts/index.html.erb:10:in `_app_views_posts_index_html_erb___4115668764297473519_69883416675900'
2015-04-12T20:52:36.553127+00:00 app[web.1]: 13: </li>
2015-04-12T20:52:36.553132+00:00 app[web.1]:
2015-04-12T20:52:36.549950+00:00 app[web.1]: Post Search (18.6ms) {index: "posts", type: "post", q: "better"}
2015-04-12T20:52:36.516050+00:00 app[web.1]: Parameters: {"utf8"=>"✓", "q"=>"better"}
2015-04-12T20:52:36.515947+00:00 app[web.1]: Processing by PostsController#index as HTML
2015-04-12T20:52:36.551104+00:00 app[web.1]: Completed 500 Internal Server Error in 35ms (ActiveRecord: 0.0ms | Elasticsearch: 18.6ms)
的Gemfile
source 'https://rubygems.org'
ruby '2.1.3'
gem 'rails', '4.2.1'
gem 'pg'
gem 'sass-rails', '~> 5.0'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.1.0'
gem 'jquery-rails'
gem 'turbolinks'
gem 'jbuilder', '~> 2.0'
gem 'sdoc', '~> 0.4.0', group: :doc
group :development, :test do
gem 'byebug'
gem 'web-console', '~> 2.0'
gem 'spring'
end
gem 'rails_12factor', group: :production
gem "figaro"
gem 'annotate', '~> 2.6.5', group: :development
gem 'pry-rails', group: :development
gem 'bootstrap-sass', '~> 3.3.4'
gem 'autoprefixer-rails'
gem 'font-awesome-sass'
gem 'ffaker'
gem 'react-rails', '~> 1.0.0.pre', github: 'reactjs/react-rails'
gem 'thin'
gem 'elasticsearch-model'
gem 'elasticsearch-rails'
gem 'bonsai-elasticsearch-rails'
模型
require 'elasticsearch/model'
class Post < ActiveRecord::Base
include Elasticsearch::Model
include Elasticsearch::Model::Callbacks
end
Post.import
调节器
class PostsController < ApplicationController
def index
if params[:q].nil?
@posts = []
else
@posts = Post.search(params[:q])
end
end
end
视图
<%= form_for posts_path, method: 'get' do |f| %>
<%= f.label "Search for" %>
<%= text_field_tag :q, params[:q] %>
<%= submit_tag "Go", name: nil %>
<% end %>
<ul>
<% @posts.each do |post| %>
<li>
<%= post.content %>
</li>
<% end %>
</ul>
Heroku Bonsai附加组件
我跟着instructions at Heroku for installing Bonsai
创建了一个索引
curl -X POST http://[[MY BONSAI URL]]
得到了:
{"ok":true,"acknowledged":true}
正如我所提到的,我认为问题与我没有正确使用/指向索引有关。任何意见,将不胜感激!
我和django有同样的问题。我认为解决方案是在创建索引后使用elasticsearch _mapping url手动更新映射。
例:
PUT /search/_mapping/person
{
"person": {
"properties": {
"person_id": {
"type": "string"
}
}
}
}
http://www.elastic.co/guide/en/elasticsearch/reference/1.4/indices-put-mapping.html
问题是我没有从Heroku上的模型中导入记录。这包括首先确保您需要elasticsearch rake任务,然后使用FORCE = true参数在Heroku上运行导入任务
- 见https://github.com/elastic/elasticsearch-rails/tree/master/elasticsearch-rails
- 向下滚动到Rake任务并按照说明操作。
- 在Heroku上导入记录时,请确保包含FORCE = true,例如 $ heroku run bundle exec rake environment elasticsearch:import:model CLASS ='Article'FORCE = true
我有一个类似的问题。对我来说,导入修复了错误。
bundle exec rake environment elasticsearch:import:all
我有一个类似的问题:
Searchkick::ImportError - IndexMissingException[[..._users_development] missing]:
searchkick (1.3.0) lib/searchkick.rb:111:in `perform_items'
searchkick (1.3.0) lib/searchkick/logging.rb:82:in `perform_items'
searchkick (1.3.0) lib/searchkick.rb:102:in `perform_bulk'
searchkick (1.3.0) lib/searchkick.rb:95:in `queue_items'
searchkick (1.3.0) lib/searchkick/index.rb:60:in `bulk_index'
就我而言,已经为现有项目安装和配置了elasticsearch,但我必须在工作时在我的计算机上安装。
我将说明所有步骤,如果您已经完成,则可以跳过一步。您也可以按照here的说明进行操作。
第1步:下载ElasticSearch
我正在使用elasticsearch 2.3.1所以我从这里下载了它:https://www.elastic.co/downloads/past-releases/elasticsearch-2-3-1
第2步:安装ElasticSearch Ruby Gem
我在Gemfile
中有以下内容:
gem 'elasticsearch-model'
gem 'elasticsearch-rails'
gem 'searchkick'
然后运行:bundle install
。
第3步:将模型中的数据导入Elasticsearch
创建此文件:lib/tasks/elasticsearch.rake
,如果您还没有。然后在其中粘贴此行:
require 'elasticsearch/rails/tasks/import'
现在,运行以下命令将模型中的数据导入ElasticSearch:
rake environment elasticsearch:import:all DIR=app/models
完成后,您应该收到如下消息:
[IMPORT] Loading models from: app/models
我希望这可以帮助面临相同或类似问题的人。快乐编码:)
以上是关于Heroku上的Rails 4应用程序获得Elasticsearch IndexMissingException的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Heroku 上的 Rails 4 中引用 javascript 中的图像
如何通过 https 和 heroku 上的 rails 服务云端资产?
Rails 6.1:Heroku 上的作业将使用 Async 而不是 Sidekiq
Ruby on Rails - Heroku上的Carrierwave错误