redis-search 0.7.1 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.markdown CHANGED
@@ -13,6 +13,7 @@ High performance real-time search (Support Chinese), index in Redis for Rails ap
13
13
  * Real-time search
14
14
  * High performance
15
15
  * Segment words search and prefix match search
16
+ * Support match with alias
16
17
  * Support ActiveRecord and Mongoid
17
18
  * Sort results by one field
18
19
  * Homophone search, pinyin search
@@ -31,7 +32,7 @@ in Rails application Gemfile
31
32
  # add rmmseg if you need search by segment words
32
33
  gem 'rmmseg-cpp-huacnlee', '0.2.9'
33
34
  gem 'redis-namespace','~> 1.1.0'
34
- gem 'redis-search', '0.7.1'
35
+ gem 'redis-search', '0.8.0'
35
36
 
36
37
  install bundlers
37
38
 
@@ -7,11 +7,13 @@ class Redis
7
7
  # Config redis-search index for Model
8
8
  # == Params:
9
9
  # title_field Query field for Search
10
+ # alias_field Alias field for search, can accept multi field (String or Array type), it type is String, redis-search will split by comma
10
11
  # prefix_index_enable Is use prefix index search
11
12
  # ext_fields What kind fields do you need inlucde to search indexes
12
13
  # score_field Give a score for search sort, need Integer value, default is `created_at`
13
14
  def redis_search_index(options = {})
14
15
  title_field = options[:title_field] || :title
16
+ alias_field = options[:alias_field] || nil
15
17
  prefix_index_enable = options[:prefix_index_enable] || false
16
18
  ext_fields = options[:ext_fields] || []
17
19
  score_field = options[:score_field] || :created_at
@@ -33,9 +35,20 @@ class Redis
33
35
  end
34
36
  exts
35
37
  end
38
+
39
+ def redis_search_alias_value(field)
40
+ return [] if field.blank? or field == "_was"
41
+ val = instance_eval("self.\#{field}").clone
42
+ return [] if !val.class.in?([String,Array])
43
+ if val.is_a?(String)
44
+ val = val.to_s.split(",")
45
+ end
46
+ val
47
+ end
36
48
 
37
49
  def redis_search_index_create
38
50
  s = Search::Index.new(:title => self.#{title_field},
51
+ :aliases => self.redis_search_alias_value(#{alias_field.inspect}),
39
52
  :id => self.id,
40
53
  :exts => self.redis_search_fields_to_hash(#{ext_fields.inspect}),
41
54
  :type => self.class.to_s,
@@ -47,13 +60,25 @@ class Redis
47
60
  s = nil
48
61
  true
49
62
  end
63
+
64
+ def redis_search_index_delete(titles)
65
+ titles.uniq.each do |title|
66
+ Search::Index.remove(:id => self.id, :title => title, :type => self.class.to_s)
67
+ end
68
+ true
69
+ end
70
+
50
71
 
51
- before_destroy :redis_search_index_destroy
52
- def redis_search_index_destroy
53
- Search::Index.remove(:id => self.id, :title => self.#{title_field}, :type => self.class.to_s)
72
+ before_destroy do
73
+ titles = []
74
+ titles = redis_search_alias_value("#{alias_field}")
75
+ titles << self.#{title_field}
76
+
77
+ redis_search_index_delete(titles)
54
78
  true
55
79
  end
56
80
 
81
+
57
82
  def redis_search_index_need_reindex
58
83
  index_fields_changed = false
59
84
  #{ext_fields.inspect}.each do |f|
@@ -68,7 +93,10 @@ class Redis
68
93
  end
69
94
  end
70
95
  begin
71
- if(self.#{title_field}_changed?)
96
+ if self.#{title_field}_changed?
97
+ index_fields_changed = true
98
+ end
99
+ if self.#{alias_field || title_field}_changed?
72
100
  index_fields_changed = true
73
101
  end
74
102
  rescue
@@ -76,15 +104,12 @@ class Redis
76
104
  return index_fields_changed
77
105
  end
78
106
 
79
- after_update :redis_search_index_remove
80
- def redis_search_index_remove
81
- # DEBUG info
82
- # puts '>>>>>>>>>>>>>>>>>>>>>>'
83
- # puts self.redis_search_index_need_reindex
84
- # puts self.#{title_field}_was
85
- # puts self.#{title_field}
107
+ after_update do
86
108
  if self.redis_search_index_need_reindex
87
- Search::Index.remove(:id => self.id, :title => self.#{title_field}_was, :type => self.class.to_s)
109
+ titles = []
110
+ titles = redis_search_alias_value("#{alias_field}_was")
111
+ titles << self.#{title_field}_was
112
+ redis_search_index_delete(titles)
88
113
  end
89
114
  true
90
115
  end
@@ -1,17 +1,20 @@
1
1
  class Redis
2
2
  module Search
3
3
  class Index
4
- attr_accessor :type, :title, :id,:score, :exts, :condition_fields, :prefix_index_enable
4
+ attr_accessor :type, :title, :id,:score, :aliases, :exts, :condition_fields, :prefix_index_enable
5
5
  def initialize(options = {})
6
6
  # default data
7
7
  self.condition_fields = []
8
8
  self.exts = []
9
+ self.aliases = []
9
10
  self.prefix_index_enable = false
10
11
 
11
12
  # set attributes value from params
12
13
  options.keys.each do |k|
13
14
  eval("self.#{k} = options[k]")
14
15
  end
16
+ self.aliases << self.title
17
+ self.aliases.uniq!
15
18
  end
16
19
 
17
20
  def save
@@ -23,26 +26,26 @@ class Redis
23
26
 
24
27
  # 将原始数据存入 hashes
25
28
  res = Redis::Search.config.redis.hset(self.type, self.id, data.to_json)
26
- # 保存 sets 索引,以分词的单词为key,用于后面搜索,里面存储 ids
27
- words = Search::Index.split_words_for_index(self.title)
28
- return if words.blank?
29
- words.each do |word|
30
- key = Search.mk_sets_key(self.type,word)
31
- # word index for item id
32
- Redis::Search.config.redis.sadd(key, self.id)
33
- # score for search sort
34
- Redis::Search.config.redis.set(Search.mk_score_key(self.type,self.id),self.score)
35
- end
36
29
 
37
30
  # 将目前的编号保存到条件(conditions)字段所创立的索引上面
38
31
  self.condition_fields.each do |field|
39
32
  Redis::Search.config.redis.sadd(Search.mk_condition_key(self.type,field,data[field.to_sym]), self.id)
40
33
  end
41
-
42
- # 建立前最索引
43
- if prefix_index_enable
44
- save_prefix_index
45
- end
34
+
35
+ # score for search sort
36
+ Redis::Search.config.redis.set(Search.mk_score_key(self.type,self.id),self.score)
37
+
38
+ # 保存 sets 索引,以分词的单词为key,用于后面搜索,里面存储 ids
39
+ self.aliases.each do |val|
40
+ words = Search::Index.split_words_for_index(val)
41
+ return if words.blank?
42
+ words.each do |word|
43
+ Redis::Search.config.redis.sadd(Search.mk_sets_key(self.type,word), self.id)
44
+ end
45
+ end
46
+
47
+ # 建立前缀索引
48
+ save_prefix_index if prefix_index_enable
46
49
  end
47
50
 
48
51
  def self.remove(options = {})
@@ -50,8 +53,7 @@ class Redis
50
53
  Redis::Search.config.redis.hdel(type,options[:id])
51
54
  words = Search::Index.split_words_for_index(options[:title])
52
55
  words.each do |word|
53
- key = Search.mk_sets_key(type,word)
54
- Redis::Search.config.redis.srem(key, options[:id])
56
+ Redis::Search.config.redis.srem(Search.mk_sets_key(type,word), options[:id])
55
57
  Redis::Search.config.redis.del(Search.mk_score_key(type,options[:id]))
56
58
  end
57
59
 
@@ -70,23 +72,24 @@ class Redis
70
72
  end
71
73
 
72
74
  def save_prefix_index
73
- words = []
74
- words << self.title.downcase
75
- Redis::Search.config.redis.sadd(Search.mk_sets_key(self.type,self.title), self.id)
76
- if Search.config.pinyin_match
77
- pinyin = Pinyin.t(self.title.downcase,'')
78
- words << pinyin
79
- Redis::Search.config.redis.sadd(Search.mk_sets_key(self.type,pinyin), self.id)
80
- end
81
-
82
- words.each do |word|
75
+ self.aliases.each do |val|
76
+ words = []
77
+ words << val.downcase
78
+ Redis::Search.config.redis.sadd(Search.mk_sets_key(self.type,val), self.id)
79
+ if Search.config.pinyin_match
80
+ pinyin = Pinyin.t(val.downcase,'')
81
+ words << pinyin
82
+ Redis::Search.config.redis.sadd(Search.mk_sets_key(self.type,pinyin), self.id)
83
+ end
83
84
 
84
- key = Search.mk_complete_key(self.type)
85
- (1..(word.length)).each do |l|
86
- prefix = word[0...l]
87
- Redis::Search.config.redis.zadd(key, 0, prefix)
85
+ words.each do |word|
86
+ key = Search.mk_complete_key(self.type)
87
+ (1..(word.length)).each do |l|
88
+ prefix = word[0...l]
89
+ Redis::Search.config.redis.zadd(key, 0, prefix)
90
+ end
91
+ Redis::Search.config.redis.zadd(key, 0, word + "*")
88
92
  end
89
- Redis::Search.config.redis.zadd(key, 0, word + "*")
90
93
  end
91
94
  end
92
95
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redis-search
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.1
4
+ version: 0.8.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-03-30 00:00:00.000000000 Z
12
+ date: 2012-04-13 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: chinese_pinyin
16
- requirement: &70187052370880 !ruby/object:Gem::Requirement
16
+ requirement: &70259274984740 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,21 +21,21 @@ dependencies:
21
21
  version: 0.3.0
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70187052370880
24
+ version_requirements: *70259274984740
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: redis-namespace
27
- requirement: &70187052368920 !ruby/object:Gem::Requirement
27
+ requirement: &70259274983840 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
- - - ~>
30
+ - - ! '>='
31
31
  - !ruby/object:Gem::Version
32
32
  version: 1.0.2
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70187052368920
35
+ version_requirements: *70259274983840
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: redis
38
- requirement: &70187052364560 !ruby/object:Gem::Requirement
38
+ requirement: &70259274983120 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,7 +43,7 @@ dependencies:
43
43
  version: 2.1.1
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *70187052364560
46
+ version_requirements: *70259274983120
47
47
  description: High performance real-time search (Support Chinese), index in Redis for
48
48
  Rails application.
49
49
  email:
@@ -80,9 +80,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
80
80
  version: 1.3.6
81
81
  requirements: []
82
82
  rubyforge_project:
83
- rubygems_version: 1.8.11
83
+ rubygems_version: 1.8.10
84
84
  signing_key:
85
85
  specification_version: 3
86
86
  summary: High performance real-time search (Support Chinese), index in Redis for Rails
87
87
  application.
88
88
  test_files: []
89
+ has_rdoc: