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 19 }
20 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 31 end
29 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 34 end
61 35  
62 36 def process_results
... ... @@ -69,10 +43,8 @@ module ElasticsearchHelper
69 43 end
70 44  
71 45 def search_from_all_models
72   - models = []
73 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 48 Elasticsearch::Model.search(query, models, size: default_per_page(params[:per_page])).page(params[:page]).records
77 49 end
78 50  
... ... @@ -90,4 +62,41 @@ module ElasticsearchHelper
90 62 per_page ||= 10
91 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 102 end
... ...
plugins/elasticsearch/lib/elasticsearch_indexed_model.rb
... ... @@ -9,7 +9,10 @@ module ElasticsearchIndexedModel
9 9 mappings dynamic: 'false' do
10 10 base.indexable_fields.each do |field, value|
11 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 16 print '.'
14 17 end
15 18 end
... ... @@ -29,7 +32,7 @@ module ElasticsearchIndexedModel
29 32  
30 33 module ClassMethods
31 34 def indexable_fields
32   - self::SEARCHABLE_FIELDS.update self.control_fields
  35 + self::SEARCHABLE_FIELDS.merge self.control_fields
33 36 end
34 37 end
35 38  
... ...