activesearch 0.0.12 → 0.0.13
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 +15 -0
- data/.gitignore +2 -0
- data/README.md +13 -0
- data/activesearch.gemspec +1 -0
- data/config/sample.algolia.yml +2 -0
- data/lib/activesearch/algolia/client.rb +34 -0
- data/lib/activesearch/algolia.rb +54 -0
- data/lib/activesearch/elastic_search.rb +8 -2
- data/lib/activesearch/proxy.rb +16 -0
- data/lib/activesearch/version.rb +1 -1
- data/spec/engines_spec.rb +5 -0
- data/spec/models/algolia.rb +24 -0
- data/spec/spec_helper.rb +4 -0
- metadata +25 -24
- data/lib/activesearch/elastic_search/proxy.rb +0 -26
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
MjhhY2NlMzY1NDJmZGU1YjdlNzk0NGIyOGFhOTM5M2RkNjA3YTM1MA==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
YTdhYzQwM2NiNGI5NWFiYmY5ZjA3YzYyOGU4ZTJhMjU0ZTY5YTRjMQ==
|
7
|
+
!binary "U0hBNTEy":
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
YzAxNTg0M2NkYzRiYmE2MzMzOThhZTI4MzkyMWU5N2Y2YjZmMGMyOGJhZmQy
|
10
|
+
ODk5MTBiNTczNTkwNjYwODdkM2JmM2Q0ODViNmE4NWYwNzg1OTU5NGZkMWUz
|
11
|
+
NGZmYzI4YjM0NzA5YTFlYjFiNWE1Y2IzOGQ5NDMwNDc3NTc3NmQ=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
YWM5Mzg0YjA5MDllZjhhZDllMzBkZDlkODU2YWRlZDQ0NjU2YTk0ZWQ4Yzg2
|
14
|
+
MGZlYmViMWNmNmY0MGYxYTdlYjNiYTY3NzNkNDA3MjlmZDY2YWRhYmQ4NTky
|
15
|
+
YmIzMzg5MzYyOGMwM2NlYzFhOWIyZDQxNTMzMWZmNTI5NzEyNmQ=
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -18,6 +18,19 @@ It works by storing keywords taken from the specified fields and storing them in
|
|
18
18
|
|
19
19
|
gem 'tire'
|
20
20
|
gem 'activesearch'
|
21
|
+
|
22
|
+
###Algolia
|
23
|
+
|
24
|
+
gem 'httparty'
|
25
|
+
gem 'activesearch'
|
26
|
+
|
27
|
+
Then you need to configure the client. In rails, put this in an algolia.rb initializer:
|
28
|
+
|
29
|
+
Algolia.configure do |c|
|
30
|
+
c.api_key = "1234567890"
|
31
|
+
c.app_id = "someapp"
|
32
|
+
c.host = "https://apieu1.algolia.com"
|
33
|
+
end
|
21
34
|
|
22
35
|
##Configuration
|
23
36
|
|
data/activesearch.gemspec
CHANGED
@@ -0,0 +1,34 @@
|
|
1
|
+
require "httparty"
|
2
|
+
require "active_support/core_ext/object/to_json"
|
3
|
+
|
4
|
+
module ActiveSearch::Algolia
|
5
|
+
class Client
|
6
|
+
include HTTParty
|
7
|
+
|
8
|
+
def self.configure(api_key, app_id, index = "activesearch")
|
9
|
+
base_uri "https://apieu1.algolia.com/1/indexes/#{index}"
|
10
|
+
headers({
|
11
|
+
"X-Algolia-API-Key" => api_key,
|
12
|
+
"X-Algolia-Application-Id" => app_id,
|
13
|
+
"Content-Type" => "application/json; charset=utf-8"
|
14
|
+
})
|
15
|
+
end
|
16
|
+
|
17
|
+
def delete_index
|
18
|
+
self.class.delete("")
|
19
|
+
end
|
20
|
+
|
21
|
+
def delete(id)
|
22
|
+
return false if id.nil?
|
23
|
+
self.class.delete("/#{id}")
|
24
|
+
end
|
25
|
+
|
26
|
+
def save(id, object)
|
27
|
+
self.class.put("/#{id}", body: object.to_json)
|
28
|
+
end
|
29
|
+
|
30
|
+
def query(text)
|
31
|
+
self.class.get("", query: {query: text})
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require "activesearch/algolia/client"
|
2
|
+
require "activesearch/base"
|
3
|
+
require "activesearch/proxy"
|
4
|
+
|
5
|
+
module ActiveSearch
|
6
|
+
def self.search(text)
|
7
|
+
Proxy.new(text) do |text|
|
8
|
+
Algolia::Client.new.query(text)["hits"].map! do |hit|
|
9
|
+
if hit["_tags"]
|
10
|
+
hit["_tags"].each do |tag|
|
11
|
+
k, v = tag.split(':')
|
12
|
+
hit[k] = v
|
13
|
+
end
|
14
|
+
hit.delete("_tags")
|
15
|
+
end
|
16
|
+
hit
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
module Algolia
|
22
|
+
def self.included(base)
|
23
|
+
base.class_eval do
|
24
|
+
include Base
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
protected
|
29
|
+
def reindex
|
30
|
+
algolia_client.save(indexable_id, self.to_indexable)
|
31
|
+
end
|
32
|
+
|
33
|
+
def deindex
|
34
|
+
algolia_client.delete(indexable_id)
|
35
|
+
end
|
36
|
+
|
37
|
+
def to_indexable
|
38
|
+
doc = {}
|
39
|
+
search_fields.each do |field|
|
40
|
+
doc[field.to_s] = attributes[field.to_s] if attributes[field.to_s]
|
41
|
+
end
|
42
|
+
|
43
|
+
(Array(search_options[:store]) - search_fields).each do |field|
|
44
|
+
doc["_tags"] ||= []
|
45
|
+
doc["_tags"] << "#{field}:#{self.send(field)}"
|
46
|
+
end
|
47
|
+
doc
|
48
|
+
end
|
49
|
+
|
50
|
+
def algolia_client
|
51
|
+
@algolia_client ||= Client.new
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -1,12 +1,18 @@
|
|
1
1
|
require 'tire'
|
2
2
|
require "active_support/core_ext"
|
3
3
|
require "activesearch/base"
|
4
|
-
require "activesearch/
|
4
|
+
require "activesearch/proxy"
|
5
5
|
|
6
6
|
module ActiveSearch
|
7
7
|
|
8
8
|
def self.search(text)
|
9
|
-
|
9
|
+
Proxy.new(text) do |text|
|
10
|
+
Tire.search('_all') do |search|
|
11
|
+
search.query do |query|
|
12
|
+
query.match("_all", text)
|
13
|
+
end
|
14
|
+
end.results
|
15
|
+
end
|
10
16
|
end
|
11
17
|
|
12
18
|
module ElasticSearch
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require "activesearch/result"
|
2
|
+
|
3
|
+
module ActiveSearch
|
4
|
+
class Proxy
|
5
|
+
include Enumerable
|
6
|
+
|
7
|
+
def initialize(text, &implementation)
|
8
|
+
@text = text
|
9
|
+
@implementation = implementation
|
10
|
+
end
|
11
|
+
|
12
|
+
def each(&block)
|
13
|
+
@implementation.call(@text).each { |result| block.call(Result.new(result)) }
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/activesearch/version.rb
CHANGED
data/spec/engines_spec.rb
CHANGED
@@ -4,6 +4,11 @@ require File.join(File.dirname(__FILE__), 'spec_helper')
|
|
4
4
|
|
5
5
|
def cleanup(engine)
|
6
6
|
case engine
|
7
|
+
when "Algolia"
|
8
|
+
YAML.load_file(File.dirname(__FILE__) + '/../config/algolia.yml').tap do |config|
|
9
|
+
ActiveSearch::Algolia::Client.configure(config["api_key"], config["app_id"])
|
10
|
+
end
|
11
|
+
ActiveSearch::Algolia::Client.new.delete_index
|
7
12
|
when "ElasticSearch"
|
8
13
|
Tire::Configuration.client.delete "#{Tire::Configuration.url}/_all"
|
9
14
|
load File.join(File.dirname(__FILE__), 'models', 'elastic_search.rb')
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'activesearch/algolia'
|
2
|
+
|
3
|
+
class AlgoliaModel < ActiveMimic
|
4
|
+
include ActiveSearch::Algolia
|
5
|
+
|
6
|
+
attribute :title
|
7
|
+
attribute :text
|
8
|
+
attribute :junk
|
9
|
+
attribute :special, default: false
|
10
|
+
|
11
|
+
search_by [:title, :text, store: [:title, :junk]], if: lambda { !self.special }
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
class AnotherAlgoliaModel < ActiveMimic
|
16
|
+
include ActiveSearch::Algolia
|
17
|
+
|
18
|
+
attribute :title, type: String
|
19
|
+
search_by [:title, store: [:title, :virtual]]
|
20
|
+
|
21
|
+
def virtual
|
22
|
+
"virtual"
|
23
|
+
end
|
24
|
+
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,20 +1,18 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activesearch
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.0.13
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Rodrigo Alvarez
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2013-04-
|
11
|
+
date: 2013-04-19 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: activesupport
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
17
|
- - ! '>='
|
20
18
|
- !ruby/object:Gem::Version
|
@@ -22,7 +20,6 @@ dependencies:
|
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
24
|
- - ! '>='
|
28
25
|
- !ruby/object:Gem::Version
|
@@ -30,7 +27,6 @@ dependencies:
|
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: rspec
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
31
|
- - ! '>='
|
36
32
|
- !ruby/object:Gem::Version
|
@@ -38,7 +34,6 @@ dependencies:
|
|
38
34
|
type: :development
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
38
|
- - ! '>='
|
44
39
|
- !ruby/object:Gem::Version
|
@@ -46,7 +41,6 @@ dependencies:
|
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: rspec-mocks
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
45
|
- - ! '>='
|
52
46
|
- !ruby/object:Gem::Version
|
@@ -54,7 +48,6 @@ dependencies:
|
|
54
48
|
type: :development
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
52
|
- - ! '>='
|
60
53
|
- !ruby/object:Gem::Version
|
@@ -62,7 +55,6 @@ dependencies:
|
|
62
55
|
- !ruby/object:Gem::Dependency
|
63
56
|
name: bson_ext
|
64
57
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
58
|
requirements:
|
67
59
|
- - ! '>='
|
68
60
|
- !ruby/object:Gem::Version
|
@@ -70,7 +62,6 @@ dependencies:
|
|
70
62
|
type: :development
|
71
63
|
prerelease: false
|
72
64
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
65
|
requirements:
|
75
66
|
- - ! '>='
|
76
67
|
- !ruby/object:Gem::Version
|
@@ -78,7 +69,6 @@ dependencies:
|
|
78
69
|
- !ruby/object:Gem::Dependency
|
79
70
|
name: active_attr
|
80
71
|
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
72
|
requirements:
|
83
73
|
- - ! '>='
|
84
74
|
- !ruby/object:Gem::Version
|
@@ -86,7 +76,6 @@ dependencies:
|
|
86
76
|
type: :development
|
87
77
|
prerelease: false
|
88
78
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
79
|
requirements:
|
91
80
|
- - ! '>='
|
92
81
|
- !ruby/object:Gem::Version
|
@@ -94,7 +83,6 @@ dependencies:
|
|
94
83
|
- !ruby/object:Gem::Dependency
|
95
84
|
name: mongoid
|
96
85
|
requirement: !ruby/object:Gem::Requirement
|
97
|
-
none: false
|
98
86
|
requirements:
|
99
87
|
- - ~>
|
100
88
|
- !ruby/object:Gem::Version
|
@@ -102,7 +90,6 @@ dependencies:
|
|
102
90
|
type: :development
|
103
91
|
prerelease: false
|
104
92
|
version_requirements: !ruby/object:Gem::Requirement
|
105
|
-
none: false
|
106
93
|
requirements:
|
107
94
|
- - ~>
|
108
95
|
- !ruby/object:Gem::Version
|
@@ -110,7 +97,6 @@ dependencies:
|
|
110
97
|
- !ruby/object:Gem::Dependency
|
111
98
|
name: tire
|
112
99
|
requirement: !ruby/object:Gem::Requirement
|
113
|
-
none: false
|
114
100
|
requirements:
|
115
101
|
- - ! '>='
|
116
102
|
- !ruby/object:Gem::Version
|
@@ -118,7 +104,6 @@ dependencies:
|
|
118
104
|
type: :development
|
119
105
|
prerelease: false
|
120
106
|
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
none: false
|
122
107
|
requirements:
|
123
108
|
- - ! '>='
|
124
109
|
- !ruby/object:Gem::Version
|
@@ -126,7 +111,6 @@ dependencies:
|
|
126
111
|
- !ruby/object:Gem::Dependency
|
127
112
|
name: parallel_tests
|
128
113
|
requirement: !ruby/object:Gem::Requirement
|
129
|
-
none: false
|
130
114
|
requirements:
|
131
115
|
- - ! '>='
|
132
116
|
- !ruby/object:Gem::Version
|
@@ -134,7 +118,20 @@ dependencies:
|
|
134
118
|
type: :development
|
135
119
|
prerelease: false
|
136
120
|
version_requirements: !ruby/object:Gem::Requirement
|
137
|
-
|
121
|
+
requirements:
|
122
|
+
- - ! '>='
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: httparty
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ! '>='
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
138
135
|
requirements:
|
139
136
|
- - ! '>='
|
140
137
|
- !ruby/object:Gem::Version
|
@@ -152,50 +149,54 @@ files:
|
|
152
149
|
- README.md
|
153
150
|
- Rakefile
|
154
151
|
- activesearch.gemspec
|
152
|
+
- config/sample.algolia.yml
|
155
153
|
- lib/activesearch.rb
|
154
|
+
- lib/activesearch/algolia.rb
|
155
|
+
- lib/activesearch/algolia/client.rb
|
156
156
|
- lib/activesearch/base.rb
|
157
157
|
- lib/activesearch/elastic_search.rb
|
158
|
-
- lib/activesearch/elastic_search/proxy.rb
|
159
158
|
- lib/activesearch/mongoid.rb
|
160
159
|
- lib/activesearch/mongoid/model.rb
|
160
|
+
- lib/activesearch/proxy.rb
|
161
161
|
- lib/activesearch/result.rb
|
162
162
|
- lib/activesearch/version.rb
|
163
163
|
- spec/base_spec.rb
|
164
164
|
- spec/config/mongoid.yml
|
165
165
|
- spec/engines_spec.rb
|
166
|
+
- spec/models/algolia.rb
|
166
167
|
- spec/models/elastic_search.rb
|
167
168
|
- spec/models/mongoid.rb
|
168
169
|
- spec/mongoid_spec.rb
|
169
170
|
- spec/spec_helper.rb
|
170
171
|
homepage: ''
|
171
172
|
licenses: []
|
173
|
+
metadata: {}
|
172
174
|
post_install_message:
|
173
175
|
rdoc_options: []
|
174
176
|
require_paths:
|
175
177
|
- lib
|
176
178
|
required_ruby_version: !ruby/object:Gem::Requirement
|
177
|
-
none: false
|
178
179
|
requirements:
|
179
180
|
- - ! '>='
|
180
181
|
- !ruby/object:Gem::Version
|
181
182
|
version: '0'
|
182
183
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
183
|
-
none: false
|
184
184
|
requirements:
|
185
185
|
- - ! '>='
|
186
186
|
- !ruby/object:Gem::Version
|
187
187
|
version: '0'
|
188
188
|
requirements: []
|
189
189
|
rubyforge_project:
|
190
|
-
rubygems_version:
|
190
|
+
rubygems_version: 2.0.3
|
191
191
|
signing_key:
|
192
|
-
specification_version:
|
192
|
+
specification_version: 4
|
193
193
|
summary: ActiveSearch lets you plug in a ruby module in any class that will allow
|
194
194
|
you to do full text searches.
|
195
195
|
test_files:
|
196
196
|
- spec/base_spec.rb
|
197
197
|
- spec/config/mongoid.yml
|
198
198
|
- spec/engines_spec.rb
|
199
|
+
- spec/models/algolia.rb
|
199
200
|
- spec/models/elastic_search.rb
|
200
201
|
- spec/models/mongoid.rb
|
201
202
|
- spec/mongoid_spec.rb
|
@@ -1,26 +0,0 @@
|
|
1
|
-
require "activesearch/result"
|
2
|
-
|
3
|
-
module ActiveSearch
|
4
|
-
module ElasticSearch
|
5
|
-
class Proxy
|
6
|
-
include Enumerable
|
7
|
-
|
8
|
-
def initialize(text)
|
9
|
-
@text = text
|
10
|
-
end
|
11
|
-
|
12
|
-
def each(&block)
|
13
|
-
search.results.each { |result| block.call(Result.new(result)) }
|
14
|
-
end
|
15
|
-
|
16
|
-
protected
|
17
|
-
def search
|
18
|
-
@search ||= Tire.search('_all') do |search|
|
19
|
-
search.query do |query|
|
20
|
-
query.match("_all", @text)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|