easy_solr 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/easy_solr/expressions.rb +70 -0
- data/lib/easy_solr/query_item.rb +57 -0
- data/lib/easy_solr/queryer.rb +72 -0
- data/lib/easy_solr/result_item.rb +60 -0
- data/lib/easy_solr/translate.rb +67 -0
- data/lib/easy_solr.rb +8 -0
- metadata +66 -0
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: []
|