ElasticSearch-Rails的安装步骤和遇到的困难等
我想要使用Rails来使用ElasticSearch。
我第一次使用ElasticSearch,所以我总结了使用过程中的步骤和遇到的问题。
引入步驟
安装
gem install elasticsearch-model
gem install elasticsearch-rails
将其应用于现有的模型中
class Line < ActiveRecord::Base
include Elasticsearch::Model
...
创建设置
config = {
host: "http://localhost:9200/",
}
if File.exists?("config/elasticsearch.yml")
config.merge!(YAML.load_file("config/elasticsearch.yml")[Rails.env].symbolize_keys)
end
Elasticsearch::Model.client = Elasticsearch::Client.new(config)
development: &default
host: 'http://localhost:9200/'
test:
<<: *default
staging:
<<: *default
production:
host: 'http://XXX/'
配置Rails上的Elasticsearch:
将Elasticsearch与Rails集成是一项简单而强大的任务。本文将指导您如何在Rails应用程序中配置和使用Elasticsearch。
在开始之前,请确保已安装和运行Elasticsearch服务器,并确保Rails应用程序可以连接到该服务器。
步骤1:安装Elasticsearch和相关插件
通过命令安装Elasticsearch:
“`
brew tap elastic/tap
brew install elastic/tap/elasticsearch-full
“`
安装插件:
“`
bin/elasticsearch-plugin install analysis-icu
bin/elasticsearch-plugin install analysis-smart-cn
“`
步骤2:配置Rails应用程序
在Gemfile中添加以下依赖项:
“`ruby
gem ‘elasticsearch-model’
gem ‘elasticsearch-rails’
“`
运行`bundle install`命令安装所需的gem。
在config/initializers目录中创建一个新的文件elasticsearch.rb,并添加以下内容:
“`ruby
Elasticsearch::Model.client = Elasticsearch::Client.new(url: ENV[‘ELASTICSEARCH_URL’])
“`
步骤3:为模型添加搜索功能
在您的模型中,通过包括`Elasticsearch::Model`模块并定义索引配置和搜索查询来启用与Elasticsearch的交互。例如,要在名为Product的模型中添加搜索功能,可以执行以下步骤:
“`ruby
class Product < ApplicationRecord
include Elasticsearch::Model
include Elasticsearch::Model::Callbacks
settings do
mappings dynamic: false do
indexes :name, type: ‘text’, analyzer: ‘english’
end
end
def self.search(query)
__elasticsearch__.search(
{
query: {
multi_match: {
query: query,
fields: [‘name’]
}
}
}
)
end
end
“`
步骤4:建立索引
通过运行以下命令在Elasticsearch服务器上创建索引:
“`
rails c
Product.__elasticsearch__.create_index! force: true
Product.import
“`
步骤5:执行搜索
在Controller或其他适当的位置,您可以通过调用模型的`search`方法执行搜索:
“`ruby
@products = Product.search(params[:query])
“`
这样,您就可以在Rails应用程序中配置和使用Elasticsearch了。通过调整索引配置和搜索查询,您可以根据您的需求进行更深入的自定义。
请注意,以上步骤是基本配置,您可以进一步探索Elasticsearch的其他功能和设置。
在Rails控制台上进行操作确认
[1] pry(main)> Line.__elasticsearch__.create_index!
=> {"acknowledged"=>true, "shards_acknowledged"=>true}
[2] pry(main)> Line.__elasticsearch__.import
Line Load (1.0ms) SELECT `lines`.* FROM `lines` ORDER BY `lines`.`id` ASC LIMIT 1000
=> 0
[3] pry(main)> Line.__elasticsearch__.search('秋田新幹線').results.first
=> #<Elasticsearch::Model::Response::Result:0x007fbdeccf3080
@result=
{"_index"=>"lines",
"_type"=>"line",
...
纠结的问题
在使用ElasticSearch作为主要数据存储的问题上的可行性与否。
最后我们未使用原始数据存储,但参考了以下网站。
-
- データベースとしてのElasticsearch
https://qiita.com/rjkuro/items/95f71ad522226dc381c8
Elasticsearch as a NoSQL Database
https://www.elastic.co/blog/found-elasticsearch-as-nosql
Elasticsearch 2.3 as primary data store?
https://discuss.elastic.co/t/elasticsearch-2-3-as-primary-data-store/50265
创建嵌套数据。
-
- Elasticsearch Nested Type vs Array Objects
https://medium.com/hello-elasticsearch/elasticsearch-nested-type-vs-array-objects-2ea7bac68ed8
module LineSearchable
extend ActiveSupport::Concern
included do
include Elasticsearch::Model
index_name "line_#{Rails.env}"
settings do
mappings dynamic: 'false' do
indexes :name, type: 'text'
indexes :stations, type: :nested do
indexes :id
indexes :name, type: 'text'
end
end
end
def as_indexed_json(option = {})
category_attrs = {
id: self.id,
name: self.name
}
category_attrs[:stations] = self.stations.map do |station|
{
id: station.id
name: station.name
}
end
category_attrs.as_json
end
end
end
查找嵌套数据
-
- 【基礎編】Elasticsearchの検索クエリを使いこなそう
https://developers.eure.jp/tech/elasticsearch_search_query/
[1] pry(main)> query = {:query=>
{:bool=>
{:must=>
[{"term"=>{"name"=>"JR中央線(快速)"}},
{"nested"=>{"path"=>"stations", "query"=>{"terms"=>{"stations.id"=>[1, 2, 3]}}}}]}}}
[2] pry(main)> Line.search(query).results.first
...
我想要在进行includes和where之后导入。
读取代码后,我们对选项进行了各种功能增强,以此进行相应的处理。
def self.elasticsearch_import
self.__elasticsearch__.import(query: -> { includes(:stations).where('XXX') })
end
请为我提供一个选项,将以下内容以中文本地化的方式进行改述:
参考链接:
https://github.com/elastic/elasticsearch-rails/blob/b6d485748c71a07d064ea2a46a6da82d64a04cd7/elasticsearch-model/lib/elasticsearch/model/adapters/active_record.rb#L96
我想要在相同的模型中动态更改索引和类型。
最終結果ではありませんが,optionsを使用してインデックスやタイプを動的に指定することで対応できると考えられます。
请将以下内容翻译成中文:
https://github.com/elastic/elasticsearch-rails/blob/master/elasticsearch-model/lib/elasticsearch/model/importing.rb#L102
The source code can be found at the provided link.
ElasticSearch和activerecord-import中的命名空间冲突。
-
- activerecord-importとelasticsearch-railsでメソッドが被る問題
https://blog.dakatsuka.jp/2015/11/18/activerecord-import.html
[1] pry(main)> Line.import
ArgumentError: Invalid arguments!
由于先前已经引入了activerecord-import,因此更改activerecord-import一侧的方法名是有风险的,因此在调用ElasticSearch函数时,我们通过__elastic_search__进行处理。
[1] pry(main) > Line.__elastic_search__.import
请参考
-
- elasticsearch-rails検証
https://qiita.com/chase0213/items/ca6acc5d6bfecbd72be5
elasticsearch-rails運用
https://qiita.com/chase0213/items/381b1eeacb849d93ecfd
Elasticsearchを使ったRailsサンプルアプリケーションの作成
http://morizyun.github.io/blog/elasticsearch-rails-tutorial/index.html