solrb 0.1.9 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +5 -5
- data/lib/solr/document.rb +3 -2
- data/lib/solr/query/request/edismax_adapter.rb +33 -30
- data/lib/solr/query/request/field_list.rb +25 -0
- data/lib/solr/query/request.rb +6 -4
- data/lib/solr/query/response/parser.rb +4 -2
- data/lib/solr/version.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b9c229eff6ef2d2cef01522d3aac36ed852fcf37d2eddaebdf3545ede67cb7a1
|
4
|
+
data.tar.gz: 35b41eebe98c7d45cbaee285f19fe39a246ec9d3a250e4aa4a06a93b6733e543
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f364be89ae580d4b987c6bd097c9a4d68750c0c73cdc9ae15b8b263efff52bff65ed26f410fa9ffe42f958aee934cc932765af6d4d8128a519477b06d5835a9f
|
7
|
+
data.tar.gz: 8352cfffca004a27bc9105cdf020931e57967bd6ea512a5f0764bb91de65ee13c0111e721fa7bb7e361f697cb08570a2f9d5490f27056bca60daf5fea5c8a929
|
data/README.md
CHANGED
@@ -39,14 +39,14 @@ Object-Oriented approach to Solr in Ruby.
|
|
39
39
|
Add `solrb` to your Gemfile:
|
40
40
|
|
41
41
|
```ruby
|
42
|
-
gem solrb
|
42
|
+
gem 'solrb'
|
43
43
|
```
|
44
44
|
|
45
45
|
If you are going to use solrb with solr cloud:
|
46
46
|
|
47
47
|
```ruby
|
48
|
-
gem zk # required for solrb solr-cloud integration
|
49
|
-
gem solrb
|
48
|
+
gem 'zk' # required for solrb solr-cloud integration
|
49
|
+
gem 'solrb'
|
50
50
|
```
|
51
51
|
|
52
52
|
# Configuration
|
@@ -362,8 +362,8 @@ Example of usage:
|
|
362
362
|
]
|
363
363
|
request = Solr::Query::Request.new(search_term: 'term', fields: fields)
|
364
364
|
# Solr::Query::Request will return only :id field by default.
|
365
|
-
# Specify additional return fields (fl param) by setting the request
|
366
|
-
request.
|
365
|
+
# Specify additional return fields (fl param) by setting the request field_list
|
366
|
+
request.field_list = [:name, :category]
|
367
367
|
request.run(page: 1, page_size: 10)
|
368
368
|
```
|
369
369
|
|
data/lib/solr/document.rb
CHANGED
@@ -12,15 +12,16 @@ module Solr
|
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
|
-
attr_reader :id, :model_name, :score, :debug_info, :group
|
15
|
+
attr_reader :id, :model_name, :score, :debug_info, :group, :fields
|
16
16
|
|
17
17
|
# TODO: model_name is specific for machinio
|
18
|
-
def initialize(id:, model_name: nil, score: nil, debug_info: nil, group: GroupInformation.empty)
|
18
|
+
def initialize(id:, model_name: nil, score: nil, debug_info: nil, group: GroupInformation.empty, fields: {})
|
19
19
|
@id = id
|
20
20
|
@model_name = model_name
|
21
21
|
@score = score
|
22
22
|
@debug_info = debug_info
|
23
23
|
@group = group
|
24
|
+
@fields = fields
|
24
25
|
end
|
25
26
|
end
|
26
27
|
end
|
@@ -6,14 +6,15 @@ module Solr
|
|
6
6
|
include Solr::Support::SchemaHelper
|
7
7
|
|
8
8
|
EDISMAX_QUERY_FIELDS = :qf
|
9
|
-
EDISMAX_FILTER_QUERY = :fq
|
10
9
|
EDISMAX_ADDITIVE_BOOST_FUNCTION = :bf
|
11
10
|
EDISMAX_MULTIPLICATIVE_BOOST_FUNCTION = :boost
|
12
11
|
EDISMAX_PHRASE_BOOST = :pf
|
13
12
|
EDISMAX_PHRASE_SLOP = :ps
|
14
|
-
|
13
|
+
FILTER_QUERY = :fq
|
14
|
+
FIELD_LIST = :fl
|
15
15
|
RERANK_QUERY = :rq
|
16
16
|
QUERY_OPERATOR = :'q.op'
|
17
|
+
JSON_FACET = :'json.facet'
|
17
18
|
|
18
19
|
attr_reader :request
|
19
20
|
|
@@ -24,7 +25,7 @@ module Solr
|
|
24
25
|
def to_h
|
25
26
|
solr_params = { q: request.search_term, defType: :edismax }
|
26
27
|
solr_params = add_query_fields(solr_params)
|
27
|
-
solr_params =
|
28
|
+
solr_params = add_field_list(solr_params)
|
28
29
|
solr_params = add_filters(solr_params)
|
29
30
|
solr_params = add_facets(solr_params)
|
30
31
|
solr_params = add_boosting(solr_params)
|
@@ -41,20 +42,20 @@ module Solr
|
|
41
42
|
private
|
42
43
|
|
43
44
|
def add_query_fields(solr_params)
|
44
|
-
|
45
|
-
solr_params
|
45
|
+
query_fields = request.query_fields.map(&:to_solr_s)
|
46
|
+
solr_params[EDISMAX_QUERY_FIELDS] = query_fields
|
47
|
+
solr_params
|
46
48
|
end
|
47
49
|
|
48
50
|
def add_filters(solr_params)
|
49
51
|
filters = request.filters.map(&:to_solr_s)
|
50
|
-
solr_params
|
52
|
+
solr_params[FILTER_QUERY] = filters
|
53
|
+
solr_params
|
51
54
|
end
|
52
|
-
|
55
|
+
|
53
56
|
def add_facets(solr_params)
|
54
57
|
return solr_params if Array(request.facets).empty?
|
55
|
-
|
56
|
-
solr_params['json.facet'] = request.facets.map(&:to_solr_h).reduce(&:merge).to_json
|
57
|
-
|
58
|
+
solr_params[JSON_FACET] = request.facets.map(&:to_solr_h).reduce(&:merge).to_json
|
58
59
|
solr_params
|
59
60
|
end
|
60
61
|
|
@@ -68,16 +69,15 @@ module Solr
|
|
68
69
|
def add_additive_boost_functions(solr_params)
|
69
70
|
additive_boosts = request.boosting.additive_boost_functions.map(&:to_solr_s)
|
70
71
|
if additive_boosts.any?
|
71
|
-
solr_params
|
72
|
-
else
|
73
|
-
solr_params
|
72
|
+
solr_params[EDISMAX_ADDITIVE_BOOST_FUNCTION] = additive_boosts
|
74
73
|
end
|
74
|
+
solr_params
|
75
75
|
end
|
76
76
|
|
77
77
|
def add_multiplicative_boost_functions(solr_params)
|
78
78
|
multiplicative_boosts = request.boosting.multiplicative_boost_functions.map(&:to_solr_s)
|
79
79
|
if multiplicative_boosts.any?
|
80
|
-
solr_params =
|
80
|
+
solr_params[EDISMAX_MULTIPLICATIVE_BOOST_FUNCTION] = multiplicative_boosts
|
81
81
|
# https://stackoverflow.com/questions/47025453/
|
82
82
|
maybe_add_spatial_fields(solr_params, request.boosting.spatial_boost)
|
83
83
|
else
|
@@ -88,18 +88,16 @@ module Solr
|
|
88
88
|
def add_phrase_boosts(solr_params)
|
89
89
|
solr_phrase_boosts = request.boosting.phrase_boosts.map(&:to_solr_s)
|
90
90
|
if solr_phrase_boosts.any?
|
91
|
-
solr_params
|
92
|
-
else
|
93
|
-
solr_params
|
91
|
+
solr_params[EDISMAX_PHRASE_BOOST] = solr_phrase_boosts
|
94
92
|
end
|
93
|
+
solr_params
|
95
94
|
end
|
96
95
|
|
97
96
|
def maybe_add_spatial_fields(solr_params, geodist_function)
|
98
97
|
if geodist_function
|
99
|
-
solr_params.merge(pt: geodist_function.latlng, sfield: geodist_function.sfield)
|
100
|
-
else
|
101
|
-
solr_params
|
98
|
+
solr_params.merge!(pt: geodist_function.latlng, sfield: geodist_function.sfield)
|
102
99
|
end
|
100
|
+
solr_params
|
103
101
|
end
|
104
102
|
|
105
103
|
def add_grouping(solr_params)
|
@@ -116,18 +114,20 @@ module Solr
|
|
116
114
|
def add_sorting(solr_params)
|
117
115
|
return solr_params if request.sorting.empty?
|
118
116
|
solr_sorting = request.sorting.fields.map(&:to_solr_s).join(', ')
|
119
|
-
solr_params
|
117
|
+
solr_params[:sort] = solr_sorting
|
118
|
+
solr_params
|
120
119
|
end
|
121
120
|
|
122
|
-
def
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
solr_params
|
121
|
+
def add_field_list(solr_params)
|
122
|
+
request.field_list.fields << :score if debug_mode?
|
123
|
+
field_list = request.field_list.to_solr_s
|
124
|
+
solr_params[FIELD_LIST] = field_list
|
125
|
+
solr_params
|
127
126
|
end
|
128
127
|
|
129
128
|
def add_debug(solr_params)
|
130
|
-
solr_params
|
129
|
+
solr_params[:debug] = debug_mode?
|
130
|
+
solr_params
|
131
131
|
end
|
132
132
|
|
133
133
|
def debug_mode?
|
@@ -141,17 +141,20 @@ module Solr
|
|
141
141
|
def add_rerank_query(solr_params)
|
142
142
|
return solr_params unless request.limit_docs_by_field
|
143
143
|
rerank_query = request.limit_docs_by_field.to_solr_s
|
144
|
-
solr_params
|
144
|
+
solr_params[RERANK_QUERY] = rerank_query
|
145
|
+
solr_params
|
145
146
|
end
|
146
147
|
|
147
148
|
def add_phrase_slop(solr_params)
|
148
149
|
return solr_params unless request.phrase_slop
|
149
|
-
solr_params
|
150
|
+
solr_params[EDISMAX_PHRASE_SLOP] = request.phrase_slop
|
151
|
+
solr_params
|
150
152
|
end
|
151
153
|
|
152
154
|
def add_query_operator(solr_params)
|
153
155
|
return solr_params unless request.query_operator
|
154
|
-
solr_params
|
156
|
+
solr_params[QUERY_OPERATOR] = request.query_operator
|
157
|
+
solr_params
|
155
158
|
end
|
156
159
|
end
|
157
160
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Solr
|
2
|
+
module Query
|
3
|
+
class Request
|
4
|
+
class FieldList
|
5
|
+
include Solr::Support::SchemaHelper
|
6
|
+
|
7
|
+
MANDATORY_FIELDS = %i[id].freeze
|
8
|
+
|
9
|
+
attr_accessor :fields
|
10
|
+
|
11
|
+
def initialize(fields: [])
|
12
|
+
@fields = fields
|
13
|
+
end
|
14
|
+
|
15
|
+
def empty?
|
16
|
+
fields.empty?
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_solr_s
|
20
|
+
(MANDATORY_FIELDS + fields.map(&method(:solarize_field))).uniq.join(',')
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/solr/query/request.rb
CHANGED
@@ -7,6 +7,7 @@ require 'solr/query/request/edismax_adapter'
|
|
7
7
|
require 'solr/query/request/grouping'
|
8
8
|
require 'solr/query/request/boosting'
|
9
9
|
require 'solr/query/request/spellcheck'
|
10
|
+
require 'solr/query/request/field_list'
|
10
11
|
require 'solr/query/request/sorting/field'
|
11
12
|
require 'solr/query/request/sorting/function'
|
12
13
|
require 'solr/query/request/field_with_boost'
|
@@ -18,13 +19,14 @@ module Solr
|
|
18
19
|
module Query
|
19
20
|
class Request
|
20
21
|
attr_reader :search_term
|
21
|
-
attr_accessor :filters, :
|
22
|
-
:limit_docs_by_field, :phrase_slop, :
|
22
|
+
attr_accessor :filters, :query_fields, :field_list, :facets, :boosting, :debug_mode, :spellcheck,
|
23
|
+
:limit_docs_by_field, :phrase_slop, :query_operator
|
23
24
|
attr_writer :grouping, :sorting
|
24
25
|
|
25
|
-
def initialize(search_term:,
|
26
|
+
def initialize(search_term:, query_fields: [], field_list: Solr::Query::Request::FieldList.new, filters: [])
|
26
27
|
@search_term = search_term
|
27
|
-
@
|
28
|
+
@query_fields = query_fields
|
29
|
+
@field_list = field_list
|
28
30
|
@filters = filters
|
29
31
|
end
|
30
32
|
|
@@ -72,7 +72,8 @@ module Solr
|
|
72
72
|
def parse_regular_documents
|
73
73
|
solr_response['response']['docs'].map do |d|
|
74
74
|
debug_info = solr_response.dig('debug', 'explain', d['id'])
|
75
|
-
|
75
|
+
fields = d.dup.delete_if { |k, v| %w[id score].include?(k) }
|
76
|
+
Document.new(id: d['id'], score: d['score'], debug_info: debug_info, fields: fields)
|
76
77
|
end
|
77
78
|
end
|
78
79
|
|
@@ -82,8 +83,9 @@ module Solr
|
|
82
83
|
next unless doc
|
83
84
|
debug_info = solr_response.dig('debug', 'explain', doc['id'])
|
84
85
|
group_information = Document::GroupInformation.new(key: solr_grouping_field, value: group['groupValue'])
|
86
|
+
fields = doc.dup.delete_if { |k, v| %w[id score].include?(k) }
|
85
87
|
Document.new(id: doc['id'], score: doc['score'],
|
86
|
-
debug_info: debug_info, group: group_information)
|
88
|
+
debug_info: debug_info, group: group_information, fields: fields)
|
87
89
|
end
|
88
90
|
end.flatten.compact
|
89
91
|
end
|
data/lib/solr/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: solrb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adriano Luz
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: exe
|
12
12
|
cert_chain: []
|
13
|
-
date: 2019-02-
|
13
|
+
date: 2019-02-19 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: addressable
|
@@ -220,6 +220,7 @@ files:
|
|
220
220
|
- lib/solr/query/request/boosting/textual_field_value_match_boost_function.rb
|
221
221
|
- lib/solr/query/request/edismax_adapter.rb
|
222
222
|
- lib/solr/query/request/facet.rb
|
223
|
+
- lib/solr/query/request/field_list.rb
|
223
224
|
- lib/solr/query/request/field_with_boost.rb
|
224
225
|
- lib/solr/query/request/filter.rb
|
225
226
|
- lib/solr/query/request/geo_filter.rb
|
@@ -272,7 +273,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
272
273
|
version: '0'
|
273
274
|
requirements: []
|
274
275
|
rubyforge_project:
|
275
|
-
rubygems_version: 2.7.
|
276
|
+
rubygems_version: 2.7.6
|
276
277
|
signing_key:
|
277
278
|
specification_version: 4
|
278
279
|
summary: Solr Ruby client with a nice object-oriented API
|