solrb 0.1.9 → 0.2.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/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
|