Commit 32950484d4dd549fd32d16667098517bb086d743
1 parent
52d63897
Exists in
elasticsearch_api
Index models for elasticsearch
Signed-off-by: Luciano Prestes Cavalcanti <lucianopcbr@gmail.com> Signed-off-by: Lucas Moura <lucas.moura128@gmail.com>
Showing
3 changed files
with
53 additions
and
46 deletions
Show diff stats
plugins/elasticsearch/lib/elasticsearch_plugin.rb
| ... | ... | @@ -10,4 +10,36 @@ class ElasticsearchPlugin < Noosfero::Plugin |
| 10 | 10 | _("A plugin that does this and that.") |
| 11 | 11 | end |
| 12 | 12 | |
| 13 | + Noosfero::Application.class_eval do | |
| 14 | + config.after_initialize do | |
| 15 | + models = ActiveRecord::Base.descendants.select do |model| | |
| 16 | + model.const_defined?("SEARCHABLE_FIELDS") | |
| 17 | + end | |
| 18 | + | |
| 19 | + models.each do |model| | |
| 20 | + model.class_eval do | |
| 21 | + include Elasticsearch::Model | |
| 22 | + include Elasticsearch::Model::Callbacks | |
| 23 | + | |
| 24 | + settings index: { number_of_shards: 1 } do | |
| 25 | + mappings dynamic: 'false' do | |
| 26 | + model::SEARCHABLE_FIELDS.each do |field, value| | |
| 27 | + indexes field | |
| 28 | + end | |
| 29 | + end | |
| 30 | + model.__elasticsearch__.client.indices.delete \ | |
| 31 | + index: model.index_name rescue nil | |
| 32 | + model.__elasticsearch__.client.indices.create \ | |
| 33 | + index: model.index_name, | |
| 34 | + body: { | |
| 35 | + settings: model.settings.to_hash, | |
| 36 | + mappings: model.mappings.to_hash | |
| 37 | + } | |
| 38 | + | |
| 39 | + model.import | |
| 40 | + end | |
| 41 | + end | |
| 42 | + end | |
| 43 | + end | |
| 44 | + end | |
| 13 | 45 | end | ... | ... |
plugins/elasticsearch/lib/ext/community.rb
| ... | ... | @@ -1,46 +0,0 @@ |
| 1 | -require_dependency 'community' | |
| 2 | - | |
| 3 | -require 'elasticsearch/model' | |
| 4 | - | |
| 5 | -Community.class_eval do | |
| 6 | - include Elasticsearch::Model | |
| 7 | - include Elasticsearch::Model::Callbacks | |
| 8 | - | |
| 9 | - def self.search(query) | |
| 10 | - __elasticsearch__.search( | |
| 11 | - { | |
| 12 | - query: { | |
| 13 | - multi_match: { | |
| 14 | - query: query, | |
| 15 | - fields: ['name', 'identifier'] | |
| 16 | - } | |
| 17 | - }, | |
| 18 | - highlight: { | |
| 19 | - pre_tags: ['<em>'], | |
| 20 | - post_tags: ['</em>'], | |
| 21 | - fields: { | |
| 22 | - name: {}, | |
| 23 | - identifier: {} | |
| 24 | - } | |
| 25 | - } | |
| 26 | - } | |
| 27 | - ) | |
| 28 | - end | |
| 29 | - | |
| 30 | - settings index: { number_of_shards: 1 } do | |
| 31 | - mappings dynamic: 'false' do | |
| 32 | - indexes :name, analyzer: 'english', index_options: 'offsets' | |
| 33 | - indexes :identifier, analyzer: 'english' | |
| 34 | - end | |
| 35 | - end | |
| 36 | -end | |
| 37 | - | |
| 38 | -Community.__elasticsearch__.client.indices.delete index: Community.index_name rescue nil | |
| 39 | - | |
| 40 | -# Create the new index with the new mapping | |
| 41 | -Community.__elasticsearch__.client.indices.create \ | |
| 42 | - index: Community.index_name, | |
| 43 | - body: { settings: Community.settings.to_hash, mappings: Community.mappings.to_hash } | |
| 44 | - | |
| 45 | -# Index all Community records from the DB to Elasticsearch | |
| 46 | -Community.import |
| ... | ... | @@ -0,0 +1,21 @@ |
| 1 | +require 'test_helper' | |
| 2 | + | |
| 3 | +class IndexModelsTest < ActiveSupport::TestCase | |
| 4 | + | |
| 5 | + should "check index models on elasticsearch" do | |
| 6 | + fields = [] | |
| 7 | + mappings = [] | |
| 8 | + | |
| 9 | + ActiveRecord::Base.descendants.each do |model| | |
| 10 | + if model.const_defined?("SEARCHABLE_FIELDS") | |
| 11 | + mappings << model.mappings.instance_values['mapping'].keys.sort | |
| 12 | + fields << model::SEARCHABLE_FIELDS.keys.sort | |
| 13 | + end | |
| 14 | + end | |
| 15 | + | |
| 16 | + mappings.count.times do |i| | |
| 17 | + assert_equal mappings[i], fields[i] | |
| 18 | + end | |
| 19 | + end | |
| 20 | + | |
| 21 | +end | ... | ... |