redisearch-rb 1.0.0 → 1.0.1

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
  SHA1:
3
- metadata.gz: ea52a309430c3f6fbed50c64e43e8a6158606584
4
- data.tar.gz: 0bcfe47c805b649f14cefed4772526f7004f2173
3
+ metadata.gz: 9df8fe8e4d7c7a3624eee798a3a495296e244a1c
4
+ data.tar.gz: 704632f558f90028067c76ca1ee994ea6d08d70e
5
5
  SHA512:
6
- metadata.gz: c3d38b1b71012fa9acd1bb7d14a7e71db16c7d840a3ec934f93f1167b5fb4e86440fc6be916ab17bfe77757b1f4617d2f25d92b490ef3eeed734177edf18605a
7
- data.tar.gz: 2f80306e5c404618a47ed90aee72c42e77ee343559f2ce54539ef4f74e61d575f3a851761c22ef6520994bde9a04d9ff84269da2da0560efa4d98f0f23d26666
6
+ metadata.gz: a9cb8486726435e3832f6b598e9cd8a3addde0623c5371db1d5bca9641d67d0189d2ca4c180aaf3ff53c2c63450930b00536b520668fcbb31e2ab7e7994f6275
7
+ data.tar.gz: 6a4d206b73dd350c6a240b805cbf82dcde7ca536492815b2ff6719a5b617ee73ed191e625bdadbfa68ac1cc3cd09e617c47a9a7c2889db3bc77c2c3fac074d34
data/README.md CHANGED
@@ -11,7 +11,7 @@ http://redisearch.io/
11
11
  First of all, you need to install RediSearch, if you haven't yet:
12
12
 
13
13
  1. Install Redis 4.0.1 or highger https://github.com/antirez/redis/releases/tag/4.0.1
14
- 2. Install RediSearch 1.0.4 or higher http://redisearch.io/Quick_Start/
14
+ 2. Install RediSearch 1.2.0 or higher http://redisearch.io/Quick_Start/
15
15
  3. Edit your `redis.conf` file and add a `loadmodule` directive to load the RediSearch module built in the step 2.
16
16
 
17
17
  To install this gem, add this line to your application's Gemfile:
@@ -43,7 +43,7 @@ In order to run the tests, it's necessary to set some env variables (see .env.ex
43
43
  ```ruby
44
44
  require 'redisearch-rb'
45
45
 
46
- redis = Redis.new(REDIS_URL)
46
+ redis = Redis.new(url: REDIS_URL)
47
47
  redisearch_client = RediSearch.new('test_idx', redis)
48
48
 
49
49
  schema = ['title', 'TEXT', 'WEIGHT', '2.0',
@@ -14,6 +14,7 @@ class RediSearch
14
14
 
15
15
  OPTIONS_FLAGS = {
16
16
  add: [:nosave, :replace, :partial],
17
+ addhash: [:replace],
17
18
  create: [:nooffsets, :nofreqs, :nohl, :nofields],
18
19
  del: [:dd],
19
20
  drop: [:keepdocs],
@@ -26,6 +27,7 @@ class RediSearch
26
27
  # { limit: ['0', '50'], sortby: ['year', 'desc'], return: ['2', 'title', 'year'] }
27
28
  OPTIONS_PARAMS = {
28
29
  add: [:language, :payload],
30
+ addhash: [:language],
29
31
  create: [:stopwords],
30
32
  search: [:filter, :return, :infields, :inkeys, :slop, :scorer, :sortby, :limit, :payload],
31
33
  sugget: [:max],
@@ -71,6 +73,7 @@ class RediSearch
71
73
  #
72
74
  # @param [String] doc_id id assigned to the document
73
75
  # @param [Array] fields name-value pairs to be indexed
76
+ # @param [Float] weight asigned by the user to the document
74
77
  # @param [Hash] opts optional parameters
75
78
  # Example:
76
79
  #
@@ -79,8 +82,8 @@ class RediSearch
79
82
  #
80
83
  # See http://redisearch.io/Commands/#ftadd
81
84
  # @return [String] "OK" on success
82
- def add_doc(doc_id, fields, opts = {})
83
- call(ft_add(doc_id, fields, opts))
85
+ def add_doc(doc_id, fields, opts = {}, weight = nil)
86
+ call(ft_add(doc_id, fields, opts, weight))
84
87
  end
85
88
 
86
89
  # Add a set of docs to the index. Uses redis `multi` to make a single bulk insert.
@@ -90,14 +93,30 @@ class RediSearch
90
93
  # Example:
91
94
  #
92
95
  # redisearch = RediSearch.new('my_idx')
93
- # docs = [['id_1', ['title', 'Lost in translation', 'director', 'Sofia Coppola'],
94
- # ['id_2', ['title', 'Ex Machina', 'director', 'Alex Garland']]
96
+ # docs = [['id_1', ['title', 'Lost in translation', 'director', 'Sofia Coppola'], 0.75],
97
+ # ['id_2', ['title', 'Ex Machina', 'director', 'Alex Garland'], 0.95]
95
98
  # redisearch.add_docs(docs)
96
99
  #
97
100
  # See http://redisearch.io/Commands/#ftadd
98
101
  # @return [String] "OK" on success
99
102
  def add_docs(docs, opts = {})
100
- docs.each { |doc_id, fields| call(ft_add(doc_id, fields, opts))}
103
+ docs.map { |doc_id, fields, weight| call(ft_add(doc_id, fields, opts, weight))}
104
+ end
105
+
106
+ # Adds a document to the index from an existing HASH key `doc_id` in Redis.
107
+ #
108
+ # @param [String] doc_id HASH key holding the fields that need to be indexed
109
+ # @param [Hash] opts optional parameters
110
+ # @param [Float]weight asigned by the user to the document
111
+ # Example:
112
+ #
113
+ # redisearch = RediSearch.new('my_idx')
114
+ # redisearch.add_hash('id_1', { weight: true })
115
+ #
116
+ # See http://redisearch.io/Commands/#ftadd
117
+ # @return [String] "OK" on success
118
+ def add_hash(doc_id, opts = {}, weight = nil)
119
+ call(ft_addhash(doc_id, opts, weight))
101
120
  end
102
121
 
103
122
  # Search the index with the given `query`
@@ -109,6 +128,16 @@ class RediSearch
109
128
  build_docs(call(ft_search(query, opts)), opts)
110
129
  end
111
130
 
131
+ # Fetch the contents of multiple documents
132
+ #
133
+ # @param [Array] doc_ids ids assigned to the document
134
+ # @return [Array] documents found for the ids given
135
+ def get_by_ids(doc_ids)
136
+ call(ft_mget(doc_ids)).map.with_index do |doc, i|
137
+ { 'id' => doc_ids[i] }.merge(Hash[*doc]) unless doc.empty?
138
+ end.compact
139
+ end
140
+
112
141
  # Fetch a document by id
113
142
  #
114
143
  # @param [String] doc_id id assigned to the document
@@ -233,7 +262,7 @@ class RediSearch
233
262
  ['FT.ADD', @idx_name , doc_id, weight || DEFAULT_WEIGHT, *serialize_options(opts, :add), 'FIELDS', *fields]
234
263
  end
235
264
 
236
- def ft_add_hash(doc_id, opts = {}, weight = nil)
265
+ def ft_addhash(doc_id, opts = {}, weight = nil)
237
266
  ['FT.ADDHASH', @idx_name , doc_id, weight || DEFAULT_WEIGHT, *serialize_options(opts, :add)]
238
267
  end
239
268
 
@@ -294,7 +323,7 @@ class RediSearch
294
323
  end
295
324
 
296
325
  def build_docs(results, opts = {})
297
- return {} if results.nil? || results[0] == 0
326
+ return [] if results.nil? || results[0] == 0
298
327
  results.shift
299
328
  score_offset = opts[:withscores] ? 1 : 0
300
329
  content_offset = opts[:nocontent] ? 0 : 1
@@ -1,3 +1,3 @@
1
1
  class RediSearch
2
- VERSION = '1.0.0'
2
+ VERSION = '1.0.1'
3
3
  end
@@ -84,6 +84,14 @@ class RediSearchTest < Minitest::Test
84
84
  assert_includes(search_result.to_s, 'Ex Machina')
85
85
  end
86
86
 
87
+ def test_add_hash
88
+ assert(@redisearch_client.create_index(@schema))
89
+ doc = ['title', 'Lost in translation', 'director', 'Sofia Coppola', 'year', '2004']
90
+ @redis_client.hmset('id_1', *doc)
91
+ assert(@redisearch_client.add_hash('id_1'))
92
+ assert_includes(@redis_client.call(['FT.SEARCH', 'test_idx', '@title:lost']).to_s, 'Lost in translation')
93
+ end
94
+
87
95
  def test_get_by_id
88
96
  assert(@redisearch_client.create_index(@schema))
89
97
  docs = [['id_1', ['title', 'Lost in translation', 'director', 'Sofia Coppola', 'year', '2004']],
@@ -94,6 +102,18 @@ class RediSearchTest < Minitest::Test
94
102
  assert_equal('Lost in translation', doc['title'])
95
103
  end
96
104
 
105
+ def test_get_by_ids
106
+ assert(@redisearch_client.create_index(@schema))
107
+ docs = [['id_1', ['title', 'Lost in translation', 'director', 'Sofia Coppola', 'year', '2004']],
108
+ ['id_2', ['title', 'Ex Machina', 'director', 'Alex Garland', 'year', '2014']]]
109
+ assert(@redisearch_client.add_docs(docs))
110
+ docs = @redisearch_client.get_by_ids(['id_1', 'id_2'])
111
+ assert_equal('id_1', docs[0]['id'])
112
+ assert_equal('Lost in translation', docs[0]['title'])
113
+ assert_equal('id_2', docs[1]['id'])
114
+ assert_equal('Ex Machina', docs[1]['title'])
115
+ end
116
+
97
117
  def test_search_simple_query
98
118
  assert(@redisearch_client.create_index(@schema))
99
119
  docs = [['id_1', ['title', 'Lost in translation', 'director', 'Sofia Coppola', 'year', '2004']],
@@ -104,6 +124,7 @@ class RediSearchTest < Minitest::Test
104
124
  assert matches.any? { |doc| 'Lost in translation' == doc['title'] }
105
125
  assert matches.any? { |doc| 'Ex Machina' == doc['title'] }
106
126
  matches.each { |doc| assert doc['score'].to_i > 0 }
127
+ assert_equal([], @redisearch_client.search('foobarwozzz'))
107
128
  end
108
129
 
109
130
  def test_search_field_selector
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redisearch-rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Victor Ruiz
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-11-27 00:00:00.000000000 Z
11
+ date: 2018-12-03 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: |-
14
14
  A simple Ruby client library for RediSearch.