couchrest_model_search 0.0.4 → 0.0.5
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/.rvmrc +1 -1
- data/CHANGELOG +3 -0
- data/Gemfile.lock +2 -2
- data/README.markdown +92 -10
- data/VERSION +1 -1
- data/lib/couchrest_model_search.rb +9 -0
- data/spec/couchrest_model_search_spec.rb +7 -0
- metadata +5 -7
data/.rvmrc
CHANGED
@@ -1 +1 @@
|
|
1
|
-
rvm
|
1
|
+
rvm default@couchrest_model_search --create
|
data/CHANGELOG
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
couchrest_model_search (0.0.
|
4
|
+
couchrest_model_search (0.0.4)
|
5
5
|
couchrest_model (~> 1.0.0)
|
6
6
|
|
7
7
|
GEM
|
@@ -60,7 +60,7 @@ GEM
|
|
60
60
|
rake (>= 0.8.7)
|
61
61
|
thor (~> 0.14.4)
|
62
62
|
rake (0.9.2)
|
63
|
-
rest-client (1.6.
|
63
|
+
rest-client (1.6.7)
|
64
64
|
mime-types (>= 1.16)
|
65
65
|
rspec (2.6.0)
|
66
66
|
rspec-core (~> 2.6.0)
|
data/README.markdown
CHANGED
@@ -8,17 +8,99 @@ Search integration for `couchrest_model` users that are using couchdb-lucene.
|
|
8
8
|
|
9
9
|
## Usage
|
10
10
|
|
11
|
+
By simply requiring 'couchrest_model_search' in your project, all of your `CouchRest::Model::Base` models will respond to a `search` class method. This method will, by default, perform a full-text search on your model for any query you pass to it.
|
12
|
+
|
13
|
+
For example, suppose we have defined the following model:
|
14
|
+
|
15
|
+
class Article < CouchRest::Model::Base
|
16
|
+
property :title
|
17
|
+
property :author
|
18
|
+
property :body
|
19
|
+
end
|
20
|
+
|
21
|
+
And now, let's create some articles:
|
22
|
+
|
23
|
+
Article.create(
|
24
|
+
:title => "CouchDB is fun!",
|
25
|
+
:author => "moonmaster9000",
|
26
|
+
:body => "CouchDB is the most fun EVAR."
|
27
|
+
)
|
28
|
+
|
29
|
+
Article.create(
|
30
|
+
:title => "CouchDB Lucene FTW",
|
31
|
+
:author => "moonmaster9000",
|
32
|
+
:body => "CouchDB Lucene makes your documents easily searchable!"
|
33
|
+
)
|
34
|
+
|
35
|
+
Article.create(
|
36
|
+
:title => "Search your CouchDB documents from Ruby",
|
37
|
+
:author => "dorren",
|
38
|
+
:body => "Use the couchrest_model_search gem to search your documents from Ruby."
|
39
|
+
)
|
40
|
+
|
41
|
+
If we searched for "CouchDB", we would receive all documents we've created, since they all contained the word "CouchDB" in one of the properties:
|
42
|
+
|
43
|
+
Article.search("CouchDB").map(&:title)
|
44
|
+
#==> ["CouchDB is fun!", "CouchDB Lucene FTW", "Search your CouchDB documents from Ruby"]
|
45
|
+
|
46
|
+
Of course, searching for "moonmaster9000" would only return the first two documents:
|
47
|
+
|
48
|
+
Article.search("moonmaster9000").map(&:title)
|
49
|
+
#==> ["CouchDB is fun!", "CouchDB Lucene FTW"]
|
50
|
+
|
51
|
+
|
52
|
+
### Creating more search functions
|
53
|
+
|
54
|
+
By default, the `search` method will use an underlying fulltext search index function to query your content. You can override the definition of this default "fulltext" search index function via the `search_by` class method:
|
55
|
+
|
11
56
|
class Article < CouchRest::Model::Base
|
57
|
+
property :title
|
58
|
+
property :author
|
59
|
+
property :body
|
60
|
+
|
61
|
+
search_by :fulltext,
|
62
|
+
:index => %(
|
63
|
+
function(doc){
|
64
|
+
//... your code here
|
65
|
+
}
|
66
|
+
)
|
12
67
|
end
|
13
68
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
class
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
69
|
+
You can also create other search indexes. For example, suppose we'd like to index only the titles of articles for search:
|
70
|
+
|
71
|
+
|
72
|
+
class Article < CouchRest::Model::Base
|
73
|
+
property :title
|
74
|
+
property :author
|
75
|
+
property :body
|
76
|
+
|
77
|
+
search_by :title,
|
78
|
+
:index => %(
|
79
|
+
function(doc){
|
80
|
+
var contentToIndex = new Document();
|
81
|
+
contentToIndex.add(doc.title);
|
82
|
+
return contentToIndex;
|
83
|
+
}
|
84
|
+
)
|
24
85
|
end
|
86
|
+
|
87
|
+
Now, to perform a search by title (instead of a fulltext search), simply pass `:by_title` along with your query to the `search` method:
|
88
|
+
|
89
|
+
Article.search "some query", :by_title
|
90
|
+
|
91
|
+
### CouchDB-Lucene Query options
|
92
|
+
|
93
|
+
You can pass any CouchDB-Lucene query options to your search via an optional third parameter to search:
|
94
|
+
|
95
|
+
Article.search "apples", :fulltext, :limit => 10
|
96
|
+
|
97
|
+
|
98
|
+
### Escaping special characters
|
99
|
+
|
100
|
+
The following characters have special meaning to Lucene when added to a query:
|
101
|
+
|
102
|
+
+ - && || ! ( ) { } [ ] ^ " ~ * ? : \
|
103
|
+
|
104
|
+
By default, `couchrest_model_search` will not escape your query. If you want it to automatically escape these special characters in your query, then use the `escaped_search` method:
|
105
|
+
|
106
|
+
Article.escaped_search "2001:March:10"
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.5
|
@@ -82,6 +82,15 @@ class CouchRest::Model::Base
|
|
82
82
|
ret = self.database.search(self.to_s, view_fn, query, options)
|
83
83
|
ret['rows'].map {|r| self.new(r['doc'])}
|
84
84
|
end
|
85
|
+
|
86
|
+
def self.escaped_search(query, view_fn="by_fulltext", options={})
|
87
|
+
self.lucene_special_characters.map {|c| query.gsub!(c, %{\\} + c)}
|
88
|
+
self.search query, view_fn, options
|
89
|
+
end
|
90
|
+
|
91
|
+
def self.lucene_special_characters
|
92
|
+
@lucene_special_characters ||= %w[\ + - && || ! ( ) { } [ ] ^ " ~ * ? :]
|
93
|
+
end
|
85
94
|
|
86
95
|
# example search functions
|
87
96
|
# class Aritlce
|
@@ -16,6 +16,13 @@ describe "CouchrestModelSearch" do
|
|
16
16
|
Article.design_doc["fulltext"].should_not be_nil
|
17
17
|
end
|
18
18
|
end
|
19
|
+
|
20
|
+
describe "##escaped_search" do
|
21
|
+
it "should escape the first parameter, then pass all args off to the search method" do
|
22
|
+
Article.should_receive(:search).with('hello\:there', "by_fulltext", {}).and_return nil
|
23
|
+
Article.escaped_search "hello:there"
|
24
|
+
end
|
25
|
+
end
|
19
26
|
|
20
27
|
describe "overwrite design doc" do
|
21
28
|
class CustomArticle < CouchRest::Model::Base
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: couchrest_model_search
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 21
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 5
|
10
|
+
version: 0.0.5
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Dorren Chen
|
@@ -16,8 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2010-10-18 00:00:00
|
20
|
-
default_executable:
|
19
|
+
date: 2010-10-18 00:00:00 Z
|
21
20
|
dependencies:
|
22
21
|
- !ruby/object:Gem::Dependency
|
23
22
|
name: couchrest_model
|
@@ -88,7 +87,6 @@ files:
|
|
88
87
|
- lib/couchrest_model_search.rb
|
89
88
|
- spec/couchrest_model_search_spec.rb
|
90
89
|
- spec/spec_helper.rb
|
91
|
-
has_rdoc: true
|
92
90
|
homepage: http://github.com/dorren/couchrest_model_search
|
93
91
|
licenses: []
|
94
92
|
|
@@ -118,7 +116,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
118
116
|
requirements: []
|
119
117
|
|
120
118
|
rubyforge_project:
|
121
|
-
rubygems_version: 1.
|
119
|
+
rubygems_version: 1.8.10
|
122
120
|
signing_key:
|
123
121
|
specification_version: 3
|
124
122
|
summary: Add couchdb-lucene search support to CouchRest Model
|