redi_search_rails 0.1.0 → 0.1.1

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
  SHA1:
3
- metadata.gz: 1b44c7956cc281079bd1791948a8cc4f166d4711
4
- data.tar.gz: cfb12628b5f38e841fc7e045fca4576796ebd841
3
+ metadata.gz: 382515dc3277d39c0c8389db1424fe6d73cda0ca
4
+ data.tar.gz: 86727dec2fe4a6e642314d0a805571dfac49efd7
5
5
  SHA512:
6
- metadata.gz: 7034488828576a549979c08b50227c9ec6f854c7bf449f8168f4015b8943aeca2457e60641ab0bf74ad381a935a4c5d964f7553ed9ea19b57aed6fb375adac81
7
- data.tar.gz: 6196ff4ab6d475b783f4d84de6905eedcdee6d56a5b7942ac0087dc3fead2a701b54db6cdfb34f7362ff317ba494a645be74450d14f1b5882ecbf3be472bd775
6
+ metadata.gz: 50dc588fb78895feefec03a17d88a080b37fab8e285519a954583401509d41b5ce5a4c30c00d387a4a68771f69a89f57db932d427d57deda660b27046268dd2c
7
+ data.tar.gz: ab851b7e3b939cc017c7ce0956ca6dfc3e075cf3e54e639a73cd8422d1ef5899d3861a3d9362127bb4482bec8158a312119b2e823eb227258a4a37a40f1be143
data/README.md CHANGED
@@ -4,7 +4,7 @@ This gems simplifies integration with RediSearch module (http://redisearch.io/).
4
4
 
5
5
  ## Installation
6
6
 
7
- Install Redis and RediSearch following instructions on http://redisearch.io/Quick_Start/.
7
+ Install Redis and RediSearch following instructions on http://redisearch.io/Quick_Start/. Until modules are released with Redis 4 this requires compiling Redis from unstable branch from GitHub.
8
8
 
9
9
  Add this line to your application's Gemfile:
10
10
 
@@ -33,32 +33,43 @@ REDI_SEARCH = Redis.new(host: '127.0.0.1', port: '6379')
33
33
  ```ruby
34
34
  class User < ApplicationRecord
35
35
  include RediSearchRails
36
- redisearch_schema name: 'TEXT', email: 'TEXT', age: 'NUMERIC'
36
+ redi_search_schema name: 'TEXT', email: 'TEXT', age: 'NUMERIC'
37
37
  end
38
- # => create index
39
- rails r User.ft_create
40
- # => populate with records
41
- rails r User.ft_add_all
38
+ # => to create index run in rails console
39
+ User.ft_create
40
+ # => populate index with records for all users
41
+ User.ft_add_all
42
+ # => or you can do it for specific record
43
+ User.ft_add(User.where(id: 1))
42
44
  # => search
43
- rails r "User.ft_search('query here')"
45
+ User.ft_search('keyword here')
46
+ # => output
47
+ [1, "gid://application_name/User/unique_id", ["name", "Bob", "age", "100"]]
44
48
  ```
45
49
 
50
+ As unique identifier (doc_id) for records in Redis it uses https://github.com/rails/globalid. You need to make sure you models support it if you are using ORM other than ActiveRecord.
51
+
46
52
  ## Development
47
53
 
48
54
  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. To understand the code look in `lib/redi_search_rails`.
49
55
 
50
56
  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).
51
57
 
58
+ ## Testing
59
+
60
+ Testing this gem requires having local Redis with RediSearch module. This makes it very difficult to set it up with services like Codeship.
61
+
52
62
  ## TODOs
53
63
 
54
- * Tests
64
+ * ActiveModel callbacks to index records on saving and remove from Redis on delete
65
+ * Rake tasks to manage indexes
55
66
  * Support additional RediSearch API calls (SUGGADD, SUGGET, ...)
56
- * Support configuring SCORE
57
- * Rake tasks
58
- * ActiveModel callbacks to index records on saving
67
+ * Support configuring SCORE, WEIGHT and other options
59
68
  * Support indexing fields from related models (index group name if user belongs to a group)
60
69
  * Stopwords configuration
61
70
  * Minimum keyword length to index
71
+ * Configurable method for doc_id, not just default to_global_id
72
+ * More test coverage and documentation
62
73
 
63
74
  ## Contributing
64
75
 
@@ -1,3 +1,3 @@
1
1
  module RediSearchRails
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
@@ -1,11 +1,19 @@
1
1
  require "redi_search_rails/version"
2
+ require "active_support/concern"
2
3
 
3
4
  module RediSearchRails
4
5
  extend ActiveSupport::Concern
5
6
 
7
+ included do
8
+ end
9
+
6
10
  module ClassMethods
7
11
 
8
- def redisearch_schema(schema)
12
+ # will configure the RediSearch for the specific model
13
+ #
14
+ # @see https://github.com/dmitrypol/redi_search_rails
15
+ # @param schema [Hash] name: 'TEXT', age: 'NUMERIC'
16
+ def redi_search_schema(schema)
9
17
  @@schema = schema.to_a.flatten
10
18
  @@fields = schema.keys
11
19
  @@model = self.name.constantize
@@ -13,8 +21,13 @@ module RediSearchRails
13
21
  @@score = 1
14
22
  end
15
23
 
16
- def ft_search query
17
- results = REDI_SEARCH.call('FT.SEARCH', @@index_name, query,
24
+ # search the index for specific keyword(s)
25
+ #
26
+ # @param keyword [String] 'some keyword'
27
+ # @return [Array] [1, "gid://application_name/User/unique_id", ["name", "Bob", "age", "100"]]
28
+ # @raise [RuntimeError]
29
+ def ft_search keyword
30
+ results = REDI_SEARCH.call('FT.SEARCH', @@index_name, keyword,
18
31
  #'LIMIT', 0, 1000,
19
32
  #'NOCONTENT', #'VERBATIM', #'WITHSCORES', #'NOSTOPWORDS', #'WITHPAYLOADS',
20
33
  )
@@ -24,6 +37,9 @@ module RediSearchRails
24
37
  return e.message
25
38
  end
26
39
 
40
+ # create index for specific model
41
+ #
42
+ # @return [String]
27
43
  def ft_create
28
44
  REDI_SEARCH.call('FT.CREATE', @@index_name,
29
45
  #'NOFIELDS', 'NOSCOREIDX', 'NOOFFSETS',
@@ -35,6 +51,9 @@ module RediSearchRails
35
51
  return e.message
36
52
  end
37
53
 
54
+ # index all records in specific model
55
+ #
56
+ # @return [String]
38
57
  def ft_add_all
39
58
  @@model.all.each {|record| ft_add(record) }
40
59
  rescue Exception => e
@@ -42,6 +61,10 @@ module RediSearchRails
42
61
  return e.message
43
62
  end
44
63
 
64
+ # index specific record
65
+ #
66
+ # @param record [Object] Object to index
67
+ # @return [String]
45
68
  def ft_add record
46
69
  fields = []
47
70
  @@fields.each { |field| fields.push(field, record.send(field)) }
@@ -55,13 +78,21 @@ module RediSearchRails
55
78
  return e.message
56
79
  end
57
80
 
58
- def ft_del doc_id
81
+ # delete specific document from index
82
+ #
83
+ # @param record [Object] Object to delete
84
+ # @return [String]
85
+ def ft_del record
86
+ doc_id = record.to_global_id
59
87
  REDI_SEARCH.call('FT.DEL', @@index_name, doc_id)
60
88
  rescue Exception => e
61
89
  Rails.logger.error e
62
90
  return e.message
63
91
  end
64
92
 
93
+ # optimize specific index
94
+ #
95
+ # @return [String]
65
96
  def ft_optimize
66
97
  REDI_SEARCH.call('FT.OPTIMIZE', @@index_name)
67
98
  rescue Exception => e
@@ -69,6 +100,9 @@ module RediSearchRails
69
100
  return e.message
70
101
  end
71
102
 
103
+ # drop specific index
104
+ #
105
+ # @return [String]
72
106
  def ft_drop
73
107
  REDI_SEARCH.call('FT.DROP', @@index_name)
74
108
  rescue Exception => e
@@ -76,8 +110,11 @@ module RediSearchRails
76
110
  return e.message
77
111
  end
78
112
 
113
+ # get info about specific index
114
+ #
115
+ # @return [String]
79
116
  def ft_info
80
- ap REDI_SEARCH.call('FT.INFO', @@index_name)
117
+ REDI_SEARCH.call('FT.INFO', @@index_name)
81
118
  rescue Exception => e
82
119
  Rails.logger.error e
83
120
  return e.message
@@ -33,6 +33,7 @@ Gem::Specification.new do |spec|
33
33
  spec.add_development_dependency "bundler", "~> 1.14"
34
34
  spec.add_development_dependency "rake", "~> 10.0"
35
35
  spec.add_development_dependency "rspec", "~> 3.0"
36
+ spec.add_development_dependency "activemodel", "~> 5.0.0"
36
37
  # =>
37
38
  spec.add_runtime_dependency "activesupport", "~> 5.0.0"
38
39
  spec.add_runtime_dependency "redis", "~> 3.3"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redi_search_rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dmitry Polyakovsky
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-04-06 00:00:00.000000000 Z
11
+ date: 2017-04-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: activemodel
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 5.0.0
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 5.0.0
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: activesupport
57
71
  requirement: !ruby/object:Gem::Requirement