redi_search 1.0.5 → 2.0.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/.rubocop.yml +0 -156
- data/.travis.yml +47 -15
- data/Appraisals +4 -8
- data/Gemfile +3 -4
- data/README.md +74 -73
- data/Rakefile +15 -3
- data/bin/console +36 -0
- data/gemfiles/{rails_6.gemfile → activerecord_51.gemfile} +1 -5
- data/gemfiles/{rails_51.gemfile → activerecord_52.gemfile} +1 -5
- data/lib/redi_search.rb +6 -7
- data/lib/redi_search/add.rb +9 -5
- data/lib/redi_search/{alter.rb → add_field.rb} +13 -5
- data/lib/redi_search/client.rb +8 -6
- data/lib/redi_search/client/response.rb +4 -0
- data/lib/redi_search/configuration.rb +1 -11
- data/lib/redi_search/create.rb +6 -4
- data/lib/redi_search/document.rb +5 -4
- data/lib/redi_search/document/display.rb +9 -9
- data/lib/redi_search/document/finder.rb +10 -2
- data/lib/redi_search/index.rb +9 -9
- data/lib/redi_search/lazily_load.rb +6 -11
- data/lib/redi_search/log_subscriber.rb +23 -52
- data/lib/redi_search/model.rb +43 -39
- data/lib/redi_search/schema.rb +3 -3
- data/lib/redi_search/schema/tag_field.rb +1 -1
- data/lib/redi_search/schema/text_field.rb +1 -1
- data/lib/redi_search/search.rb +12 -25
- data/lib/redi_search/search/clauses.rb +6 -7
- data/lib/redi_search/search/clauses/application_clause.rb +20 -5
- data/lib/redi_search/search/clauses/boolean.rb +5 -5
- data/lib/redi_search/search/clauses/highlight.rb +18 -2
- data/lib/redi_search/search/clauses/limit.rb +7 -5
- data/lib/redi_search/search/clauses/return.rb +1 -1
- data/lib/redi_search/search/clauses/slop.rb +1 -1
- data/lib/redi_search/search/clauses/sort_by.rb +1 -1
- data/lib/redi_search/search/clauses/where.rb +10 -2
- data/lib/redi_search/search/result.rb +9 -9
- data/lib/redi_search/search/term.rb +7 -6
- data/lib/redi_search/spellcheck.rb +3 -4
- data/lib/redi_search/spellcheck/result.rb +1 -1
- data/lib/redi_search/validatable.rb +49 -0
- data/lib/redi_search/validations/inclusion.rb +26 -0
- data/lib/redi_search/validations/numericality.rb +45 -0
- data/lib/redi_search/validations/presence.rb +29 -0
- data/lib/redi_search/version.rb +1 -1
- data/redi_search.gemspec +0 -2
- metadata +9 -41
- data/bin/test +0 -7
- data/gemfiles/rails_52.gemfile +0 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dcdb3e3aebb8594a2cb2f927576bc7aba11a0a8df65bc0cbbbc180a73c77abd0
|
4
|
+
data.tar.gz: ec7beac2eb361645edefae2f6ae2606dc464c9867044a6995fddf17f3c72238f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 44ee5394b472b68d3a07871ccd43512a671edf90a915359d1df168fee72f5c8300d6b2fbcfd4c8dc5c37f099d18bc4c86df5ad40218d79138b2a13494d160c9f
|
7
|
+
data.tar.gz: c5ab674e0e0dea86814c4350ae0227ca105d4eacada549d084f150799f692ce8874008e47f7a2ed8035d22852f04efc20bac18c476c2bacbe52afc977cae7474
|
data/.rubocop.yml
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
require:
|
2
2
|
- rubocop-performance
|
3
|
-
- rubocop-rails
|
4
3
|
AllCops:
|
5
4
|
Exclude:
|
6
5
|
- vendor/**/*
|
@@ -873,161 +872,6 @@ Performance/UriDefaultParser:
|
|
873
872
|
Description: Use `URI::DEFAULT_PARSER` instead of `URI::Parser.new`.
|
874
873
|
Enabled: true
|
875
874
|
|
876
|
-
# Department Rails
|
877
|
-
Rails/ActionFilter:
|
878
|
-
Description: Enforces consistent use of action filter methods.
|
879
|
-
Enabled: false
|
880
|
-
|
881
|
-
Rails/ApplicationJob:
|
882
|
-
Description: Check that jobs subclass ApplicationJob.
|
883
|
-
Enabled: true
|
884
|
-
|
885
|
-
Rails/ApplicationRecord:
|
886
|
-
Description: Check that models subclass ApplicationRecord.
|
887
|
-
Enabled: true
|
888
|
-
|
889
|
-
Rails/ActiveSupportAliases:
|
890
|
-
Description: 'Avoid ActiveSupport aliases of standard ruby methods: `String#starts_with?`, `String#ends_with?`, `Array#append`, `Array#prepend`.'
|
891
|
-
Enabled: true
|
892
|
-
|
893
|
-
Rails/Blank:
|
894
|
-
Description: Enforce using `blank?` and `present?`.
|
895
|
-
Enabled: true
|
896
|
-
NilOrEmpty: true
|
897
|
-
NotPresent: true
|
898
|
-
UnlessPresent: true
|
899
|
-
|
900
|
-
Rails/Date:
|
901
|
-
Description: Checks the correct usage of date aware methods, such as Date.today, Date.current etc.
|
902
|
-
Enabled: true
|
903
|
-
|
904
|
-
Rails/Delegate:
|
905
|
-
Description: Prefer delegate method for delegations.
|
906
|
-
Enabled: true
|
907
|
-
|
908
|
-
Rails/DelegateAllowBlank:
|
909
|
-
Description: Do not use allow_blank as an option to delegate.
|
910
|
-
Enabled: true
|
911
|
-
|
912
|
-
Rails/DynamicFindBy:
|
913
|
-
Description: Use `find_by` instead of dynamic `find_by_*`.
|
914
|
-
StyleGuide: https://github.com/bbatsov/rails-style-guide#find_by
|
915
|
-
Enabled: true
|
916
|
-
|
917
|
-
Rails/EnumUniqueness:
|
918
|
-
Description: Avoid duplicate integers in hash-syntax `enum` declaration.
|
919
|
-
Enabled: true
|
920
|
-
|
921
|
-
Rails/Exit:
|
922
|
-
Description: Favor `fail`, `break`, `return`, etc. over `exit` in application or library code outside of Rake files to avoid exits during unit testing or running in production.
|
923
|
-
Enabled: true
|
924
|
-
|
925
|
-
Rails/FilePath:
|
926
|
-
Description: Use `Rails.root.join` for file path joining.
|
927
|
-
Enabled: true
|
928
|
-
|
929
|
-
Rails/FindBy:
|
930
|
-
Description: Prefer find_by over where.first.
|
931
|
-
StyleGuide: https://github.com/bbatsov/rails-style-guide#find_by
|
932
|
-
Enabled: true
|
933
|
-
|
934
|
-
Rails/FindEach:
|
935
|
-
Description: Prefer all.find_each over all.find.
|
936
|
-
StyleGuide: https://github.com/bbatsov/rails-style-guide#find-each
|
937
|
-
Enabled: true
|
938
|
-
|
939
|
-
Rails/HasAndBelongsToMany:
|
940
|
-
Description: Prefer has_many :through to has_and_belongs_to_many.
|
941
|
-
StyleGuide: https://github.com/bbatsov/rails-style-guide#has-many-through
|
942
|
-
Enabled: true
|
943
|
-
|
944
|
-
Rails/HasManyOrHasOneDependent:
|
945
|
-
Description: Define the dependent option to the has_many and has_one associations.
|
946
|
-
StyleGuide: https://github.com/bbatsov/rails-style-guide#has_many-has_one-dependent-option
|
947
|
-
Enabled: true
|
948
|
-
|
949
|
-
Rails/HttpPositionalArguments:
|
950
|
-
Description: Use keyword arguments instead of positional arguments in http method calls.
|
951
|
-
Enabled: true
|
952
|
-
|
953
|
-
Rails/NotNullColumn:
|
954
|
-
Description: Do not add a NOT NULL column without a default value
|
955
|
-
Enabled: true
|
956
|
-
|
957
|
-
Rails/Output:
|
958
|
-
Description: Checks for calls to puts, print, etc.
|
959
|
-
Enabled: true
|
960
|
-
|
961
|
-
Rails/OutputSafety:
|
962
|
-
Description: The use of `html_safe` or `raw` may be a security risk.
|
963
|
-
Enabled: true
|
964
|
-
|
965
|
-
Rails/PluralizationGrammar:
|
966
|
-
Description: Checks for incorrect grammar when using methods like `3.day.ago`.
|
967
|
-
Enabled: true
|
968
|
-
|
969
|
-
Rails/Present:
|
970
|
-
Description: Enforce using `blank?` and `present?`.
|
971
|
-
Enabled: true
|
972
|
-
NotNilAndNotEmpty: true
|
973
|
-
NotBlank: true
|
974
|
-
UnlessBlank: true
|
975
|
-
|
976
|
-
Rails/ReadWriteAttribute:
|
977
|
-
Description: Checks for read_attribute(:attr) and write_attribute(:attr, val).
|
978
|
-
StyleGuide: https://github.com/bbatsov/rails-style-guide#read-attribute
|
979
|
-
Enabled: false
|
980
|
-
|
981
|
-
Rails/RelativeDateConstant:
|
982
|
-
Description: Do not assign relative date to constants.
|
983
|
-
Enabled: true
|
984
|
-
|
985
|
-
Rails/RequestReferer:
|
986
|
-
Description: Use consistent syntax for request.referer.
|
987
|
-
Enabled: true
|
988
|
-
|
989
|
-
Rails/ReversibleMigration:
|
990
|
-
Description: Checks whether the change method of the migration file is reversible.
|
991
|
-
StyleGuide: https://github.com/bbatsov/rails-style-guide#reversible-migration
|
992
|
-
Reference: http://api.rubyonrails.org/classes/ActiveRecord/Migration/CommandRecorder.html
|
993
|
-
Enabled: true
|
994
|
-
|
995
|
-
Rails/SafeNavigation:
|
996
|
-
Description: Use Ruby's safe navigation operator (`&.`) instead of `try!`
|
997
|
-
Enabled: true
|
998
|
-
|
999
|
-
Rails/SaveBang:
|
1000
|
-
Description: Identifies possible cases where Active Record save! or related should be used.
|
1001
|
-
StyleGuide: https://github.com/bbatsov/rails-style-guide#save-bang
|
1002
|
-
Enabled: false
|
1003
|
-
|
1004
|
-
Rails/ScopeArgs:
|
1005
|
-
Description: Checks the arguments of ActiveRecord scopes.
|
1006
|
-
Enabled: true
|
1007
|
-
|
1008
|
-
Rails/TimeZone:
|
1009
|
-
Description: Checks the correct usage of time zone aware methods.
|
1010
|
-
StyleGuide: https://github.com/bbatsov/rails-style-guide#time
|
1011
|
-
Reference: http://danilenko.org/2012/7/6/rails_timezones
|
1012
|
-
Enabled: true
|
1013
|
-
|
1014
|
-
Rails/UniqBeforePluck:
|
1015
|
-
Description: Prefer the use of uniq or distinct before pluck.
|
1016
|
-
Enabled: true
|
1017
|
-
|
1018
|
-
Rails/UnknownEnv:
|
1019
|
-
Description: Use correct environment name.
|
1020
|
-
Enabled: true
|
1021
|
-
|
1022
|
-
Rails/SkipsModelValidations:
|
1023
|
-
Description: Use methods that skips model validations with caution. See reference for more information.
|
1024
|
-
Reference: http://guides.rubyonrails.org/active_record_validations.html#skipping-validations
|
1025
|
-
Enabled: true
|
1026
|
-
|
1027
|
-
Rails/Validation:
|
1028
|
-
Description: Use validates :attribute, hash of validations.
|
1029
|
-
Enabled: true
|
1030
|
-
|
1031
875
|
# Department Security
|
1032
876
|
Security/Eval:
|
1033
877
|
Description: The use of eval represents a serious security risk.
|
data/.travis.yml
CHANGED
@@ -9,23 +9,55 @@ cache:
|
|
9
9
|
- gemfiles/vendor/bundle
|
10
10
|
- /home/travis/.rvm/
|
11
11
|
services: docker
|
12
|
-
before_script:
|
13
|
-
- curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
|
14
|
-
- chmod +x ./cc-test-reporter
|
15
|
-
- ./cc-test-reporter before-build
|
16
|
-
before_install:
|
17
|
-
- docker run -d -p 6379:6379 redislabs/redisearch:latest --protected-mode no --loadmodule /usr/lib/redis/modules/redisearch.so
|
18
|
-
after_script:
|
19
|
-
- if [[ "$TRAVIS_TEST_RESULT" == 0 ]]; then ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT; fi
|
20
|
-
rvm:
|
21
|
-
- 2.6
|
22
|
-
- 2.5
|
23
|
-
gemfile:
|
24
|
-
- gemfiles/rails_6.gemfile
|
25
|
-
- gemfiles/rails_52.gemfile
|
26
|
-
- gemfiles/rails_51.gemfile
|
27
12
|
jobs:
|
28
13
|
include:
|
14
|
+
- stage: Integration Tests
|
15
|
+
script: |
|
16
|
+
docker run -d -p 6379:6379 redislabs/redisearch:1.4.12 --protected-mode no --loadmodule /usr/lib/redis/modules/redisearch.so
|
17
|
+
bundle exec rake test:integration
|
18
|
+
rvm: 2.6
|
19
|
+
gemfile: Gemfile
|
20
|
+
name: RediSearch 1.4.12
|
21
|
+
- stage: Integration Tests
|
22
|
+
script: |
|
23
|
+
docker run -d -p 6379:6379 redislabs/redisearch:1.4.11 --protected-mode no --loadmodule /usr/lib/redis/modules/redisearch.so
|
24
|
+
bundle exec rake test:integration
|
25
|
+
rvm: 2.6
|
26
|
+
gemfile: Gemfile
|
27
|
+
name: RediSearch 1.4.11
|
28
|
+
- stage: Integration Tests
|
29
|
+
script: |
|
30
|
+
docker run -d -p 6379:6379 redislabs/redisearch:1.4.10 --protected-mode no --loadmodule /usr/lib/redis/modules/redisearch.so
|
31
|
+
bundle exec rake test:integration
|
32
|
+
rvm: 2.6
|
33
|
+
gemfile: Gemfile
|
34
|
+
name: RediSearch 1.4.10
|
35
|
+
- stage: Unit Tests
|
36
|
+
script: |
|
37
|
+
curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
|
38
|
+
chmod +x ./cc-test-reporter
|
39
|
+
./cc-test-reporter before-build
|
40
|
+
bundle exec rake test:unit
|
41
|
+
if [[ "$TRAVIS_TEST_RESULT" == 0 ]]; then ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT; fi
|
42
|
+
rvm: 2.6
|
43
|
+
gemfile: Gemfile
|
44
|
+
name: Ruby 2.6 and Rails 6.0rc2
|
45
|
+
- stage: Unit Tests
|
46
|
+
script: bundle exec rake test:unit
|
47
|
+
rvm: 2.6
|
48
|
+
gemfile: gemfiles/activerecord_52.gemfile
|
49
|
+
name: Ruby 2.6 and Rails 5.2
|
50
|
+
- stage: Unit Tests
|
51
|
+
script: bundle exec rake test:unit
|
52
|
+
rvm: 2.6
|
53
|
+
gemfile: gemfiles/activerecord_51.gemfile
|
54
|
+
name: Ruby 2.6 and Rails 5.1
|
55
|
+
- stage: Unit Tests
|
56
|
+
script: bundle exec rake test:unit
|
57
|
+
rvm: 2.5
|
58
|
+
gemfile: Gemfile
|
59
|
+
name: Ruby 2.5 and Rails 6.0rc2
|
29
60
|
- stage: Lint
|
30
61
|
script: bundle exec rubocop --config=./.rubocop.yml
|
31
62
|
rvm: 2.6
|
63
|
+
name: Rubocop
|
data/Appraisals
CHANGED
@@ -1,13 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
appraise "
|
4
|
-
gem "
|
3
|
+
appraise "activerecord-52" do
|
4
|
+
gem "activerecord", "< 6.0", ">= 5.2"
|
5
5
|
end
|
6
6
|
|
7
|
-
appraise "
|
8
|
-
gem "
|
9
|
-
end
|
10
|
-
|
11
|
-
appraise "rails-51" do
|
12
|
-
gem "rails", "< 5.2", ">= 5.1"
|
7
|
+
appraise "activerecord-51" do
|
8
|
+
gem "activerecord", "< 5.2", ">= 5.1"
|
13
9
|
end
|
data/Gemfile
CHANGED
@@ -2,18 +2,17 @@
|
|
2
2
|
|
3
3
|
source "https://rubygems.org"
|
4
4
|
|
5
|
-
git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
|
5
|
+
git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
|
6
6
|
|
7
7
|
gemspec
|
8
8
|
|
9
|
+
gem "appraisal", "~> 2.2"
|
9
10
|
gem "faker"
|
10
11
|
gem "mocha"
|
11
12
|
gem "pry"
|
12
|
-
gem "pry-rails"
|
13
13
|
gem "rubocop"
|
14
14
|
gem "rubocop-performance"
|
15
|
-
gem "rubocop-rails"
|
16
15
|
gem "simplecov"
|
17
16
|
gem "sqlite3"
|
18
17
|
|
19
|
-
gem "
|
18
|
+
gem "activerecord", "6.0.0.rc2"
|
data/README.md
CHANGED
@@ -24,11 +24,13 @@ macOS or Linux you can install via Homebrew.
|
|
24
24
|
|
25
25
|
To install RediSearch check out,
|
26
26
|
[https://oss.redislabs.com/redisearch/Quick_Start.html](https://oss.redislabs.com/redisearch/Quick_Start.html).
|
27
|
-
Once you have RediSearch built, you
|
28
|
-
load the
|
29
|
-
the redis.conf file can be found
|
27
|
+
Once you have RediSearch built, if you are not using Docker, you can update your
|
28
|
+
redis.conf file to always load the RediSearch module with
|
29
|
+
`loadmodule /path/to/redisearch.so`. (On macOS the redis.conf file can be found
|
30
|
+
at `/usr/local/etc/redis.conf`)
|
30
31
|
|
31
|
-
After Redis and RediSearch are up and running, add
|
32
|
+
After Redis and RediSearch are up and running, add the following line to your
|
33
|
+
Gemfile:
|
32
34
|
|
33
35
|
```ruby
|
34
36
|
gem 'redi_search'
|
@@ -51,7 +53,7 @@ require 'redi_search'
|
|
51
53
|
|
52
54
|
Once the gem is installed and required you'll need to configure it with your
|
53
55
|
Redis configuration. If you're on Rails, this should go in an initializer
|
54
|
-
(`config/initializers/redi_search.rb`)
|
56
|
+
(`config/initializers/redi_search.rb`).
|
55
57
|
|
56
58
|
```ruby
|
57
59
|
RediSearch.configure do |config|
|
@@ -74,7 +76,7 @@ end
|
|
74
76
|
|
75
77
|
## Preface
|
76
78
|
RediSearch revolves around a search index, so lets start with
|
77
|
-
defining what a search index is. According to [
|
79
|
+
defining what a search index is. According to [Swiftype](https://swiftype.com):
|
78
80
|
> A search index is a body of structured data that a search engine refers to
|
79
81
|
> when looking for results that are relevant to a specific query. Indexes are a
|
80
82
|
> critical piece of any search system, since they must be tailored to the
|
@@ -244,38 +246,38 @@ With no options: `{ place: :geo }`
|
|
244
246
|
|
245
247
|
A `Document` is the Ruby representation of a RediSearch document.
|
246
248
|
|
247
|
-
You can fetch a `Document` using `.get` or
|
248
|
-
- `get(index, document_id)` fetches a single
|
249
|
-
`document_id`.
|
249
|
+
You can fetch a `Document` using `.get` or `.mget` class methods.
|
250
|
+
- `get(index, document_id)` fetches a single `Document` in an `Index` for a
|
251
|
+
given `document_id`.
|
250
252
|
- `mget(index, *document_ids)` fetches a collection of `Document`s
|
251
253
|
in an `Index` for the given `document_ids`.
|
252
254
|
|
253
255
|
You can also make a `Document` instance using the
|
254
256
|
`.for_object(index, record, serializer: nil, only: [])` class method. It takes
|
255
|
-
an `Index` instance and a
|
256
|
-
fields specified in the
|
257
|
-
the object and responds to all the fields specified in the
|
258
|
-
`only` accepts an array of fields from the schema and limits the
|
259
|
-
passed to the `Document`.
|
257
|
+
an `Index` instance and a Ruby object. That object must respond to all the
|
258
|
+
fields specified in the `Index`'s `Schema` or pass a serializer class that
|
259
|
+
accepts the object and responds to all the fields specified in the `Index`'s
|
260
|
+
`Schema`. `only` accepts an array of fields from the schema and limits the
|
261
|
+
fields that are passed to the `Document`.
|
260
262
|
|
261
263
|
Once you have an instance of a `Document`, it responds to all the fields
|
262
|
-
specified in the
|
263
|
-
automatically prepended with the
|
264
|
-
uniqueness. We prepend the
|
265
|
-
same id in different
|
266
|
-
There is also a `#document_id_without_index` method
|
267
|
-
index name.
|
264
|
+
specified in the `Index`'s `Schema` as methods and `document_id`. `document_id`
|
265
|
+
is automatically prepended with the `Index`'s names unless it already is to
|
266
|
+
ensure uniqueness. We prepend the `Index` name because if you have two
|
267
|
+
`Document`s with the same id in different `Index`s we don't want the `Document`s
|
268
|
+
to override each other. There is also a `#document_id_without_index` method
|
269
|
+
which removes the prepended index name.
|
268
270
|
|
269
|
-
Finally there is a `#del` method that will remove the
|
270
|
-
It optionally accepts a `delete_document` named argument that signifies
|
271
|
-
the
|
272
|
-
|
271
|
+
Finally there is a `#del` method that will remove the `Document` from the
|
272
|
+
`Index`. It optionally accepts a `delete_document` named argument that signifies
|
273
|
+
whether the `Document` should be completely removed from the Redis instance vs
|
274
|
+
just the `Index`.
|
273
275
|
|
274
276
|
|
275
277
|
## Index
|
276
278
|
|
277
|
-
To initialize an
|
278
|
-
|
279
|
+
To initialize an `Index`, pass the name of the `Index` as a string or symbol
|
280
|
+
and the `Schema`.
|
279
281
|
|
280
282
|
```ruby
|
281
283
|
RediSearch::Index.new(name_of_index, schema)
|
@@ -291,7 +293,7 @@ RediSearch::Index.new(name_of_index, schema)
|
|
291
293
|
- For efficiency, RediSearch encodes indexes differently if they are
|
292
294
|
created with less than 32 text fields. This option forces RediSearch
|
293
295
|
to encode indexes as if there were more than 32 text fields, which
|
294
|
-
allows you to add additional fields (beyond 32) using `
|
296
|
+
allows you to add additional fields (beyond 32) using `add_field`.
|
295
297
|
- `no_offsets: #{true || false}`
|
296
298
|
- If set, we do not store term offsets for documents (saves memory, does
|
297
299
|
not allow exact searches or highlighting). Implies `no_highlight`.
|
@@ -313,40 +315,40 @@ RediSearch::Index.new(name_of_index, schema)
|
|
313
315
|
memory but does not allow sorting based on the frequencies of a given
|
314
316
|
term within the document.
|
315
317
|
- `drop`
|
316
|
-
- Drops the
|
318
|
+
- Drops the `Index` from the Redis instance, returns a boolean. Has an
|
317
319
|
accompanying bang method that will raise an exception upon failure. Will
|
318
|
-
return `false` if the
|
320
|
+
return `false` if the `Index` has already been dropped.
|
319
321
|
- `exist?`
|
320
|
-
- Returns a boolean signifying
|
322
|
+
- Returns a boolean signifying `Index` existence.
|
321
323
|
- `info`
|
322
|
-
- Returns a struct object with all the information about the
|
324
|
+
- Returns a struct object with all the information about the `Index`.
|
323
325
|
- `fields`
|
324
|
-
- Returns an array of the field names in the
|
326
|
+
- Returns an array of the field names in the `Index`.
|
325
327
|
- `add(document, score: 1.0, replace: {}, language: nil, no_save: false)`
|
326
328
|
- Takes a `Document` object and options. Has an
|
327
329
|
accompanying bang method that will raise an exception upon failure.
|
328
|
-
- `score` -> The
|
330
|
+
- `score` -> The `Document`'s rank, a value between 0.0 and 1.0
|
329
331
|
- `language` -> Use a stemmer for the supplied language during indexing.
|
330
|
-
- `no_save` -> Don't save the actual
|
332
|
+
- `no_save` -> Don't save the actual `Document` in the database and only index it.
|
331
333
|
- `replace` -> Accepts a boolean or a hash. If a truthy value is passed, we
|
332
334
|
will do an UPSERT style insertion - and delete an older version of the
|
333
|
-
|
335
|
+
`Document` if it exists.
|
334
336
|
- `replace: { partial: true }` -> Allows you to not have to specify all
|
335
337
|
fields for reindexing. Fields not given to the command will be loaded from
|
336
|
-
the current version of the
|
337
|
-
- `add_multiple
|
338
|
+
the current version of the `Document`.
|
339
|
+
- `add_multiple(documents, score: 1.0, replace: {}, language: nil, no_save: false)`
|
338
340
|
- Takes an array of `Document` objects. This provides a more performant way to
|
339
|
-
add multiple documents to the
|
341
|
+
add multiple documents to the `Index`. Accepts the same options as `add`.
|
340
342
|
- `del(document, delete_document: false)`
|
341
|
-
- Removes a
|
342
|
-
|
343
|
-
|
343
|
+
- Removes a `Document` from the `Index`. `delete_document` signifies whether the
|
344
|
+
`Document` should be completely removed from the Redis instance vs just the
|
345
|
+
`Index`.
|
344
346
|
- `document_count`
|
345
|
-
- Returns the number of
|
346
|
-
- `
|
347
|
-
- Adds a new field to the
|
347
|
+
- Returns the number of `Document`s in the `Index`
|
348
|
+
- `add_field(field_name, schema)`
|
349
|
+
- Adds a new field to the `Index`. Ex: `index.add_field(:first_name, text: { phonetic: "dm:en" })`
|
348
350
|
- `reindex(documents, recreate: false, **options)`
|
349
|
-
- If `recreate` is `true` the
|
351
|
+
- If `recreate` is `true` the `Index` will be dropped and recreated
|
350
352
|
- `options` accepts the same options as `add`
|
351
353
|
|
352
354
|
|
@@ -354,8 +356,7 @@ RediSearch::Index.new(name_of_index, schema)
|
|
354
356
|
|
355
357
|
Searching is initiated off a `RediSearch::Index` instance with clauses that can
|
356
358
|
be chained together. When searching, an array of `Document`s is returned
|
357
|
-
which has public reader methods for all the schema fields
|
358
|
-
method which returns the id of the document prefixed with the index name.
|
359
|
+
which has public reader methods for all the schema fields.
|
359
360
|
|
360
361
|
```ruby
|
361
362
|
main ❯ index = RediSearch::Index.new("user_idx", name: { text: { phonetic: "dm:en" } })
|
@@ -440,15 +441,15 @@ index.search.where(number: -Float::INFINITY..0)
|
|
440
441
|
phrase terms. (i.e the slop for exact phrases is 0)
|
441
442
|
- `in_order`
|
442
443
|
- Usually used in conjunction with `slop`. We make sure the query terms appear
|
443
|
-
in the same order in the
|
444
|
-
between them.
|
444
|
+
in the same order in the `Document` as in the query, regardless of the
|
445
|
+
offsets between them.
|
445
446
|
- `no_content`
|
446
|
-
- Only return the
|
447
|
-
RediSearch is being used on a Rails model where the
|
448
|
-
don't matter and it's being converted into ActiveRecord objects.
|
447
|
+
- Only return the `Document` ids and not the content. This is useful if
|
448
|
+
RediSearch is being used on a Rails model where the `Document` attributes
|
449
|
+
don't matter and it's being converted into `ActiveRecord` objects.
|
449
450
|
- `language(language)`
|
450
451
|
- Stemmer to use for the supplied language during search for query expansion.
|
451
|
-
If querying
|
452
|
+
If querying `Document`s in Chinese, this should be set to chinese in order to
|
452
453
|
properly tokenize the query terms. If an unsupported language is sent, the
|
453
454
|
command returns an error.
|
454
455
|
- `sort_by(field, order: :asc)`
|
@@ -459,7 +460,7 @@ index.search.where(number: -Float::INFINITY..0)
|
|
459
460
|
- Limit the results to the specified `num` at the `offset`. The default limit
|
460
461
|
is set to `10`.
|
461
462
|
- `count`
|
462
|
-
- Returns the number of
|
463
|
+
- Returns the number of `Document`s found in the search query
|
463
464
|
- `highlight(fields: [], opening_tag: "<b>", closing_tag: "</b>")`
|
464
465
|
- Use this option to format occurrences of matched text. `fields` are an
|
465
466
|
array of fields to be highlighted.
|
@@ -469,16 +470,14 @@ index.search.where(number: -Float::INFINITY..0)
|
|
469
470
|
- `no_stop_words`
|
470
471
|
- Do not filter stopwords from the query.
|
471
472
|
- `with_scores`
|
472
|
-
- Include the relative internal score of each
|
473
|
+
- Include the relative internal score of each `Document`. This can be used to
|
473
474
|
merge results from multiple instances. This will add a `score` method to the
|
474
475
|
returned `Document` instances.
|
475
476
|
- `return(*fields)`
|
476
|
-
- Limit which fields from the
|
477
|
+
- Limit which fields from the `Document` are returned.
|
477
478
|
- `explain`
|
478
479
|
- Returns the execution plan for a complex query. In the returned response,
|
479
480
|
a + on a term is an indication of stemming.
|
480
|
-
- `to_redis`
|
481
|
-
- Returns the command to be executed without executing it.
|
482
481
|
|
483
482
|
|
484
483
|
## Spellcheck
|
@@ -507,8 +506,8 @@ main ❯ index.spellcheck("jimy", distance: 2).first.suggestions
|
|
507
506
|
|
508
507
|
## Rails Integration
|
509
508
|
|
510
|
-
Integration with Rails is super easy! Call `redi_search` with the schema
|
511
|
-
|
509
|
+
Integration with Rails is super easy! Call `redi_search` with the `schema`
|
510
|
+
keyword argument from inside your model. Ex:
|
512
511
|
|
513
512
|
```ruby
|
514
513
|
class User < ApplicationRecord
|
@@ -522,8 +521,9 @@ end
|
|
522
521
|
This will automatically add `User.search` and `User.spellcheck`
|
523
522
|
methods which behave the same as if you called them on an `Index` instance.
|
524
523
|
|
525
|
-
`User.reindex(only: [], **options)` is also added and behaves similarly to
|
526
|
-
|
524
|
+
`User.reindex(only: [], **options)` is also added and behaves similarly to
|
525
|
+
`RediSearch::Index#reindex`. Some of the differences include:
|
526
|
+
- By default, does an upsert for all `Document`s added using the
|
527
527
|
option `replace: { partial: true }`.
|
528
528
|
- `Document`s do not to be passed as the first parameter. The `search_import`
|
529
529
|
scope is automatically called and all the records are converted
|
@@ -552,8 +552,8 @@ class UserSerializer < SimpleDelegator
|
|
552
552
|
end
|
553
553
|
```
|
554
554
|
|
555
|
-
You can
|
556
|
-
it can be used to limit the records to index.
|
555
|
+
You can override the `search_import` scope on the model to eager load
|
556
|
+
relationships when indexing or it can be used to limit the records to index.
|
557
557
|
|
558
558
|
```ruby
|
559
559
|
class User < ApplicationRecord
|
@@ -561,7 +561,7 @@ class User < ApplicationRecord
|
|
561
561
|
end
|
562
562
|
```
|
563
563
|
|
564
|
-
The default
|
564
|
+
The default `Index` name for model `Index`s is
|
565
565
|
`#{model_name.plural}_#{RediSearch.env}`. The `redi_search` method takes an
|
566
566
|
optional `index_prefix` argument which gets prepended to the index name:
|
567
567
|
|
@@ -578,15 +578,16 @@ User.redi_search_index.name
|
|
578
578
|
```
|
579
579
|
|
580
580
|
When integrating RediSearch into a model, records will automatically be indexed
|
581
|
-
after creating and updating and will be removed from the
|
581
|
+
after creating and updating and will be removed from the `Index` upon
|
582
|
+
destruction.
|
582
583
|
|
583
|
-
There are few more convenience methods that are publicly available:
|
584
|
+
There are a few more convenience methods that are publicly available:
|
584
585
|
- `redi_search_document`
|
585
586
|
- Returns the record as a `RediSearch::Document` instance
|
586
587
|
- `redi_search_delete_document`
|
587
|
-
- Removes the record from the
|
588
|
+
- Removes the record from the `Index`
|
588
589
|
- `redi_search_add_document`
|
589
|
-
- Adds the record to the
|
590
|
+
- Adds the record to the `Index`
|
590
591
|
- `redi_search_index`
|
591
592
|
- Returns the `RediSearch::Index` instance
|
592
593
|
|
@@ -594,15 +595,15 @@ There are few more convenience methods that are publicly available:
|
|
594
595
|
## Development
|
595
596
|
|
596
597
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run
|
597
|
-
`rake test` to run the
|
598
|
-
|
599
|
-
|
598
|
+
`rake test` to run the both unit and integration tests. To run them individually
|
599
|
+
you can run `rake test:unit` or `rake test:integration`. You can also run
|
600
|
+
`bin/console` for an interactive prompt that will allow you to experiment.
|
600
601
|
|
601
602
|
To install this gem onto your local machine, run `bundle exec rake install`. To
|
602
603
|
release a new version, execute `bin/publish (major|minor|patch)` which will
|
603
604
|
update the version number in `version.rb`, create a git tag for the version,
|
604
605
|
push git commits and tags, and push the `.gem` file to
|
605
|
-
[rubygems.org](https://rubygems.org).
|
606
|
+
[rubygems.org](https://rubygems.org) and GitHub.
|
606
607
|
|
607
608
|
## Contributing
|
608
609
|
|