Commit 382bcf692dc8caa6c49789ae5fd99a5aa8e6407f

Authored by David Silva
Committed by Macartur Sousa
1 parent 5ec5f39c
Exists in elasticsearch_sort

Sort documents by name

plugins/elasticsearch/helpers/elasticsearch_helper.rb
@@ -19,44 +19,18 @@ module ElasticsearchHelper @@ -19,44 +19,18 @@ module ElasticsearchHelper
19 } 19 }
20 end 20 end
21 21
22 - def fields_from_model  
23 - klass::SEARCHABLE_FIELDS.map do |key, value|  
24 - if value[:weight]  
25 - "#{key}^#{value[:weight]}"  
26 - else  
27 - "#{key}" 22 + def fields_from_models klasses
  23 + fields = Set.new
  24 + klasses.each do |klass|
  25 + klass::SEARCHABLE_FIELDS.map do |key, value|
  26 + if value and value[:weight]
  27 + fields.add "#{key}^#{value[:weight]}"
  28 + else
  29 + fields.add "#{key}"
  30 + end
28 end 31 end
29 end 32 end
30 - end  
31 -  
32 - def get_query text, klass=nil  
33 - query = {}  
34 - unless text.blank?  
35 - text = text.downcase  
36 - query = {  
37 - query: {  
38 - match_all: {  
39 - }  
40 - },  
41 - filter: {  
42 - regexp: {  
43 - name: {  
44 - value: ".*" + text + ".*" }  
45 - }  
46 - },  
47 - suggest: {  
48 - autocomplete: {  
49 - text: text,  
50 - term: {  
51 - field: "name",  
52 - suggest_mode: "always"  
53 - }  
54 - }  
55 - }  
56 -  
57 - }  
58 - end  
59 - query 33 + fields.to_a
60 end 34 end
61 35
62 def process_results 36 def process_results
@@ -69,10 +43,8 @@ module ElasticsearchHelper @@ -69,10 +43,8 @@ module ElasticsearchHelper
69 end 43 end
70 44
71 def search_from_all_models 45 def search_from_all_models
72 - models = []  
73 query = get_query params[:query] 46 query = get_query params[:query]
74 -  
75 - ElasticsearchHelper::searchable_types.keys.each {| model | models.append( model.to_s.classify.constantize) if model != :all } 47 + models = searchable_models
76 Elasticsearch::Model.search(query, models, size: default_per_page(params[:per_page])).page(params[:page]).records 48 Elasticsearch::Model.search(query, models, size: default_per_page(params[:per_page])).page(params[:page]).records
77 end 49 end
78 50
@@ -90,4 +62,41 @@ module ElasticsearchHelper @@ -90,4 +62,41 @@ module ElasticsearchHelper
90 per_page ||= 10 62 per_page ||= 10
91 end 63 end
92 64
  65 + private
  66 +
  67 + def get_query text, klass=nil
  68 + fields = klass.nil? ? (fields_from_models searchable_models) : (fields_from_models [klass])
  69 + query = {}
  70 + unless text.blank?
  71 + text = text.downcase
  72 + query = {
  73 + query: {
  74 + multi_match: {
  75 + query: text,
  76 + type: "phrase",
  77 + fields: fields,
  78 + zero_terms_query: "none"
  79 + },
  80 + },
  81 + sort: [
  82 + {"name.raw" => {"order" => "asc"}}
  83 + ],
  84 + suggest: {
  85 + autocomplete: {
  86 + text: text,
  87 + term: {
  88 + field: "name",
  89 + suggest_mode: "always"
  90 + }
  91 + }
  92 + }
  93 + }
  94 + end
  95 + query
  96 + end
  97 +
  98 + def searchable_models
  99 + SEARCHABLE_TYPES.except(:all).keys.map { | model | model.to_s.classify.constantize }
  100 + end
  101 +
93 end 102 end
plugins/elasticsearch/lib/elasticsearch_indexed_model.rb
@@ -9,7 +9,10 @@ module ElasticsearchIndexedModel @@ -9,7 +9,10 @@ module ElasticsearchIndexedModel
9 mappings dynamic: 'false' do 9 mappings dynamic: 'false' do
10 base.indexable_fields.each do |field, value| 10 base.indexable_fields.each do |field, value|
11 value = {} if value.nil? 11 value = {} if value.nil?
12 - indexes field, type: value[:type].presence 12 + indexes field, type: value[:type].presence, fields: {"raw" =>
  13 + {"index" => "not_analyzed",
  14 + "type" => "String"
  15 + } }
13 print '.' 16 print '.'
14 end 17 end
15 end 18 end
@@ -29,7 +32,7 @@ module ElasticsearchIndexedModel @@ -29,7 +32,7 @@ module ElasticsearchIndexedModel
29 32
30 module ClassMethods 33 module ClassMethods
31 def indexable_fields 34 def indexable_fields
32 - self::SEARCHABLE_FIELDS.update self.control_fields 35 + self::SEARCHABLE_FIELDS.merge self.control_fields
33 end 36 end
34 end 37 end
35 38