redisearch-rails 0.1.3 → 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: '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.