rifle 0.0.1 → 0.0.2
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.
- data/app/controllers/application_controller.rb +4 -0
- data/app/controllers/searches_controller.rb +16 -0
- data/lib/rifle.rb +46 -20
- data/lib/rifle/engine.rb +5 -0
- data/lib/rifle/rifle_resque.rb +22 -0
- data/lib/rifle/version.rb +1 -1
- metadata +54 -2
@@ -0,0 +1,16 @@
|
|
1
|
+
class SearchesController < ApplicationController
|
2
|
+
|
3
|
+
def store
|
4
|
+
urn = params[:urn]
|
5
|
+
payload = JSON.parse(request.body.read)
|
6
|
+
Rifle.store(urn, payload)
|
7
|
+
render json: {status: 'success'}, status: :ok
|
8
|
+
end
|
9
|
+
|
10
|
+
def search
|
11
|
+
words = params[:q]
|
12
|
+
results = Rifle.search(words)
|
13
|
+
render json: results, status: :ok
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
data/lib/rifle.rb
CHANGED
@@ -1,17 +1,26 @@
|
|
1
|
+
require 'json'
|
1
2
|
require 'set'
|
2
3
|
require 'redis'
|
3
4
|
require 'text'
|
5
|
+
require_relative 'rifle/rifle_resque'
|
4
6
|
|
5
7
|
module Rifle
|
6
8
|
|
7
9
|
class Settings
|
8
|
-
attr_accessor :ignored_words, :min_word_length, :redis
|
10
|
+
attr_accessor :ignored_words, :min_word_length, :redis, :server
|
11
|
+
|
9
12
|
def ignored_words
|
10
13
|
@ignored_words ||= ["the", "and", "you", "that"]
|
11
14
|
end
|
15
|
+
|
12
16
|
def min_word_length
|
13
17
|
@min_word_length ||= 3
|
14
18
|
end
|
19
|
+
|
20
|
+
def server
|
21
|
+
@server ||= 'http://localhost:3000'
|
22
|
+
end
|
23
|
+
|
15
24
|
def redis
|
16
25
|
@redis ||= Redis.new
|
17
26
|
end
|
@@ -23,50 +32,59 @@ module Rifle
|
|
23
32
|
@@settings
|
24
33
|
end
|
25
34
|
|
26
|
-
def self.
|
27
|
-
|
28
|
-
p.index_resource(urn, hash)
|
35
|
+
def self.store(urn, hash)
|
36
|
+
Processor.new.index_resource(urn, hash)
|
29
37
|
end
|
30
38
|
|
31
|
-
def self.search(words)
|
32
|
-
|
33
|
-
p.search_for(words)
|
39
|
+
def self.search(words, urns_only = false)
|
40
|
+
Processor.new.search_for(words, urns_only)
|
34
41
|
end
|
35
42
|
|
36
43
|
class Processor
|
37
44
|
|
38
45
|
def index_resource(urn, hash)
|
39
|
-
words =
|
40
|
-
traverse_sentences(hash, words)
|
46
|
+
words = traverse_object(hash, words)
|
41
47
|
metaphones = get_metaphones(words)
|
42
48
|
metaphones.each do |metaphone|
|
43
49
|
save_processed(urn, metaphone)
|
44
50
|
end
|
51
|
+
save_payload(urn, hash)
|
45
52
|
metaphones
|
46
53
|
end
|
47
54
|
|
48
|
-
def search_for(sentence)
|
55
|
+
def search_for(sentence, urns_only)
|
49
56
|
words = get_words_from_text(sentence)
|
50
57
|
metaphones = get_metaphones(words)
|
51
58
|
urns = Set.new
|
52
59
|
metaphones.each do |metaphone|
|
53
60
|
new_urns = get_urns_for_metaphone(metaphone)
|
54
|
-
urns =urns.merge(new_urns)
|
61
|
+
urns = urns.merge(new_urns)
|
62
|
+
end
|
63
|
+
if urns_only
|
64
|
+
urns
|
65
|
+
else
|
66
|
+
urns.map { |u|
|
67
|
+
{
|
68
|
+
urn: u,
|
69
|
+
payload: get_payload_for_urn(u)
|
70
|
+
}
|
71
|
+
}
|
55
72
|
end
|
56
|
-
urns
|
57
73
|
end
|
58
74
|
|
59
75
|
private
|
60
76
|
|
61
|
-
def
|
62
|
-
|
63
|
-
|
64
|
-
|
77
|
+
def traverse_object(input, words)
|
78
|
+
words ||= Set.new
|
79
|
+
examine_value(input, words)
|
80
|
+
words
|
65
81
|
end
|
66
82
|
|
67
83
|
def examine_value(value, words)
|
68
84
|
if value.is_a? Hash
|
69
|
-
|
85
|
+
value.each do |k, v|
|
86
|
+
examine_value(v, words)
|
87
|
+
end
|
70
88
|
elsif value.is_a? Array
|
71
89
|
value.each do |a|
|
72
90
|
examine_value(a, words)
|
@@ -78,7 +96,7 @@ module Rifle
|
|
78
96
|
|
79
97
|
def get_words_from_text(text)
|
80
98
|
return [] if !text.is_a?(String)
|
81
|
-
words = text.downcase.split(/[^a-zA-Z]/).select{|w| w.length >= Rifle.settings.min_word_length}
|
99
|
+
words = text.downcase.split(/[^a-zA-Z]/).select { |w| w.length >= Rifle.settings.min_word_length }
|
82
100
|
return words - Rifle.settings.ignored_words
|
83
101
|
end
|
84
102
|
|
@@ -87,11 +105,19 @@ module Rifle
|
|
87
105
|
end
|
88
106
|
|
89
107
|
def save_processed(urn, metaphone)
|
90
|
-
Rifle.settings.redis.sadd("rifle:#{metaphone}", urn)
|
108
|
+
Rifle.settings.redis.sadd("rifle:m:#{metaphone}", urn)
|
109
|
+
end
|
110
|
+
|
111
|
+
def save_payload(urn, hash)
|
112
|
+
Rifle.settings.redis.set("rifle:u:#{urn}", hash.to_json)
|
91
113
|
end
|
92
114
|
|
93
115
|
def get_urns_for_metaphone(metaphone)
|
94
|
-
Rifle.settings.redis.smembers("rifle:#{metaphone}")
|
116
|
+
Rifle.settings.redis.smembers("rifle:m:#{metaphone}")
|
117
|
+
end
|
118
|
+
|
119
|
+
def get_payload_for_urn(urn)
|
120
|
+
JSON.parse(Rifle.settings.redis.get("rifle:u:#{urn}"))
|
95
121
|
end
|
96
122
|
|
97
123
|
end
|
data/lib/rifle/engine.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
gem 'resque'
|
2
|
+
gem 'rest-client'
|
3
|
+
|
4
|
+
# This simple resque job pings the search server with a payload.
|
5
|
+
|
6
|
+
class RifleResque
|
7
|
+
@queue = :rifle
|
8
|
+
|
9
|
+
def initialize(urn, payload)
|
10
|
+
@urn = urn
|
11
|
+
@payload = payload
|
12
|
+
end
|
13
|
+
|
14
|
+
def store
|
15
|
+
RestClient.post("#{Rifle.settings.server}/store/#{@urn}", @payload)
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.perform(urn, payload)
|
19
|
+
h = RifleResque.new(urn, payload)
|
20
|
+
h.store
|
21
|
+
end
|
22
|
+
end
|
data/lib/rifle/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rifle
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-08-
|
12
|
+
date: 2012-08-08 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -59,6 +59,54 @@ dependencies:
|
|
59
59
|
- - ! '>='
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: resque
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :runtime
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: rest-client
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
type: :runtime
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: session_off
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ! '>='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0'
|
102
|
+
type: :runtime
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
62
110
|
description:
|
63
111
|
email:
|
64
112
|
- harry@harrylascelles.com
|
@@ -66,7 +114,11 @@ executables: []
|
|
66
114
|
extensions: []
|
67
115
|
extra_rdoc_files: []
|
68
116
|
files:
|
117
|
+
- app/controllers/application_controller.rb
|
118
|
+
- app/controllers/searches_controller.rb
|
119
|
+
- lib/rifle/engine.rb
|
69
120
|
- lib/rifle/version.rb
|
121
|
+
- lib/rifle/rifle_resque.rb
|
70
122
|
- lib/rifle.rb
|
71
123
|
- README.md
|
72
124
|
homepage:
|