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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9ec22b8f3fb8d4af1362389b30173de437f3a66e0a56fd11189a66aa28c0a4f2
4
- data.tar.gz: 36ae13f391bc00291bd4661c1ac910b6cdc2242f0c090a64d11c2385bca39274
3
+ metadata.gz: b9c229eff6ef2d2cef01522d3aac36ed852fcf37d2eddaebdf3545ede67cb7a1
4
+ data.tar.gz: 35b41eebe98c7d45cbaee285f19fe39a246ec9d3a250e4aa4a06a93b6733e543
5
5
  SHA512:
6
- metadata.gz: ef11a6e93954a9b5245861b4753f722aa6f936f91fe2523ac4c31b685cf300cb37ae07247b24e70515914053d2e96330501bcb213c07aeef15cc6168c5540c71
7
- data.tar.gz: 743961e7ae4540f4e67362554470bc3485ddab0ddfc557d4b0d27fd99b51c91b64c333e2a24a9a7839b9d87d7b514142e4302a701ba73f4a51be20a213f12c8c
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 response_fields
366
- request.response_fields = [:name, :category]
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
- RESPONSE_FIELDS = :fl
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 = add_response_fields(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
- fields = request.fields.map(&:to_solr_s)
45
- solr_params.merge(EDISMAX_QUERY_FIELDS => fields)
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.merge(EDISMAX_FILTER_QUERY => filters)
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.merge(EDISMAX_ADDITIVE_BOOST_FUNCTION => additive_boosts)
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 = solr_params.merge(EDISMAX_MULTIPLICATIVE_BOOST_FUNCTION => multiplicative_boosts)
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.merge(EDISMAX_PHRASE_BOOST => solr_phrase_boosts)
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.merge(sort: solr_sorting)
117
+ solr_params[:sort] = solr_sorting
118
+ solr_params
120
119
  end
121
120
 
122
- def add_response_fields(solr_params)
123
- response_fields = 'id'
124
- response_fields += ',score' if debug_mode?
125
- response_fields += request.response_fields if request.response_fields
126
- solr_params.merge(RESPONSE_FIELDS => response_fields)
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.merge(debug: debug_mode?)
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.merge(RERANK_QUERY => rerank_query)
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.merge(EDISMAX_PHRASE_SLOP => request.phrase_slop)
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.merge(QUERY_OPERATOR => request.query_operator)
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
@@ -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, :fields, :facets, :boosting, :debug_mode, :spellcheck,
22
- :limit_docs_by_field, :phrase_slop, :response_fields, :query_operator
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:, fields: [], filters: [])
26
+ def initialize(search_term:, query_fields: [], field_list: Solr::Query::Request::FieldList.new, filters: [])
26
27
  @search_term = search_term
27
- @fields = fields
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
- Document.new(id: d['id'], score: d['score'], debug_info: debug_info)
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
@@ -1,3 +1,3 @@
1
1
  module Solr
2
- VERSION = '0.1.9'.freeze
2
+ VERSION = '0.2.0'.freeze
3
3
  end
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.1.9
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-07 00:00:00.000000000 Z
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.8
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