qiita-elasticsearch 0.14.3 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/README.md +3 -3
- data/lib/qiita/elasticsearch/matchable_token.rb +12 -2
- data/lib/qiita/elasticsearch/query_builder.rb +8 -5
- data/lib/qiita/elasticsearch/token.rb +6 -4
- data/lib/qiita/elasticsearch/tokenizer.rb +30 -32
- data/lib/qiita/elasticsearch/version.rb +1 -1
- data/qiita-elasticsearch.gemspec +1 -1
- metadata +7 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d55e5e12468e89a3e9b902858d5bb4c50e70604c
|
4
|
+
data.tar.gz: 432915c14a639a533c206592df5f1df5ba5dfc9f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bc55dc75f2de4fa3791796f11c43006975e6be87ed2c30d02dddd3eeb6ff63f3fd63419e231e3315c796df6488f516a63ad77f3ace5a908bdfae31c215b9d733
|
7
|
+
data.tar.gz: 5197b2b423fd8447914f3e4e14cd781eae6eb262bc719c1c736b7e70f6d6191ec294382567b52a4327f1e3cc5e7f591622f812721583056e70a9e2bcf8a5ac27
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -23,11 +23,11 @@ query_builder.build("a OR b")
|
|
23
23
|
#=> {"bool"=>{"should"=>[{"match"=>{"_all"=>"a"}}, {"match"=>{"_all"=>"b"}}]}}
|
24
24
|
```
|
25
25
|
|
26
|
-
###
|
27
|
-
Pass `:
|
26
|
+
### default_fields
|
27
|
+
Pass `:default_fields` option to tell default (matchable) field names (default: `_all`).
|
28
28
|
|
29
29
|
```rb
|
30
|
-
query_builder = Qiita::Elasticsearch::QueryBuilder.new(
|
30
|
+
query_builder = Qiita::Elasticsearch::QueryBuilder.new(default_fields: ["body", "title"])
|
31
31
|
|
32
32
|
query_builder.build("a")
|
33
33
|
#=> {"multi_match"=>{"fields"=>["body", "title"], "query"=>"a"}}
|
@@ -5,7 +5,7 @@ module Qiita
|
|
5
5
|
class MatchableToken < Token
|
6
6
|
RELATIVE_BEST_FIELDS_QUERY_WEIGHT = 0.5
|
7
7
|
|
8
|
-
attr_writer :
|
8
|
+
attr_writer :default_fields
|
9
9
|
|
10
10
|
# @return [Hash]
|
11
11
|
def to_hash
|
@@ -30,12 +30,22 @@ module Qiita
|
|
30
30
|
{
|
31
31
|
"multi_match" => {
|
32
32
|
"boost" => boost,
|
33
|
-
"fields" =>
|
33
|
+
"fields" => matchable_fields,
|
34
34
|
"query" => @term,
|
35
35
|
"type" => type,
|
36
36
|
},
|
37
37
|
}
|
38
38
|
end
|
39
|
+
|
40
|
+
def matchable_fields
|
41
|
+
if field_name
|
42
|
+
[field_name]
|
43
|
+
elsif @default_fields && !@default_fields.empty?
|
44
|
+
@default_fields
|
45
|
+
else
|
46
|
+
["_all"]
|
47
|
+
end
|
48
|
+
end
|
39
49
|
end
|
40
50
|
end
|
41
51
|
end
|
@@ -5,20 +5,22 @@ require "qiita/elasticsearch/query"
|
|
5
5
|
module Qiita
|
6
6
|
module Elasticsearch
|
7
7
|
class QueryBuilder
|
8
|
+
# @param [Array<String>, nil] all_fields
|
8
9
|
# @param [Array<String>, nil] date_fields
|
9
10
|
# @param [Array<String>, nil] downcased_fields
|
10
11
|
# @param [Array<String>, nil] filterable_fields
|
11
12
|
# @param [Array<String>, nil] hierarchal_fields
|
12
13
|
# @param [Array<String>, nil] int_fields
|
13
|
-
# @param [Array<String>, nil]
|
14
|
+
# @param [Array<String>, nil] default_fields
|
14
15
|
# @param [String, nil] time_zone
|
15
|
-
def initialize(date_fields: nil, downcased_fields: nil, hierarchal_fields: nil, filterable_fields: nil, int_fields: nil,
|
16
|
+
def initialize(all_fields: nil, date_fields: nil, downcased_fields: nil, hierarchal_fields: nil, filterable_fields: nil, int_fields: nil, default_fields: nil, time_zone: nil)
|
17
|
+
@all_fields = all_fields
|
16
18
|
@date_fields = date_fields
|
17
19
|
@downcased_fields = downcased_fields
|
18
20
|
@filterable_fields = filterable_fields
|
19
21
|
@hierarchal_fields = hierarchal_fields
|
20
22
|
@int_fields = int_fields
|
21
|
-
@
|
23
|
+
@default_fields = default_fields
|
22
24
|
@time_zone = time_zone
|
23
25
|
end
|
24
26
|
|
@@ -31,7 +33,7 @@ module Qiita
|
|
31
33
|
filterable_fields: @filterable_fields,
|
32
34
|
hierarchal_fields: @hierarchal_fields,
|
33
35
|
int_fields: @int_fields,
|
34
|
-
|
36
|
+
default_fields: @default_fields,
|
35
37
|
time_zone: @time_zone,
|
36
38
|
)
|
37
39
|
end
|
@@ -40,12 +42,13 @@ module Qiita
|
|
40
42
|
|
41
43
|
def tokenizer
|
42
44
|
@tokenizer ||= Tokenizer.new(
|
45
|
+
all_fields: @all_fields,
|
43
46
|
date_fields: @date_fields,
|
44
47
|
downcased_fields: @downcased_fields,
|
45
48
|
filterable_fields: @filterable_fields,
|
46
49
|
hierarchal_fields: @hierarchal_fields,
|
47
50
|
int_fields: @int_fields,
|
48
|
-
|
51
|
+
default_fields: @default_fields,
|
49
52
|
time_zone: @time_zone,
|
50
53
|
)
|
51
54
|
end
|
@@ -15,15 +15,17 @@ module Qiita
|
|
15
15
|
|
16
16
|
# @param [true, false] downcased True if given term must be downcased on query representation
|
17
17
|
# @param [String, nil] field_name Field name part
|
18
|
-
# @param [true,
|
19
|
-
# @param [true, false] quoted Given term is quoted or
|
18
|
+
# @param [true, false] negative True if this term represents negative token (e.g. "-Perl")
|
19
|
+
# @param [true, false] quoted Given term is quoted or not
|
20
|
+
# @param [true, false] filter True if this term should be used as filter
|
20
21
|
# @param [String] term Term part
|
21
22
|
# @param [String] token_string Original entire string
|
22
|
-
def initialize(downcased: nil, field_name: nil, negative: nil, quoted: nil, term: nil, token_string: nil)
|
23
|
+
def initialize(downcased: nil, field_name: nil, negative: nil, quoted: nil, filter: nil, term: nil, token_string: nil)
|
23
24
|
@downcased = downcased
|
24
25
|
@field_name = field_name
|
25
26
|
@negative = negative
|
26
27
|
@quoted = quoted
|
28
|
+
@filter = filter
|
27
29
|
@term = term
|
28
30
|
@token_string = token_string
|
29
31
|
end
|
@@ -38,7 +40,7 @@ module Qiita
|
|
38
40
|
end
|
39
41
|
|
40
42
|
def filter?
|
41
|
-
|
43
|
+
!!@filter || negative?
|
42
44
|
end
|
43
45
|
|
44
46
|
# @return [true, false] True if this token is for query
|
@@ -12,6 +12,7 @@ module Qiita
|
|
12
12
|
DEFAULT_FILTERABLE_FIELDS = []
|
13
13
|
DEFAULT_HIERARCHAL_FIELDS = []
|
14
14
|
DEFAULT_INT_FIELDS = []
|
15
|
+
DEFAULT_DEFAULT_FIELDS = []
|
15
16
|
EXTRA_DATE_FIELDS = %w(created updated)
|
16
17
|
EXTRA_FILTERABLE_FIELDS = %w(created is sort updated)
|
17
18
|
|
@@ -27,20 +28,22 @@ module Qiita
|
|
27
28
|
)
|
28
29
|
/x
|
29
30
|
|
31
|
+
# @param [Array<String>, nil] all_fields
|
30
32
|
# @param [Array<String>, nil] date_fields
|
31
33
|
# @param [Array<String>, nil] downcased_fields
|
32
34
|
# @param [Array<String>, nil] filterable_fields
|
33
35
|
# @param [Array<String>, nil] hierarchal_fields
|
34
36
|
# @param [Array<String>, nil] int_fields
|
35
|
-
# @param [Array<String>, nil]
|
37
|
+
# @param [Array<String>, nil] default_fields
|
36
38
|
# @param [String, nil] time_zone
|
37
|
-
def initialize(date_fields: nil, downcased_fields: nil, filterable_fields: nil, hierarchal_fields: nil, int_fields: nil,
|
38
|
-
@date_fields = date_fields
|
39
|
-
@downcased_fields = downcased_fields
|
40
|
-
@filterable_fields = filterable_fields
|
41
|
-
@hierarchal_fields = hierarchal_fields
|
42
|
-
@int_fields = int_fields
|
43
|
-
@
|
39
|
+
def initialize(all_fields: nil, date_fields: nil, downcased_fields: nil, filterable_fields: nil, hierarchal_fields: nil, int_fields: nil, default_fields: nil, time_zone: nil)
|
40
|
+
@date_fields = (date_fields || DEFAULT_DATE_FIELDS) | EXTRA_DATE_FIELDS
|
41
|
+
@downcased_fields = downcased_fields || DEFAULT_DOWNCASED_FIELDS
|
42
|
+
@filterable_fields = (filterable_fields || DEFAULT_FILTERABLE_FIELDS) | EXTRA_FILTERABLE_FIELDS
|
43
|
+
@hierarchal_fields = hierarchal_fields || DEFAULT_HIERARCHAL_FIELDS
|
44
|
+
@int_fields = int_fields || DEFAULT_INT_FIELDS
|
45
|
+
@default_fields = default_fields || DEFAULT_DEFAULT_FIELDS
|
46
|
+
@all_fields = aggregate_all_fields(all_fields)
|
44
47
|
@time_zone = time_zone
|
45
48
|
end
|
46
49
|
|
@@ -49,19 +52,20 @@ module Qiita
|
|
49
52
|
def tokenize(query_string)
|
50
53
|
query_string.scan(TOKEN_PATTERN).map do |token_string, minus, field_name, quoted_term, term|
|
51
54
|
term ||= quoted_term
|
52
|
-
if !field_name.nil? &&
|
55
|
+
if !field_name.nil? && !@all_fields.include?(field_name)
|
53
56
|
term = "#{field_name}:#{term}"
|
54
57
|
field_name = nil
|
55
58
|
end
|
56
59
|
token = token_class(field_name).new(
|
57
|
-
downcased: downcased_fields.include?(field_name),
|
60
|
+
downcased: @downcased_fields.include?(field_name),
|
58
61
|
field_name: field_name,
|
59
62
|
negative: !minus.nil?,
|
60
63
|
quoted: !quoted_term.nil?,
|
64
|
+
filter: @filterable_fields.include?(field_name),
|
61
65
|
term: term,
|
62
66
|
token_string: token_string,
|
63
67
|
)
|
64
|
-
token.
|
68
|
+
token.default_fields = @default_fields if token.is_a?(MatchableToken)
|
65
69
|
token.time_zone = @time_zone if token.is_a?(DateToken)
|
66
70
|
token
|
67
71
|
end
|
@@ -69,35 +73,29 @@ module Qiita
|
|
69
73
|
|
70
74
|
private
|
71
75
|
|
72
|
-
def
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
end
|
83
|
-
|
84
|
-
def hierarchal_fields
|
85
|
-
@hierarchal_fields || DEFAULT_HIERARCHAL_FIELDS
|
86
|
-
end
|
76
|
+
def aggregate_all_fields(base)
|
77
|
+
fields = [
|
78
|
+
base,
|
79
|
+
@date_fields,
|
80
|
+
@downcased_fields,
|
81
|
+
@filterable_fields,
|
82
|
+
@hierarchal_fields,
|
83
|
+
@int_fields,
|
84
|
+
@default_fields
|
85
|
+
].flatten.compact
|
87
86
|
|
88
|
-
|
89
|
-
@int_fields || DEFAULT_INT_FIELDS
|
87
|
+
fields.map { |field| field.sub(/\^\d+\z/, "") }.uniq
|
90
88
|
end
|
91
89
|
|
92
90
|
def token_class(field_name)
|
93
91
|
case
|
94
|
-
when date_fields.include?(field_name)
|
92
|
+
when @date_fields.include?(field_name)
|
95
93
|
DateToken
|
96
|
-
when int_fields.include?(field_name)
|
94
|
+
when @int_fields.include?(field_name)
|
97
95
|
IntToken
|
98
|
-
when hierarchal_fields.include?(field_name)
|
96
|
+
when @hierarchal_fields.include?(field_name)
|
99
97
|
HierarchalToken
|
100
|
-
when filterable_fields.include?(field_name)
|
98
|
+
when @filterable_fields.include?(field_name)
|
101
99
|
FilterableToken
|
102
100
|
else
|
103
101
|
MatchableToken
|
data/qiita-elasticsearch.gemspec
CHANGED
@@ -18,6 +18,6 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.add_development_dependency "bundler", ">= 1.7"
|
19
19
|
spec.add_development_dependency "codeclimate-test-reporter"
|
20
20
|
spec.add_development_dependency "rake", "~> 10.0"
|
21
|
-
spec.add_development_dependency "rspec", "3.
|
21
|
+
spec.add_development_dependency "rspec", "~> 3.3"
|
22
22
|
spec.add_development_dependency "rubocop", "0.29.1"
|
23
23
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: qiita-elasticsearch
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.15.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryo Nakamura
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-11-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -70,16 +70,16 @@ dependencies:
|
|
70
70
|
name: rspec
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- -
|
73
|
+
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: 3.
|
75
|
+
version: '3.3'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- -
|
80
|
+
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: 3.
|
82
|
+
version: '3.3'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: rubocop
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -153,7 +153,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
153
153
|
version: '0'
|
154
154
|
requirements: []
|
155
155
|
rubyforge_project:
|
156
|
-
rubygems_version: 2.4.5
|
156
|
+
rubygems_version: 2.4.5.1
|
157
157
|
signing_key:
|
158
158
|
specification_version: 4
|
159
159
|
summary: Elasticsearch client helper for Qiita.
|