elasticsearch_autocomplete 0.1.5 → 0.1.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +4 -1
- data/.travis.yml +9 -7
- data/lib/elasticsearch_autocomplete.rb +7 -0
- data/lib/elasticsearch_autocomplete/model_addition.rb +16 -7
- data/lib/elasticsearch_autocomplete/version.rb +1 -1
- data/spec/elasticsearch_autocomplete/search_filters_spec.rb +7 -2
- data/spec/spec_helper.rb +4 -2
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4f9206e0ce061bd387b72955314aef688bf605d1
|
4
|
+
data.tar.gz: ee11adab330424718638a670f6b3ce13d0525750
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a56d6e952ca07c36fc8d25f2ed7684061e7bb2345d694140937e8f3f5b728771973f153391e62145aec810020621766e0f1b2c5d860d00f3f823ebf0277d7e93
|
7
|
+
data.tar.gz: cf73bef59eabdd792c1c27d8b6dccc85ec1f3da6e38b5b0405e4ac285785b084947339e07cfa86a1e942a80949a0a350611c67921b1ec128c24a99eabea0c1a8
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
@@ -1,12 +1,14 @@
|
|
1
|
-
|
1
|
+
sudo: false
|
2
2
|
|
3
|
-
|
4
|
-
- elasticsearch
|
3
|
+
language: ruby
|
5
4
|
|
6
|
-
|
7
|
-
-
|
5
|
+
before_install:
|
6
|
+
- curl -s https://download.elasticsearch.org/elasticsearch/release/org/elasticsearch/distribution/tar/elasticsearch/2.0.0/elasticsearch-2.0.0.tar.gz > elasticsearch.tar.gz
|
7
|
+
- tar -xzf elasticsearch.tar.gz
|
8
|
+
- cd elasticsearch*/ && bin/elasticsearch &
|
9
|
+
- sleep 10 && curl http://localhost:9200
|
8
10
|
|
9
11
|
rvm:
|
10
12
|
- 1.9.3
|
11
|
-
- 2.
|
12
|
-
|
13
|
+
- 2.3.0
|
14
|
+
|
@@ -9,6 +9,13 @@ module ElasticsearchAutocomplete
|
|
9
9
|
mattr_accessor :enable_indexing
|
10
10
|
self.enable_indexing = true
|
11
11
|
|
12
|
+
mattr_accessor :elasticsearch_version
|
13
|
+
self.elasticsearch_version = '2.x'
|
14
|
+
|
15
|
+
def self.es2?
|
16
|
+
elasticsearch_version && elasticsearch_version.start_with?('2')
|
17
|
+
end
|
18
|
+
|
12
19
|
def self.default_index_prefix
|
13
20
|
Object.const_defined?(:Rails) ? ::Rails.application.class.name.split('::').first.downcase : nil
|
14
21
|
end
|
@@ -11,7 +11,7 @@ module ElasticsearchAutocomplete
|
|
11
11
|
|
12
12
|
after_save :ac_update_index
|
13
13
|
after_destroy :ac_update_index
|
14
|
-
|
14
|
+
|
15
15
|
index_prefix ElasticsearchAutocomplete.defaults[:index_prefix] if ElasticsearchAutocomplete.defaults[:index_prefix]
|
16
16
|
end
|
17
17
|
|
@@ -28,7 +28,7 @@ module ElasticsearchAutocomplete
|
|
28
28
|
self.ac_mode_config = ElasticsearchAutocomplete::MODES[ac_opts[:mode]]
|
29
29
|
|
30
30
|
self.ac_search_attrs = ac_opts[:search_fields] || (ac_opts[:localized] ? I18n.available_locales.map { |l| "#{ac_attr}_#{l}" } : [ac_attr])
|
31
|
-
self.ac_search_fields = ac_search_attrs.map { |attr| ac_mode_config.values.map { |prefix| "#{prefix}_#{attr}" } }.flatten
|
31
|
+
self.ac_search_fields = ac_search_attrs.map { |attr| ac_mode_config.values.map { |prefix| "#{attr}.#{prefix}_#{attr}" } }.flatten
|
32
32
|
|
33
33
|
define_ac_index(ac_opts[:mode]) unless options[:skip_settings]
|
34
34
|
end
|
@@ -57,6 +57,14 @@ module ElasticsearchAutocomplete
|
|
57
57
|
end
|
58
58
|
|
59
59
|
filter(:and, filters: options[:with].map { |k, v| {terms: {k => ElasticsearchAutocomplete.val_to_terms(v)}} }) if options[:with].present?
|
60
|
+
|
61
|
+
if options[:or].present?
|
62
|
+
or_filters = Array(options[:or]).map do |filter|
|
63
|
+
{and: filter.map {|k, v| {terms: {k => ElasticsearchAutocomplete.val_to_terms(v)}}}}
|
64
|
+
end
|
65
|
+
filter(:or, or_filters)
|
66
|
+
end
|
67
|
+
|
60
68
|
if options[:without].present?
|
61
69
|
options[:without].each do |k, v|
|
62
70
|
filter(:not, {terms: {k => ElasticsearchAutocomplete.val_to_terms(v, true)}})
|
@@ -78,23 +86,24 @@ module ElasticsearchAutocomplete
|
|
78
86
|
|
79
87
|
def ac_index_config(attr, mode=:word)
|
80
88
|
defaults = {type: 'string', search_analyzer: 'ac_search', include_in_all: false}
|
89
|
+
index_analyzer_key = ElasticsearchAutocomplete.es2? ? :analyzer : :index_analyzer
|
81
90
|
fields = case mode
|
82
91
|
when :word
|
83
92
|
{
|
84
93
|
attr => {type: 'string'},
|
85
|
-
"#{ac_mode_config[:base]}_#{attr}" => defaults.merge(
|
86
|
-
"#{ac_mode_config[:word]}_#{attr}" => defaults.merge(
|
94
|
+
"#{ac_mode_config[:base]}_#{attr}" => defaults.merge(index_analyzer_key => 'ac_edge_ngram'),
|
95
|
+
"#{ac_mode_config[:word]}_#{attr}" => defaults.merge(index_analyzer_key => 'ac_edge_ngram_word')
|
87
96
|
}
|
88
97
|
when :phrase
|
89
98
|
{
|
90
99
|
attr => {type: 'string'},
|
91
|
-
"#{ac_mode_config[:base]}_#{attr}" => defaults.merge(
|
100
|
+
"#{ac_mode_config[:base]}_#{attr}" => defaults.merge(index_analyzer_key => 'ac_edge_ngram')
|
92
101
|
}
|
93
102
|
when :full
|
94
103
|
{
|
95
104
|
attr => {type: 'string'},
|
96
|
-
"#{ac_mode_config[:base]}_#{attr}" => defaults.merge(
|
97
|
-
"#{ac_mode_config[:full]}_#{attr}" => defaults.merge(
|
105
|
+
"#{ac_mode_config[:base]}_#{attr}" => defaults.merge(index_analyzer_key => 'ac_edge_ngram', boost: 3),
|
106
|
+
"#{ac_mode_config[:full]}_#{attr}" => defaults.merge(index_analyzer_key => 'ac_edge_ngram_full')
|
98
107
|
}
|
99
108
|
end
|
100
109
|
{type: 'multi_field', fields: fields}
|
@@ -35,6 +35,11 @@ describe 'search filters' do
|
|
35
35
|
@model.setup_index
|
36
36
|
end
|
37
37
|
|
38
|
+
it 'filter suggestions with or terms' do
|
39
|
+
expect(@model.ac_search('Laura', or: [{interest_ids: [1]}, {interest_ids: '4'}]).map(&:full_name)).to\
|
40
|
+
match_array ['Laura Nelson', 'Laura Larson']
|
41
|
+
end
|
42
|
+
|
38
43
|
it 'filter suggestions with terms' do
|
39
44
|
expect(@model.ac_search('Laura', with: {interest_ids: [2]}).map(&:full_name)).to match_array ['Laura Nelson', 'Laura Flores']
|
40
45
|
end
|
@@ -62,8 +67,8 @@ describe 'search filters' do
|
|
62
67
|
end
|
63
68
|
|
64
69
|
it 'paginate suggestions' do
|
65
|
-
res = @model.ac_search('Laura', per_page: 1, page: 2).to_a
|
70
|
+
res = @model.ac_search('Laura', order: :id, per_page: 1, page: 2).to_a
|
66
71
|
expect(res.length).to eq 1
|
67
72
|
expect(res.first.full_name).to eq 'Laura Flores'
|
68
73
|
end
|
69
|
-
end
|
74
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -4,13 +4,15 @@ require 'active_support/core_ext'
|
|
4
4
|
require 'elasticsearch_autocomplete'
|
5
5
|
|
6
6
|
Tire.configure do
|
7
|
-
#logger 'tmp/elasticsearch.log' # Commented out logger line here so that it doesn't break specs when tmp directory doesn't exist.
|
8
|
-
url
|
7
|
+
# logger 'tmp/elasticsearch.log' # Commented out logger line here so that it doesn't break specs when tmp directory doesn't exist.
|
8
|
+
url "http://localhost:#{ENV['ES_PORT'] || 9200}"
|
9
9
|
pretty 1
|
10
10
|
end
|
11
11
|
|
12
12
|
I18n.available_locales = [:en, :ru]
|
13
13
|
|
14
|
+
# ElasticsearchAutocomplete.elasticsearch_version = '1.x'
|
15
|
+
|
14
16
|
class ActiveModelBase
|
15
17
|
include ActiveModel::AttributeMethods
|
16
18
|
include ActiveModel::Serialization
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: elasticsearch_autocomplete
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alex Leschenko
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-01-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: tire
|
@@ -126,7 +126,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
126
126
|
version: '0'
|
127
127
|
requirements: []
|
128
128
|
rubyforge_project:
|
129
|
-
rubygems_version: 2.
|
129
|
+
rubygems_version: 2.5.1
|
130
130
|
signing_key:
|
131
131
|
specification_version: 4
|
132
132
|
summary: Elasticsearch autocomplete for models
|