easy_solr 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 8c744f500b1cbe59b2add0bf1b26a6e1c0a7439a
4
+ data.tar.gz: f2bda1c3ab56b50d9ec333a599654f92c33e6e8d
5
+ SHA512:
6
+ metadata.gz: 6bfa181cf8ed35aa05ff1676ebacd02a19915ff8dbb60cad11180a05ecb833a9c3c2fd2736a01376500a2f8c6b0fbb282c3e08ed7184c92fa6e74b58b2a7aea1
7
+ data.tar.gz: 445d26b471ba9bf09f5f5f7257c354a492bcefb2d572fdec7a205f3d6e3d5c7dc5c2293658a2502fe86b1f1806d6c7bba26054d97eae10a7240986a88dfe6b59
@@ -0,0 +1,70 @@
1
+ # encoding: utf-8
2
+ module EasySolr
3
+ class Expressions
4
+ attr_accessor :nn_custom_links
5
+
6
+ def initialize
7
+ @nn_solr_query_string = ' '
8
+ @nn_prefix_expression = []
9
+ @nn_params_array = []
10
+ @nn_query_string = ''
11
+ end
12
+
13
+ ##
14
+ # ==== Description
15
+ #
16
+ # 拼接用户传递的参数,将其转换为Solr可以识别的
17
+ # 字符串
18
+ #
19
+ def solr_where(prefix, *params)
20
+ prefix_array = prefix.split("and")
21
+
22
+ params.each_with_index do |_key, _index|
23
+ @nn_prefix_expression << \
24
+ ::EasySolr::QueryItem.new(nn_custom_links, prefix_array[_index], _key)
25
+ end
26
+
27
+ self
28
+ end
29
+
30
+
31
+ ##
32
+ # ==== Description
33
+ #
34
+ # 生成 Solr 可以解析的字符串
35
+ #
36
+ # ==== Return
37
+ #
38
+ # 例如,将
39
+ # solr_params = expr.solr_where(" title = ? and id = ? ", '奥迪', '620460').
40
+ # solr_where(" second_editor_id = ? ", '138')
41
+ #
42
+ # 生成
43
+ #
44
+ # title: 奥迪 id: 620460 second_editor_id: 138
45
+ #
46
+ def query_string_for_solr
47
+ the_whole_solr_query_string = ' '
48
+
49
+ @nn_prefix_expression.each do |_query_item|
50
+ the_whole_solr_query_string.concat(_query_item.traslate_to_solr_str)
51
+ end
52
+
53
+ the_whole_solr_query_string
54
+ end
55
+
56
+ ##
57
+ # ==== Description
58
+ #
59
+ # 每一次查询之后, 清除全部的 传入参数
60
+ #
61
+ def destroy!
62
+ @nn_solr_query_string = ' '
63
+ @nn_prefix_expression = []
64
+ @nn_params_array = []
65
+ @nn_query_string = ''
66
+ end
67
+
68
+ end
69
+ end
70
+
@@ -0,0 +1,57 @@
1
+ # encoding: utf-8
2
+ module EasySolr
3
+ class QueryItem
4
+
5
+ attr_accessor :nn_custom_links
6
+
7
+ def initialize(custom_links, query_string, value)
8
+ @nn_solr_query_string = query_string
9
+ @nn_solr_value = value
10
+ @nn_custom_links = custom_links
11
+ end
12
+
13
+ ##
14
+ # ==== Description
15
+ #
16
+ # 最小单元的转化,将MySQL语法转转换成 Solr 可识别的查询字符串
17
+ #
18
+ # 第一步,参考 ::EasySolr::Expressions#solr_where
19
+ # expr.solr_where(" title = ? and id = ? ", '奥迪', '620460')
20
+ # 转换成 "title = ?", '奥迪'
21
+ #
22
+ # 第二步
23
+ # "title = ?", '奥迪'
24
+ # 转换成 "title : 奥迪"
25
+ #
26
+ # 第三步
27
+ # "title : 奥迪"
28
+ # 转换成
29
+ # "title_texts : 奥迪"
30
+ #
31
+ # 第四步, 参考 ::EasySolr::Expressions#query_string_for_solr
32
+ # 组装所有QueryItem 生成 Solr 可用字符串
33
+ #
34
+ def traslate_to_solr_str
35
+ @nn_solr_query_string.gsub!("=", ':').gsub!("?", @nn_solr_value)
36
+ self.replace_with_custom_links
37
+ end
38
+
39
+ ##
40
+ # ==== Description
41
+ #
42
+ # FIXME
43
+ # 这里使用gsub 还是有点风险的, 会导致 错误的覆盖
44
+ #
45
+ def replace_with_custom_links
46
+ nn_custom_links.each_pair do |_link, _value|
47
+ if @nn_solr_query_string.include? _link
48
+ @nn_solr_query_string.gsub!(_link, _value[:solr_name])
49
+ break
50
+ end
51
+ end
52
+
53
+ @nn_solr_query_string.concat(" ")
54
+ end
55
+ end
56
+ end
57
+
@@ -0,0 +1,72 @@
1
+
2
+ # encoding: utf-8
3
+ module EasySolr
4
+ class Queryer
5
+ include ::EasySolr::ResultItem
6
+ include ::EasySolr::Translate
7
+
8
+ attr_accessor :solr_settings
9
+
10
+ def initialize(links, r_settings)
11
+ @solr_settings = r_settings
12
+
13
+ @expr = ::EasySolr::Expressions.new
14
+ @expr.nn_custom_links = links
15
+ end
16
+
17
+ ##
18
+ # ==== Description
19
+ #
20
+ # 根据所有生成的信息 执行 Solr 模糊查询
21
+ #
22
+ def solr_perform
23
+ solr_str = @expr.query_string_for_solr
24
+
25
+ solr_params = { :q => solr_str, :rows => 10 }
26
+ result = current_solr_connection.get 'select', :params => solr_params
27
+
28
+ @expr.destroy!
29
+ result_perform(result).result_items
30
+ end
31
+
32
+ ##
33
+ # ==== Description
34
+ #
35
+ # 获取 Solr 连接
36
+ #
37
+ def current_solr_connection
38
+ if defined? @deal_search_connection
39
+ @deal_search_connection
40
+ else
41
+ solr_url = "#{solr_settings[:host]}:#{solr_settings[:port]}#{solr_settings[:path]}"
42
+ @deal_search_connection = RSolr.connect :url => solr_url
43
+ end
44
+ end
45
+
46
+ ##
47
+ # ==== Description
48
+ #
49
+ # 巧妙运用 where 将
50
+ #
51
+ def where(prefix, *values)
52
+ @expr.solr_where(prefix, *values)
53
+ self
54
+ end
55
+
56
+ ##
57
+ # ==== Description
58
+ #
59
+ # 根据主键ID 生成scope
60
+ #
61
+ def generate_scope(scope)
62
+ ## 执行顺序
63
+ ## 1、break_down
64
+ ## 2、solr_pri_key || mysql_pri_key
65
+ break_down(@expr.nn_custom_links)
66
+
67
+ pri_ids = solr_perform.map{|_item| _item[solr_pri_key].to_i}
68
+ scope.where(" #{ mysql_pri_key } IN (?) ", pri_ids)
69
+ end
70
+
71
+ end
72
+ end
@@ -0,0 +1,60 @@
1
+
2
+ module EasySolr
3
+ module ResultItem
4
+
5
+ @nn_num_found = nil
6
+ @nn_items = []
7
+
8
+ ##
9
+ # ==== Description
10
+ #
11
+ # 解析下面的返回值
12
+ # {
13
+ # "responseHeader"=>
14
+ # {
15
+ # "status"=>0,
16
+ # "QTime"=>62,
17
+ # "params"=>{"q"=>"title_texts: 奥迪", "rows"=>"10", "wt"=>"ruby"}
18
+ # },
19
+ # "response"=>
20
+ # { "numFound"=>171, "start"=>0,
21
+ # "docs"=>[
22
+ # {"deal_id"=>"921384", "tb_sub_tag_id_its"=>74, "begin_date_ls"=>1424448000, "nick_name_texts"=>"金思盈玩具特卖店", "type_texts"=>"Deal", "second_editor_name_texts"=>"折800运营chenfang 素素", "brand_id_its"=>9866, "tb_tag_id_its"=>7, "end_date_ls"=>1425657600, "cancel_status_its"=>1, "wangwang_texts"=>"金思盈玩具专营店", "source_type_its"=>1, "complete_status_its"=>1, "title_texts"=>"金思盈奥迪Q5遥控车 拾美奥迪Q5遥控车", "suspended_status_its"=>1, "second_editor_id_its"=>762, "candidate_deal_type_id_its"=>23, "_version_"=>1499865062339248132},
23
+ # {"deal_id"=>"921386", "tb_sub_tag_id_its"=>74, "begin_date_ls"=>1424448000, "nick_name_texts"=>"金思盈玩具特卖店", "type_texts"=>"Deal", "second_editor_name_texts"=>"折800运营chenfang 素素", "brand_id_its"=>9866, "tb_tag_id_its"=>7, "end_date_ls"=>1425657600, "cancel_status_its"=>1, "wangwang_texts"=>"金思盈玩具专营店", "source_type_its"=>1, "complete_status_its"=>1, "title_texts"=>"金思盈奥迪Q7遥控车 拾美奥迪Q7遥控车", "suspended_status_its"=>1, "second_editor_id_its"=>762, "candidate_deal_type_id_its"=>23, "_version_"=>1499865062339248133}
24
+ # ]
25
+ # }
26
+ # }
27
+ #
28
+
29
+ ##
30
+ # ==== Description
31
+ #
32
+ # 获取返回值,该值为所有匹配的记录条数
33
+ #
34
+ # ==== Return
35
+ #
36
+ # 匹配记录条数
37
+ #
38
+ def num_found
39
+ @nn_num_found
40
+ end
41
+
42
+ ##
43
+ # ==== Description
44
+ #
45
+ # 返回记录
46
+ #
47
+ def result_items
48
+ @nn_items
49
+ end
50
+
51
+ def result_perform(result)
52
+ @nn_num_found = result["response"]["numFound"]
53
+ @nn_items = result["response"]["docs"]
54
+
55
+ self
56
+ end
57
+
58
+ end
59
+ end
60
+
@@ -0,0 +1,67 @@
1
+ # encoding: utf-8
2
+ module EasySolr
3
+ module Translate
4
+
5
+ @nn_mysql_primary_key = nil
6
+ @nn_solr_primary_key = nil
7
+ @pri_key = false
8
+
9
+ ##
10
+ # ==== Description
11
+ #
12
+ # 获取用户配置信息中MySQL表主键
13
+ #
14
+ def mysql_pri_key
15
+ @nn_mysql_primary_key
16
+ end
17
+
18
+ ##
19
+ # ==== Description
20
+ #
21
+ # 获取用户配置信息中Solr 主键
22
+ #
23
+ def solr_pri_key
24
+ @nn_solr_primary_key
25
+ end
26
+
27
+ alias solr_primary_key solr_pri_key
28
+ alias mysql_primary_key mysql_pri_key
29
+
30
+ ##
31
+ # ==== Description
32
+ #
33
+ # 用户 MySQL 和 Solr 对应关系中主键是否设置
34
+ #
35
+ def pri_key_present?
36
+ self.break_down
37
+ @pri_key
38
+ end
39
+
40
+ ##
41
+ # ==== Description
42
+ #
43
+ # 插接配置并
44
+ #
45
+ # ==== Attention
46
+ #
47
+ # 主键配置以第一次配置为主
48
+ # 设置
49
+ # @nn_solr_primary_key solr主键
50
+ # @nn_mysql_primary_key mysql主键
51
+ # @pri_key 主键是否存在
52
+ #
53
+ def break_down(links)
54
+ links.each_pair do |_key, _value|
55
+ if _value[:primary]
56
+ @nn_solr_primary_key = _value[:solr_name]
57
+ @nn_mysql_primary_key = _key
58
+ @pri_key = true
59
+
60
+ break
61
+ end
62
+ end
63
+ end
64
+
65
+ end
66
+ end
67
+
data/lib/easy_solr.rb ADDED
@@ -0,0 +1,8 @@
1
+ # $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+ # $LOAD_PATH.unshift(File.dirname(__FILE__))
3
+ require File.dirname(__FILE__) + "/easy_solr/expressions"
4
+ require File.dirname(__FILE__) + "/easy_solr/query_item"
5
+ require File.dirname(__FILE__) + "/easy_solr/result_item"
6
+ require File.dirname(__FILE__) + "/easy_solr/translate"
7
+ require File.dirname(__FILE__) + "/easy_solr/queryer"
8
+
metadata ADDED
@@ -0,0 +1,66 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: easy_solr
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Hao Wang
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-05-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rsolr
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 1.0.12
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 1.0.12
27
+ description: EasySolr 是一个基于Solr 的检索框架
28
+ email:
29
+ - wanghao293@126.com
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - lib/easy_solr.rb
35
+ - lib/easy_solr/expressions.rb
36
+ - lib/easy_solr/query_item.rb
37
+ - lib/easy_solr/queryer.rb
38
+ - lib/easy_solr/result_item.rb
39
+ - lib/easy_solr/translate.rb
40
+ homepage: http://yannini.me
41
+ licenses:
42
+ - MIT
43
+ metadata: {}
44
+ post_install_message:
45
+ rdoc_options:
46
+ - "--main"
47
+ - README.md
48
+ require_paths:
49
+ - lib
50
+ required_ruby_version: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ required_rubygems_version: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: '0'
60
+ requirements: []
61
+ rubyforge_project:
62
+ rubygems_version: 2.2.2
63
+ signing_key:
64
+ specification_version: 4
65
+ summary: EasySolr 非常棒
66
+ test_files: []