elasticsearch-dsl 0.1.4 → 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +4 -4
- data/Rakefile +4 -2
- data/lib/elasticsearch/dsl/search.rb +1 -1
- data/lib/elasticsearch/dsl/search/aggregation.rb +6 -0
- data/lib/elasticsearch/dsl/search/base_aggregation_component.rb +2 -3
- data/lib/elasticsearch/dsl/search/base_component.rb +5 -0
- data/lib/elasticsearch/dsl/search/queries/bool.rb +6 -6
- data/lib/elasticsearch/dsl/search/queries/exists.rb +44 -0
- data/lib/elasticsearch/dsl/search/queries/match.rb +8 -0
- data/lib/elasticsearch/dsl/search/queries/more_like_this.rb +11 -5
- data/lib/elasticsearch/dsl/search/queries/nested.rb +1 -0
- data/lib/elasticsearch/dsl/search/queries/query_string.rb +1 -0
- data/lib/elasticsearch/dsl/version.rb +1 -1
- data/test/integration/search_query_test.rb +16 -0
- data/test/test_helper.rb +1 -0
- data/test/unit/queries/bool_test.rb +37 -6
- data/test/unit/queries/exists_test.rb +36 -0
- data/test/unit/queries/nested_test.rb +3 -1
- data/test/unit/queries/query_string_test.rb +2 -1
- data/test/unit/search_base_component_test.rb +10 -0
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: caa549b0dcf60175f255e9e4274863dba56808dc
|
4
|
+
data.tar.gz: 7ec42e3ede3c15f0904870338bc108ef5e51d742
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 551986fb989ba8424a9baab7bf9ba435c4cad33d8746652ad1ab924fdb8ccd4bb33a08c1cb517c2edbfbe6a38a64f39829b45166e9ef73da1b8ecb237392d25d
|
7
|
+
data.tar.gz: 9c9d61b3135d4b8f2ed9757d8f383f3bd8ea106ff08d50d00833dbb07ad1e545113d5bad8d1d7466070537240583a6a0ae3b50fe1c1c031c65f0ffe7728e53c3
|
data/Gemfile
CHANGED
@@ -3,18 +3,18 @@ source 'https://rubygems.org'
|
|
3
3
|
# Specify your gem's dependencies in elasticsearch-dsl.gemspec
|
4
4
|
gemspec
|
5
5
|
|
6
|
-
if File.
|
6
|
+
if File.exist? File.expand_path("../../elasticsearch/elasticsearch.gemspec", __FILE__)
|
7
7
|
gem 'elasticsearch', :path => File.expand_path("../../elasticsearch", __FILE__), :require => false
|
8
8
|
end
|
9
9
|
|
10
|
-
if File.
|
10
|
+
if File.exist? File.expand_path("../../elasticsearch-transport", __FILE__)
|
11
11
|
gem 'elasticsearch-transport', :path => File.expand_path("../../elasticsearch-transport", __FILE__), :require => true
|
12
12
|
end
|
13
13
|
|
14
|
-
if File.
|
14
|
+
if File.exist? File.expand_path("../../elasticsearch-api", __FILE__)
|
15
15
|
gem 'elasticsearch-api', :path => File.expand_path("../../elasticsearch-api", __FILE__), :require => false
|
16
16
|
end
|
17
17
|
|
18
|
-
if File.
|
18
|
+
if File.exist? File.expand_path("../../elasticsearch-extensions", __FILE__)
|
19
19
|
gem 'elasticsearch-extensions', :path => File.expand_path("../../elasticsearch-extensions", __FILE__), :require => false
|
20
20
|
end
|
data/Rakefile
CHANGED
@@ -11,13 +11,15 @@ namespace :test do
|
|
11
11
|
Rake::TestTask.new(:unit) do |test|
|
12
12
|
test.libs << 'lib' << 'test'
|
13
13
|
test.test_files = FileList["test/unit/**/*_test.rb"]
|
14
|
-
|
15
|
-
|
14
|
+
test.verbose = false
|
15
|
+
test.warning = false
|
16
16
|
end
|
17
17
|
|
18
18
|
Rake::TestTask.new(:integration) do |test|
|
19
19
|
test.libs << 'lib' << 'test'
|
20
20
|
test.test_files = FileList["test/integration/**/*_test.rb"]
|
21
|
+
test.verbose = false
|
22
|
+
test.warning = false
|
21
23
|
end
|
22
24
|
|
23
25
|
desc "Run unit and integration tests"
|
@@ -6,6 +6,12 @@ module Elasticsearch
|
|
6
6
|
#
|
7
7
|
module Aggregations;end
|
8
8
|
|
9
|
+
class AggregationsCollection < Hash
|
10
|
+
def to_hash
|
11
|
+
@hash ||= Hash[map { |k,v| [k, v.to_hash] }]
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
9
15
|
# Wraps the `aggregations` part of a search definition
|
10
16
|
#
|
11
17
|
# @see http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations.html
|
@@ -33,7 +33,7 @@ module Elasticsearch
|
|
33
33
|
# @return [self]
|
34
34
|
#
|
35
35
|
def aggregation(*args, &block)
|
36
|
-
@aggregations ||=
|
36
|
+
@aggregations ||= AggregationsCollection.new
|
37
37
|
@aggregations.update args.first => Aggregation.new(*args, &block)
|
38
38
|
self
|
39
39
|
end
|
@@ -50,8 +50,7 @@ module Elasticsearch
|
|
50
50
|
@hash = { name => @args } unless @hash && @hash[name] && ! @hash[name].empty?
|
51
51
|
|
52
52
|
if @aggregations
|
53
|
-
@hash[:aggregations] =
|
54
|
-
@aggregations.map { |name, value| @hash[:aggregations][name] = value.to_hash }
|
53
|
+
@hash[:aggregations] = @aggregations.to_hash
|
55
54
|
end
|
56
55
|
@hash
|
57
56
|
end
|
@@ -43,6 +43,7 @@ module Elasticsearch
|
|
43
43
|
# # => {:mycustomquery=>{:foo=>{:custom=>"TEST"}}}
|
44
44
|
#
|
45
45
|
def option_method(name, block=nil)
|
46
|
+
option_methods << name
|
46
47
|
if block
|
47
48
|
self.__send__ :define_method, name, &block
|
48
49
|
else
|
@@ -102,6 +103,10 @@ module Elasticsearch
|
|
102
103
|
def name=(value)
|
103
104
|
@name = value.to_sym
|
104
105
|
end
|
106
|
+
|
107
|
+
def option_methods
|
108
|
+
@option_methods ||= []
|
109
|
+
end
|
105
110
|
end
|
106
111
|
|
107
112
|
module InstanceMethods
|
@@ -36,6 +36,9 @@ module Elasticsearch
|
|
36
36
|
class Bool
|
37
37
|
include BaseComponent
|
38
38
|
|
39
|
+
option_method :minimum_should_match
|
40
|
+
option_method :boost
|
41
|
+
|
39
42
|
def must(*args, &block)
|
40
43
|
@hash[name][:must] ||= []
|
41
44
|
value = Query.new(*args, &block).to_hash
|
@@ -58,7 +61,9 @@ module Elasticsearch
|
|
58
61
|
end
|
59
62
|
|
60
63
|
def filter(*args, &block)
|
61
|
-
@filter
|
64
|
+
@hash[name][:filter] ||= []
|
65
|
+
value = Filter.new(*args, &block).to_hash
|
66
|
+
@hash[name][:filter].push(value).flatten! unless @hash[name][:filter].include?(value)
|
62
67
|
self
|
63
68
|
end
|
64
69
|
|
@@ -71,11 +76,6 @@ module Elasticsearch
|
|
71
76
|
@hash[name] = @args unless @args.nil? || @args.empty?
|
72
77
|
end
|
73
78
|
|
74
|
-
if @filter
|
75
|
-
_filter = @filter.respond_to?(:to_hash) ? @filter.to_hash : @filter
|
76
|
-
@hash[name].update(filter: _filter)
|
77
|
-
end
|
78
|
-
|
79
79
|
@hash
|
80
80
|
end
|
81
81
|
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module Elasticsearch
|
2
|
+
module DSL
|
3
|
+
module Search
|
4
|
+
module Queries
|
5
|
+
|
6
|
+
# Returns documents that have at least one non-null value in the field.
|
7
|
+
#
|
8
|
+
# @example Find documents with non-empty "name" property
|
9
|
+
#
|
10
|
+
# search do
|
11
|
+
# query do
|
12
|
+
# exists do
|
13
|
+
# field 'name'
|
14
|
+
# end
|
15
|
+
# end
|
16
|
+
# end
|
17
|
+
#
|
18
|
+
# @note The "Exists" query can be used as a "Missing" query in a "Bool" query "Must Not" context.
|
19
|
+
#
|
20
|
+
# @example Find documents with an empty "name" property
|
21
|
+
#
|
22
|
+
# search do
|
23
|
+
# query do
|
24
|
+
# bool do
|
25
|
+
# must_not do
|
26
|
+
# exists do
|
27
|
+
# field 'name'
|
28
|
+
# end
|
29
|
+
# end
|
30
|
+
# end
|
31
|
+
# end
|
32
|
+
# end
|
33
|
+
#
|
34
|
+
# @see https://www.elastic.co/guide/en/elasticsearch/reference/5.1/query-dsl-exists-query.html
|
35
|
+
#
|
36
|
+
class Exists
|
37
|
+
include BaseComponent
|
38
|
+
|
39
|
+
option_method :field
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -24,9 +24,17 @@ module Elasticsearch
|
|
24
24
|
|
25
25
|
option_method :query
|
26
26
|
option_method :operator
|
27
|
+
option_method :minimum_should_match
|
27
28
|
option_method :type
|
28
29
|
option_method :boost
|
29
30
|
option_method :fuzziness
|
31
|
+
option_method :prefix_length
|
32
|
+
option_method :max_expansions
|
33
|
+
option_method :fuzzy_rewrite
|
34
|
+
option_method :analyzer
|
35
|
+
option_method :lenient
|
36
|
+
option_method :zero_terms_query
|
37
|
+
option_method :cutoff_frequency
|
30
38
|
end
|
31
39
|
|
32
40
|
end
|
@@ -10,7 +10,7 @@ module Elasticsearch
|
|
10
10
|
# search do
|
11
11
|
# query do
|
12
12
|
# more_like_this do
|
13
|
-
#
|
13
|
+
# like ['Eyjafjallajökull']
|
14
14
|
# fields [:title, :abstract, :content]
|
15
15
|
# end
|
16
16
|
# end
|
@@ -22,7 +22,7 @@ module Elasticsearch
|
|
22
22
|
# search do
|
23
23
|
# query do
|
24
24
|
# more_like_this do
|
25
|
-
#
|
25
|
+
# like [{_id: 1}, {_id: 2}, {_id: 3}]
|
26
26
|
# fields [:title, :abstract]
|
27
27
|
# end
|
28
28
|
# end
|
@@ -33,12 +33,18 @@ module Elasticsearch
|
|
33
33
|
class MoreLikeThis
|
34
34
|
include BaseComponent
|
35
35
|
|
36
|
-
|
36
|
+
# like/unlike is since 2.0.0
|
37
|
+
option_method :like
|
38
|
+
option_method :unlike
|
39
|
+
|
40
|
+
# before 2.0.0 the following 3 options were available
|
37
41
|
option_method :like_text
|
38
|
-
option_method :min_term_freq
|
39
|
-
option_method :max_query_terms
|
40
42
|
option_method :docs
|
41
43
|
option_method :ids
|
44
|
+
|
45
|
+
option_method :fields
|
46
|
+
option_method :min_term_freq
|
47
|
+
option_method :max_query_terms
|
42
48
|
option_method :include
|
43
49
|
option_method :exclude
|
44
50
|
option_method :percent_terms_to_match
|
@@ -47,6 +47,22 @@ module Elasticsearch
|
|
47
47
|
assert_equal 2, response['hits']['total']
|
48
48
|
assert_equal 'Test', response['hits']['hits'][0]['_source']['title']
|
49
49
|
end
|
50
|
+
|
51
|
+
should "find the document with a filter" do
|
52
|
+
skip "Not supported on this Elasticsearch version" unless @version > '2'
|
53
|
+
|
54
|
+
response = @client.search index: 'test', body: search {
|
55
|
+
query do
|
56
|
+
bool do
|
57
|
+
filter { terms tags: ['one'] }
|
58
|
+
filter { terms tags: ['two'] }
|
59
|
+
end
|
60
|
+
end
|
61
|
+
}.to_hash
|
62
|
+
|
63
|
+
assert_equal 1, response['hits']['total']
|
64
|
+
assert_equal 'Rest', response['hits']['hits'][0]['_source']['title']
|
65
|
+
end
|
50
66
|
end
|
51
67
|
|
52
68
|
end
|
data/test/test_helper.rb
CHANGED
@@ -27,17 +27,38 @@ module Elasticsearch
|
|
27
27
|
assert_equal( { bool: {must: [ {match: { foo: 'bar' }} ] } }, subject.to_hash )
|
28
28
|
end
|
29
29
|
|
30
|
+
should "have option methods" do
|
31
|
+
subject = Bool.new do
|
32
|
+
should { term tag: 'wow' }
|
33
|
+
should { term tag: 'elasticsearch' }
|
34
|
+
|
35
|
+
minimum_should_match 1
|
36
|
+
boost 1.0
|
37
|
+
end
|
38
|
+
|
39
|
+
assert_equal( { bool:
|
40
|
+
{
|
41
|
+
minimum_should_match: 1,
|
42
|
+
boost: 1.0,
|
43
|
+
should: [ {term: { tag: 'wow' }}, {term: { tag: 'elasticsearch' }} ]
|
44
|
+
}
|
45
|
+
},
|
46
|
+
subject.to_hash )
|
47
|
+
end
|
48
|
+
|
30
49
|
should "take a block with multiple methods" do
|
31
50
|
subject = Bool.new do
|
32
51
|
must { match foo: 'bar' }
|
33
52
|
must_not { match moo: 'bam' }
|
34
53
|
should { match xoo: 'bax' }
|
54
|
+
filter { term zoo: 'baz'}
|
35
55
|
end
|
36
56
|
|
37
57
|
assert_equal( { bool:
|
38
58
|
{ must: [ {match: { foo: 'bar' }} ],
|
39
59
|
must_not: [ {match: { moo: 'bam' }} ],
|
40
|
-
should: [ {match: { xoo: 'bax' }} ]
|
60
|
+
should: [ {match: { xoo: 'bax' }} ],
|
61
|
+
filter: [ {term: { zoo: 'baz' }}]
|
41
62
|
}
|
42
63
|
},
|
43
64
|
subject.to_hash )
|
@@ -92,13 +113,23 @@ module Elasticsearch
|
|
92
113
|
subject.to_hash )
|
93
114
|
end
|
94
115
|
|
95
|
-
should "
|
116
|
+
should "combine chained filters" do
|
96
117
|
subject = Bool.new
|
97
|
-
subject.
|
98
|
-
|
99
|
-
|
118
|
+
subject.
|
119
|
+
filter {
|
120
|
+
term foo: "bar"
|
121
|
+
}
|
122
|
+
subject.filter {
|
123
|
+
term zoo: "baz"
|
124
|
+
}
|
100
125
|
|
101
|
-
assert_equal( { bool:
|
126
|
+
assert_equal( { bool:
|
127
|
+
{ filter: [
|
128
|
+
{ term: { foo: "bar"}},
|
129
|
+
{ term: { zoo: "baz"}}
|
130
|
+
] }
|
131
|
+
},
|
132
|
+
subject.to_hash)
|
102
133
|
end
|
103
134
|
|
104
135
|
should "be chainable" do
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Elasticsearch
|
4
|
+
module Test
|
5
|
+
module Queries
|
6
|
+
class ExistsTest < ::Test::Unit::TestCase
|
7
|
+
include Elasticsearch::DSL::Search::Queries
|
8
|
+
|
9
|
+
context "Exists query" do
|
10
|
+
subject { Exists.new }
|
11
|
+
|
12
|
+
should "be converted to a Hash" do
|
13
|
+
assert_equal({ exists: {} }, subject.to_hash)
|
14
|
+
end
|
15
|
+
|
16
|
+
should "have option methods" do
|
17
|
+
subject = Exists.new
|
18
|
+
|
19
|
+
subject.field 'bar'
|
20
|
+
|
21
|
+
assert_equal %w[ field ],
|
22
|
+
subject.to_hash[:exists].keys.map(&:to_s).sort
|
23
|
+
assert_equal 'bar', subject.to_hash[:exists][:field]
|
24
|
+
end
|
25
|
+
|
26
|
+
should "take a block" do
|
27
|
+
subject = Exists.new do
|
28
|
+
field 'bar'
|
29
|
+
end
|
30
|
+
assert_equal({ exists: { field: 'bar' } }, subject.to_hash)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -19,10 +19,12 @@ module Elasticsearch
|
|
19
19
|
subject.path 'bar'
|
20
20
|
subject.score_mode 'bar'
|
21
21
|
subject.query 'bar'
|
22
|
+
subject.inner_hits({ size: 1 })
|
22
23
|
|
23
|
-
assert_equal %w[ path query score_mode ],
|
24
|
+
assert_equal %w[ inner_hits path query score_mode ],
|
24
25
|
subject.to_hash[:nested].keys.map(&:to_s).sort
|
25
26
|
assert_equal 'bar', subject.to_hash[:nested][:path]
|
27
|
+
assert_equal({ size: 1 }, subject.to_hash[:nested][:inner_hits])
|
26
28
|
end
|
27
29
|
|
28
30
|
should "take the query as a Hash" do
|
@@ -36,8 +36,9 @@ module Elasticsearch
|
|
36
36
|
subject.locale 'bar'
|
37
37
|
subject.use_dis_max 'bar'
|
38
38
|
subject.tie_breaker 'bar'
|
39
|
+
subject.time_zone 'bar'
|
39
40
|
|
40
|
-
assert_equal %w[ allow_leading_wildcard analyze_wildcard analyzer auto_generate_phrase_queries boost default_field default_operator enable_position_increments fields fuzziness fuzzy_max_expansions fuzzy_prefix_length lenient locale lowercase_expanded_terms minimum_should_match phrase_slop query tie_breaker use_dis_max ],
|
41
|
+
assert_equal %w[ allow_leading_wildcard analyze_wildcard analyzer auto_generate_phrase_queries boost default_field default_operator enable_position_increments fields fuzziness fuzzy_max_expansions fuzzy_prefix_length lenient locale lowercase_expanded_terms minimum_should_match phrase_slop query tie_breaker time_zone use_dis_max ],
|
41
42
|
subject.to_hash[:query_string][:foo].keys.map(&:to_s).sort
|
42
43
|
assert_equal 'bar', subject.to_hash[:query_string][:foo][:query]
|
43
44
|
end
|
@@ -64,6 +64,16 @@ module Elasticsearch
|
|
64
64
|
assert_equal({ dummy_component_with_option_method: { foo: { bar: 'BAM' } } }, subject.to_hash)
|
65
65
|
end
|
66
66
|
|
67
|
+
should "keep track of option methods" do
|
68
|
+
class DummyComponentWithCustomOptionMethod
|
69
|
+
include Elasticsearch::DSL::Search::BaseComponent
|
70
|
+
option_method :foo
|
71
|
+
end
|
72
|
+
|
73
|
+
subject = DummyComponentWithCustomOptionMethod
|
74
|
+
assert_includes subject.option_methods, :foo
|
75
|
+
end
|
76
|
+
|
67
77
|
should "have an option method without args" do
|
68
78
|
class DummyComponentWithOptionMethod
|
69
79
|
include Elasticsearch::DSL::Search::BaseComponent
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: elasticsearch-dsl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Karel Minarik
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-01-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -305,6 +305,7 @@ files:
|
|
305
305
|
- lib/elasticsearch/dsl/search/queries/common.rb
|
306
306
|
- lib/elasticsearch/dsl/search/queries/constant_score.rb
|
307
307
|
- lib/elasticsearch/dsl/search/queries/dis_max.rb
|
308
|
+
- lib/elasticsearch/dsl/search/queries/exists.rb
|
308
309
|
- lib/elasticsearch/dsl/search/queries/filtered.rb
|
309
310
|
- lib/elasticsearch/dsl/search/queries/function_score.rb
|
310
311
|
- lib/elasticsearch/dsl/search/queries/fuzzy.rb
|
@@ -428,6 +429,7 @@ files:
|
|
428
429
|
- test/unit/queries/common_test.rb
|
429
430
|
- test/unit/queries/constant_score_test.rb
|
430
431
|
- test/unit/queries/dis_max_test.rb
|
432
|
+
- test/unit/queries/exists_test.rb
|
431
433
|
- test/unit/queries/filtered_test.rb
|
432
434
|
- test/unit/queries/function_score_test.rb
|
433
435
|
- test/unit/queries/fuzzy_like_this_field_test.rb
|
@@ -584,6 +586,7 @@ test_files:
|
|
584
586
|
- test/unit/queries/common_test.rb
|
585
587
|
- test/unit/queries/constant_score_test.rb
|
586
588
|
- test/unit/queries/dis_max_test.rb
|
589
|
+
- test/unit/queries/exists_test.rb
|
587
590
|
- test/unit/queries/filtered_test.rb
|
588
591
|
- test/unit/queries/function_score_test.rb
|
589
592
|
- test/unit/queries/fuzzy_like_this_field_test.rb
|
@@ -627,4 +630,3 @@ test_files:
|
|
627
630
|
- test/unit/search_suggest_test.rb
|
628
631
|
- test/unit/search_test.rb
|
629
632
|
- test/unit/utils_test.rb
|
630
|
-
has_rdoc:
|