From 80baa449bf5c114322e4dbb8726f4683a1075acf Mon Sep 17 00:00:00 2001 From: Luciano Prestes Cavalcanti Date: Tue, 19 Apr 2016 14:46:22 +0000 Subject: [PATCH] Index models for elasticsearch --- plugins/elasticsearch/lib/elasticsearch_plugin.rb | 32 ++++++++++++++++++++++++++++++++ plugins/elasticsearch/lib/ext/community.rb | 46 ---------------------------------------------- plugins/elasticsearch/test/unit/index_models_test.rb | 21 +++++++++++++++++++++ 3 files changed, 53 insertions(+), 46 deletions(-) delete mode 100644 plugins/elasticsearch/lib/ext/community.rb create mode 100644 plugins/elasticsearch/test/unit/index_models_test.rb diff --git a/plugins/elasticsearch/lib/elasticsearch_plugin.rb b/plugins/elasticsearch/lib/elasticsearch_plugin.rb index 8864133..a8c138b 100644 --- a/plugins/elasticsearch/lib/elasticsearch_plugin.rb +++ b/plugins/elasticsearch/lib/elasticsearch_plugin.rb @@ -10,4 +10,36 @@ class ElasticsearchPlugin < Noosfero::Plugin _("A plugin that does this and that.") end + Noosfero::Application.class_eval do + config.after_initialize do + models = ActiveRecord::Base.descendants.select do |model| + model.const_defined?("SEARCHABLE_FIELDS") + end + + models.each do |model| + model.class_eval do + include Elasticsearch::Model + include Elasticsearch::Model::Callbacks + + settings index: { number_of_shards: 1 } do + mappings dynamic: 'false' do + model::SEARCHABLE_FIELDS.each do |field, value| + indexes field + end + end + model.__elasticsearch__.client.indices.delete \ + index: model.index_name rescue nil + model.__elasticsearch__.client.indices.create \ + index: model.index_name, + body: { + settings: model.settings.to_hash, + mappings: model.mappings.to_hash + } + + model.import + end + end + end + end + end end diff --git a/plugins/elasticsearch/lib/ext/community.rb b/plugins/elasticsearch/lib/ext/community.rb deleted file mode 100644 index f921f0b..0000000 --- a/plugins/elasticsearch/lib/ext/community.rb +++ /dev/null @@ -1,46 +0,0 @@ -require_dependency 'community' - -require 'elasticsearch/model' - -Community.class_eval do - include Elasticsearch::Model - include Elasticsearch::Model::Callbacks - - def self.search(query) - __elasticsearch__.search( - { - query: { - multi_match: { - query: query, - fields: ['name', 'identifier'] - } - }, - highlight: { - pre_tags: [''], - post_tags: [''], - fields: { - name: {}, - identifier: {} - } - } - } - ) - end - - settings index: { number_of_shards: 1 } do - mappings dynamic: 'false' do - indexes :name, analyzer: 'english', index_options: 'offsets' - indexes :identifier, analyzer: 'english' - end - end -end - -Community.__elasticsearch__.client.indices.delete index: Community.index_name rescue nil - -# Create the new index with the new mapping -Community.__elasticsearch__.client.indices.create \ - index: Community.index_name, - body: { settings: Community.settings.to_hash, mappings: Community.mappings.to_hash } - -# Index all Community records from the DB to Elasticsearch -Community.import diff --git a/plugins/elasticsearch/test/unit/index_models_test.rb b/plugins/elasticsearch/test/unit/index_models_test.rb new file mode 100644 index 0000000..fb27f7e --- /dev/null +++ b/plugins/elasticsearch/test/unit/index_models_test.rb @@ -0,0 +1,21 @@ +require 'test_helper' + +class IndexModelsTest < ActiveSupport::TestCase + + should "check index models on elasticsearch" do + fields = [] + mappings = [] + + ActiveRecord::Base.descendants.each do |model| + if model.const_defined?("SEARCHABLE_FIELDS") + mappings << model.mappings.instance_values['mapping'].keys.sort + fields << model::SEARCHABLE_FIELDS.keys.sort + end + end + + mappings.count.times do |i| + assert_equal mappings[i], fields[i] + end + end + +end -- libgit2 0.21.2