redisearch-rails 0.1.3 → 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '08ae96ed9f5d7036aad94a3963da45cec27e49590fedefbed55a60bd499f488b'
4
- data.tar.gz: 2edcd21c9630847d45069fb0c4c5bc72c38bb1adc06aa2ee4a6744d277380b8d
3
+ metadata.gz: 389ea395f1fe1ef5130083e382f435fa4515d1ab3f9952f4bc660eed47838d40
4
+ data.tar.gz: cb56f462ab039f9b93eb7c9310cbd50a3a9678a1b2eb1d2c4205caec3066754c
5
5
  SHA512:
6
- metadata.gz: 45aba119df5a95c0f5be05163ea13ed160e7f5a855100f76ad831019a42d3abd67e651f7070da40895a3769b36c21498aba810ba9145e017e5f16b6a4671f670
7
- data.tar.gz: 30ebd3627d3efebc36d191ae04edada8115d946db74f1111f16dc56ef6b779763187908b351e6ca8d2412bf92ad275cc2a6be0c838a919b1e6a43b729a27a562
6
+ metadata.gz: 9f534dafaba92007233233420f17b7230f521df2d7a82b785b6cc2c35d03201d37c38ecbb4913aa90500aedc690cd9fd8840919261234c70626f9202f9dd83b1
7
+ data.tar.gz: 650c151013343ab35936a565b9ad657f54fc978ee64ed77ddec04fa04751d2b513318e8c25f4327756779305996526b768e2b6bc4f6fc717d16224b9607f5227
data/README.md CHANGED
@@ -1,12 +1,14 @@
1
- # Redisearch::Rails
1
+ # Redisearch-rails
2
2
 
3
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/redisearch/rails`. To experiment with that code, run `bin/console` for an interactive prompt.
3
+ Adds support for easily indexing and search ActiveRecord models using RediSearch module http://redisearch.io/
4
4
 
5
- TODO: Delete this and the text above, and describe your gem
5
+ # Getting started
6
6
 
7
- ## Installation
7
+ First you need a Redisearch Service running, please follow [Quick Start](https://oss.redislabs.com/redisearch/Quick_Start.html) documentation.
8
8
 
9
- Add this line to your application's Gemfile:
9
+ Redisearch-rails is compatible with Rails `~> 4.2` on Ruby `2.3` and later.
10
+
11
+ In your Gemfile, for the last officially released gem:
10
12
 
11
13
  ```ruby
12
14
  gem 'redisearch-rails'
@@ -14,30 +16,172 @@ gem 'redisearch-rails'
14
16
 
15
17
  And then execute:
16
18
 
17
- $ bundle
19
+ ```bash
20
+ $ bundle install
21
+ ```
22
+
23
+ Once the gem installed you will need to add the configuration to cannect to redisearch.
18
24
 
19
- Or install it yourself as:
25
+ Go to your initializers (`config/initializers`), add a new file and call it `redisearch.rb`
26
+
27
+ ```ruby
28
+ RediSearch.configure do |config|
29
+ config.redis_config = {
30
+ host: '127.0.0.1',
31
+ port: '6379',
32
+ db: 0, # this has to be 0
33
+ # password: 'some password' #(optional)
34
+ }
35
+ end
36
+ ```
20
37
 
21
- $ gem install redisearch-rails
22
38
 
23
39
  ## Usage
24
40
 
25
- TODO: Write usage instructions here
41
+ To integrate Redisearch for Rails only you need to call `redisearch` method defining the Redisearch `schema` inside of your ActiveRecord Model.
26
42
 
27
- ## Development
43
+ ```ruby
44
+ class User < ActiveRecord::Base
45
+ redisearch schema: {
46
+ first_name: { text: { phonetic: "dm:es" } },
47
+ last_name: { text: { phonetic: "dm:es" } },
48
+ email: :text,
49
+ age: :numeric
50
+ }
51
+ end
52
+ ```
28
53
 
29
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
54
+ This will add the `reindex` and `rediseach` class methods.
30
55
 
31
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
56
+ Now you can index all the recods, using `User.reindex` and search using `redisearch` method with [RediSearch Query Syntax](https://oss.redislabs.com/redisearch/Query_Syntax.html).
32
57
 
33
- ## Contributing
58
+ ```ruby
59
+ irb(main):004:0> User.redisearch('@first_name:(Jon|Jane) @last_name:"Doe"')
60
+ User Load (0.5ms) SELECT `users`.* FROM `users` WHERE `users`.`id` IN (2, 1)
61
+ => [#<User id: 1, email: "jon@test.com", first_name: "Jon", last_name: "Doe", created_at: "2020-1-06 19:21:36", updated_at: "2020-1-06 19:24:43", age: 15>, #<User id: 2, email: "Jane@other.com", first_name: "Jane", last_name: "Doe", created_at: "2020-1-06 22:19:00", updated_at: "2020-1-06 22:19:00", age: 20>]
62
+ ```
34
63
 
35
- Bug reports and pull requests are welcome on GitHub at https://github.com/pbeckmann/redisearch-rails. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
36
64
 
37
- ## License
65
+ ## Indexing
66
+ Each Model with defined `redisearch` is a **Redisearch Index** representation, and an instantiated Object its a **Redisearch Document** where the ID attribute of the instance is the ID of the Document.
67
+
68
+ By default, `reindex` will use `all` scope for find, you can change overwriting the scope
69
+
70
+ ```ruby
71
+ class User < ActiveRecord::Base
72
+ scope :redisearch_import, -> { where(email: 'some@email.com') }
73
+ end
74
+ ```
75
+
76
+ If you need to recreate the Index, you can use `recreate: true` option on `reindex`
77
+
78
+ ```ruby
79
+ irb(main):004:0> User.reindex(recreate: true)
80
+ => nil
81
+ ```
38
82
 
39
- The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
83
+ this will drop the **Index** with all the **Documents** and start to reindexing.
40
84
 
41
- ## Code of Conduct
85
+ ### Custom Attributes
86
+ You can use Custom attributes defining a method or attr_accessor.
87
+
88
+ ```ruby
89
+ # == Schema Information
90
+ #
91
+ # Table name: users
92
+ # first_name :string(255)
93
+ # last_name :string(255)
94
+ # email :string(255) default(""), not null
95
+ # company_id :integer
96
+ #
97
+ class User < ActiveRecord::Base
98
+ redisearch schema: {
99
+ full_name: { text: { phonetic: "dm:es" } },
100
+ company_name: :text
101
+ }
102
+
103
+ belongs_to :company
104
+
105
+ scope :redisearch_import, -> { all.includes(:company) }
106
+
107
+ after_commit :redisearch_add, on: [ :create, :update ]
108
+ after_commit :redisearch_delete, on: :destroy
109
+
110
+ def company_name
111
+ company.name
112
+ end
113
+
114
+ def full_name
115
+ "#{first_name} #{last_name}"
116
+ end
117
+
118
+ private
119
+
120
+ def redisearch_add
121
+ redisearch_document.add(replace: true, partial: true)
122
+ end
123
+
124
+ def redisearch_delete
125
+ redisearch_document.del(dd: true)
126
+ end
127
+
128
+ end
129
+ ```
130
+
131
+ You can add a Serializer to the indexer like this
132
+
133
+ ```ruby
134
+ # == Schema Information
135
+ #
136
+ # Table name: company
137
+ # name :string(255)
138
+ #
139
+ class Company < ActiveRecord::Base
140
+ redisearch schema: {
141
+ name: { :text },
142
+ users_ids: :tag # Array
143
+ }, index_serializer: Company::RedisearchSerlializer
144
+ has_many :users
145
+
146
+ scope :redisearch_import, -> { includes(:users) }
147
+ end
148
+
149
+ class Company::RedisearchSerlializer
150
+ attr_reader :company
151
+
152
+ def initialize(company)
153
+ @company = company
154
+ end
155
+
156
+ def users_ids
157
+ company.users.ids #Array of ids
158
+ end
159
+ end
160
+ ```
161
+
162
+
163
+
164
+
165
+ ## Search
166
+
167
+ Simply use the `redisearch` method with a [RediSearch Query Syntax](https://oss.redislabs.com/redisearch/Query_Syntax.html).
168
+
169
+ This ask to Redisearch the Documents ids and then use ActiveRecord find method to brings the elements.
170
+
171
+ ## TODOs
172
+
173
+ * ActiveModel callbacks to index records on saving and remove from Redis on delete
174
+ * More Configurations like batch size when reindexing
175
+ * Support GEO filters
176
+ * Stopwords configuration
177
+ * Configurable doc_id reference, for now use ID and find method to search
178
+ * Test coverage and better documentation
179
+ * Multiple redisearch indexes for the same model
180
+
181
+ ## Contributing
182
+
183
+ Bug reports and pull requests are welcome on GitHub at https://github.com/Ticketplus/redisearch-rails. This project is intended to be a safe, welcoming space for collaboration.
184
+
185
+ ## License
42
186
 
43
- Everyone interacting in the Redisearch::Rails project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/pbeckmann/redisearch-rails/blob/master/CODE_OF_CONDUCT.md).
187
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
@@ -2,10 +2,11 @@ module RediSearch
2
2
  module RediSearchable
3
3
  module ClassMethods
4
4
 
5
- attr_reader :redisearch_index
5
+ attr_reader :redisearch_index, :redisearch_index_serializer
6
6
 
7
7
  def redisearch(*args, schema:, **options)
8
8
  prefix = options[:prefix]
9
+ @redisearch_index_serializer = options[:index_serializer]
9
10
 
10
11
  index_name = [prefix, model_name.plural].compact.join("_")
11
12
  @redisearch_index = RediSearch.client.generate_index(index_name, schema)
@@ -23,6 +24,7 @@ module RediSearch
23
24
  def redisearch(query, **options)
24
25
  result = redisearch_index.search(query, options.deep_merge(nocontent: true))
25
26
  result.shift # remove the first element (count)
27
+ result.map! { |elem| elem.sub("#{redisearch_index.name}_", '')}
26
28
  self.find(result)
27
29
  end
28
30
 
@@ -10,13 +10,18 @@ module RediSearch
10
10
 
11
11
  def generate_redisearch_document
12
12
  index = self.class.redisearch_index
13
+ serializer = redisearch_serializer || self
13
14
  fields = index.schema.fields.map(&:name)
14
- fields_values = Hash[fields.flatten.map! { |field| [field, public_send(field)] }]
15
+ fields_values = Hash[fields.flatten.map! { |field| [field, serializer.public_send(field)] }]
15
16
  index.generate_document(redisearch_document_id, fields_values)
16
17
  end
17
18
 
18
19
  def redisearch_document_id
19
- "0#{id}"
20
+ [self.class.redisearch_index.name, self.id].join('_')
21
+ end
22
+
23
+ def redisearch_serializer
24
+ self.class.redisearch_index_serializer.new(self) if self.class.redisearch_index_serializer
20
25
  end
21
26
 
22
27
  end
@@ -1,3 +1,3 @@
1
1
  module RediSearch
2
- VERSION = '0.1.3'
2
+ VERSION = '0.2.0'
3
3
  end
@@ -29,6 +29,6 @@ Gem::Specification.new do |spec|
29
29
  spec.add_dependency 'redi_searcher', '~> 0.1', '>= 0.1.3'
30
30
 
31
31
  spec.add_development_dependency "bundler", "~> 1.17"
32
- spec.add_development_dependency "rake", "~> 10.0"
32
+ spec.add_development_dependency "rake", ">= 12.3.3"
33
33
  spec.add_development_dependency "rspec", "~> 3.0"
34
34
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redisearch-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Patricio Beckmann
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-02-28 00:00:00.000000000 Z
11
+ date: 2020-03-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -76,16 +76,16 @@ dependencies:
76
76
  name: rake
77
77
  requirement: !ruby/object:Gem::Requirement
78
78
  requirements:
79
- - - "~>"
79
+ - - ">="
80
80
  - !ruby/object:Gem::Version
81
- version: '10.0'
81
+ version: 12.3.3
82
82
  type: :development
83
83
  prerelease: false
84
84
  version_requirements: !ruby/object:Gem::Requirement
85
85
  requirements:
86
- - - "~>"
86
+ - - ">="
87
87
  - !ruby/object:Gem::Version
88
- version: '10.0'
88
+ version: 12.3.3
89
89
  - !ruby/object:Gem::Dependency
90
90
  name: rspec
91
91
  requirement: !ruby/object:Gem::Requirement
@@ -112,7 +112,6 @@ files:
112
112
  - ".travis.yml"
113
113
  - CODE_OF_CONDUCT.md
114
114
  - Gemfile
115
- - LICENSE
116
115
  - LICENSE.txt
117
116
  - README.md
118
117
  - Rakefile
data/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2020 Ticketplus.cl
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.