rroonga 1.0.1 → 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/NEWS.ja.rdoc +46 -0
- data/NEWS.rdoc +46 -0
- data/README.ja.rdoc +2 -2
- data/README.rdoc +2 -3
- data/Rakefile +148 -11
- data/example/bookmark.rb +94 -91
- data/ext/groonga/extconf.rb +25 -25
- data/ext/groonga/groonga.def +2 -0
- data/ext/groonga/mkmf.log +7 -7
- data/ext/groonga/rb-grn-column.c +66 -0
- data/ext/groonga/rb-grn-context.c +92 -5
- data/ext/groonga/rb-grn-database.c +24 -1
- data/ext/groonga/rb-grn-exception.c +15 -0
- data/ext/groonga/rb-grn-hash.c +2 -2
- data/ext/groonga/rb-grn-index-column.c +8 -4
- data/ext/groonga/rb-grn-object.c +4 -2
- data/ext/groonga/rb-grn-patricia-trie.c +2 -2
- data/ext/groonga/rb-grn-snippet.c +1 -0
- data/ext/groonga/rb-grn-table-key-support.c +22 -19
- data/ext/groonga/rb-grn-table.c +63 -5
- data/ext/groonga/rb-grn.h +1 -1
- data/ext/groonga/rb-groonga.c +1 -0
- data/extconf.rb +1 -1
- data/html/developer.html +8 -2
- data/html/favicon.ico +0 -0
- data/html/favicon.svg +591 -0
- data/html/index.html +71 -8
- data/html/logo.svg +612 -0
- data/html/ranguba.css +92 -7
- data/html/readme.svg +256 -0
- data/lib/groonga/expression-builder.rb +8 -4
- data/lib/groonga/record.rb +77 -7
- data/lib/groonga/schema.rb +429 -100
- data/rroonga-build.rb +1 -1
- data/test/run-test.rb +1 -1
- data/test/test-array.rb +4 -0
- data/test/test-context.rb +8 -0
- data/test/test-database.rb +8 -1
- data/test/test-expression-builder.rb +14 -0
- data/test/test-fix-size-column.rb +4 -0
- data/test/test-hash.rb +10 -4
- data/test/test-index-column.rb +11 -0
- data/test/test-patricia-trie.rb +7 -1
- data/test/test-record.rb +14 -0
- data/test/test-remote.rb +3 -2
- data/test/test-schema-create-table.rb +32 -2
- data/test/test-schema.rb +108 -11
- data/test/test-table-select-normalize.rb +7 -3
- data/test/test-table-select.rb +12 -0
- data/test/test-table.rb +7 -0
- data/test/test-variable-size-column.rb +4 -0
- data/test-unit/Rakefile +40 -0
- data/test-unit/TODO +5 -0
- data/test-unit/bin/testrb +5 -0
- data/test-unit/html/classic.html +15 -0
- data/test-unit/html/index.html +25 -0
- data/test-unit/html/index.html.ja +27 -0
- data/test-unit/lib/test/unit/assertionfailederror.rb +25 -0
- data/test-unit/lib/test/unit/assertions.rb +1230 -0
- data/test-unit/lib/test/unit/attribute.rb +125 -0
- data/test-unit/lib/test/unit/autorunner.rb +360 -0
- data/test-unit/lib/test/unit/collector/descendant.rb +23 -0
- data/test-unit/lib/test/unit/collector/dir.rb +108 -0
- data/test-unit/lib/test/unit/collector/load.rb +144 -0
- data/test-unit/lib/test/unit/collector/objectspace.rb +34 -0
- data/test-unit/lib/test/unit/collector.rb +36 -0
- data/test-unit/lib/test/unit/color-scheme.rb +102 -0
- data/test-unit/lib/test/unit/color.rb +96 -0
- data/test-unit/lib/test/unit/diff.rb +724 -0
- data/test-unit/lib/test/unit/error.rb +130 -0
- data/test-unit/lib/test/unit/exceptionhandler.rb +39 -0
- data/test-unit/lib/test/unit/failure.rb +136 -0
- data/test-unit/lib/test/unit/fixture.rb +176 -0
- data/test-unit/lib/test/unit/notification.rb +129 -0
- data/test-unit/lib/test/unit/omission.rb +191 -0
- data/test-unit/lib/test/unit/pending.rb +150 -0
- data/test-unit/lib/test/unit/priority.rb +180 -0
- data/test-unit/lib/test/unit/runner/console.rb +52 -0
- data/test-unit/lib/test/unit/runner/emacs.rb +8 -0
- data/test-unit/lib/test/unit/runner/tap.rb +8 -0
- data/test-unit/lib/test/unit/testcase.rb +476 -0
- data/test-unit/lib/test/unit/testresult.rb +89 -0
- data/test-unit/lib/test/unit/testsuite.rb +110 -0
- data/test-unit/lib/test/unit/ui/console/outputlevel.rb +14 -0
- data/test-unit/lib/test/unit/ui/console/testrunner.rb +466 -0
- data/test-unit/lib/test/unit/ui/emacs/testrunner.rb +63 -0
- data/test-unit/lib/test/unit/ui/tap/testrunner.rb +92 -0
- data/test-unit/lib/test/unit/ui/testrunner.rb +28 -0
- data/test-unit/lib/test/unit/ui/testrunnermediator.rb +77 -0
- data/test-unit/lib/test/unit/ui/testrunnerutilities.rb +41 -0
- data/test-unit/lib/test/unit/util/backtracefilter.rb +41 -0
- data/test-unit/lib/test/unit/util/method-owner-finder.rb +28 -0
- data/test-unit/lib/test/unit/util/observable.rb +90 -0
- data/test-unit/lib/test/unit/util/procwrapper.rb +48 -0
- data/test-unit/lib/test/unit/version.rb +7 -0
- data/test-unit/lib/test/unit.rb +323 -0
- data/test-unit/sample/adder.rb +13 -0
- data/test-unit/sample/subtracter.rb +12 -0
- data/test-unit/sample/test_adder.rb +20 -0
- data/test-unit/sample/test_subtracter.rb +20 -0
- data/test-unit/sample/test_user.rb +23 -0
- data/test-unit/test/collector/test-descendant.rb +133 -0
- data/test-unit/test/collector/test-load.rb +442 -0
- data/test-unit/test/collector/test_dir.rb +406 -0
- data/test-unit/test/collector/test_objectspace.rb +100 -0
- data/test-unit/test/run-test.rb +15 -0
- data/test-unit/test/test-attribute.rb +86 -0
- data/test-unit/test/test-color-scheme.rb +67 -0
- data/test-unit/test/test-color.rb +47 -0
- data/test-unit/test/test-diff.rb +518 -0
- data/test-unit/test/test-emacs-runner.rb +60 -0
- data/test-unit/test/test-fixture.rb +287 -0
- data/test-unit/test/test-notification.rb +33 -0
- data/test-unit/test/test-omission.rb +81 -0
- data/test-unit/test/test-pending.rb +70 -0
- data/test-unit/test/test-priority.rb +119 -0
- data/test-unit/test/test-testcase.rb +544 -0
- data/test-unit/test/test_assertions.rb +1151 -0
- data/test-unit/test/test_error.rb +26 -0
- data/test-unit/test/test_failure.rb +33 -0
- data/test-unit/test/test_testresult.rb +113 -0
- data/test-unit/test/test_testsuite.rb +129 -0
- data/test-unit/test/testunit-test-util.rb +14 -0
- data/test-unit/test/ui/test_testrunmediator.rb +20 -0
- data/test-unit/test/util/test-method-owner-finder.rb +38 -0
- data/test-unit/test/util/test_backtracefilter.rb +41 -0
- data/test-unit/test/util/test_observable.rb +102 -0
- data/test-unit/test/util/test_procwrapper.rb +36 -0
- data/text/{TUTORIAL.ja.rdoc → tutorial.ja.rdoc} +165 -126
- metadata +106 -16
- data/html/favicon.xcf +0 -0
- data/html/logo.xcf +0 -0
- data/license/GPL +0 -340
- data/license/RUBY +0 -59
- data/pkg-config.rb +0 -333
@@ -7,7 +7,7 @@ rroongaの操作方法を紹介します。
|
|
7
7
|
|
8
8
|
== インストール
|
9
9
|
|
10
|
-
|
10
|
+
rroongaはRubyGemsでインストールできます。
|
11
11
|
|
12
12
|
% sudo gem install rroonga
|
13
13
|
|
@@ -55,19 +55,23 @@ groongaには以下の3種類のテーブルがあります。
|
|
55
55
|
ここではハッシュテーブルを利用して、<tt>Items</tt>という名前のテー
|
56
56
|
ブルを作成します。キーは文字列とします。
|
57
57
|
|
58
|
-
>>
|
59
|
-
=>
|
60
|
-
|
58
|
+
>> Groonga::Schema.create_table("Items", :type => :hash)
|
59
|
+
=> [...]
|
61
60
|
|
62
61
|
これで<tt>Items</tt>という名前のテーブルが作成できました。
|
63
62
|
|
63
|
+
定義したテーブルはGroonga.[]で参照できます。
|
64
|
+
|
65
|
+
>> items = Groonga["Items"]
|
66
|
+
=> #<Groonga::Hash ...>
|
67
|
+
|
64
68
|
テーブルはRubyのHashのように扱えます。
|
65
69
|
|
66
70
|
例えば、以下のように+size+でテーブルに登録されているレコード
|
67
71
|
の件数を取得できます。
|
68
72
|
|
69
73
|
>> items.size
|
70
|
-
0
|
74
|
+
=> 0
|
71
75
|
|
72
76
|
== レコードを追加する
|
73
77
|
|
@@ -75,7 +79,7 @@ groongaには以下の3種類のテーブルがあります。
|
|
75
79
|
|
76
80
|
>> items.add("http://ja.wikipedia.org/wiki/Ruby")
|
77
81
|
=> #<Groonga::Record ...>
|
78
|
-
>> items.add("http://www.ruby-lang.org/")
|
82
|
+
>> items.add("http://www.ruby-lang.org/ja/")
|
79
83
|
=> #<Groonga::Record ...>
|
80
84
|
|
81
85
|
件数を確認すると確かに2件増えています。
|
@@ -85,7 +89,7 @@ groongaには以下の3種類のテーブルがあります。
|
|
85
89
|
|
86
90
|
主キーを指定してレコードを取り出す時には以下のようにします。
|
87
91
|
|
88
|
-
>> items
|
92
|
+
>> items["http://ja.wikipedia.org/wiki/Ruby"]
|
89
93
|
=> #<Groonga::Record ...>
|
90
94
|
|
91
95
|
== 全文検索を行う
|
@@ -93,42 +97,52 @@ groongaには以下の3種類のテーブルがあります。
|
|
93
97
|
各itemのタイトル文字列を登録して、全文検索できるようにしてみ
|
94
98
|
ましょう。
|
95
99
|
|
96
|
-
まず<tt>Items</tt>テーブルに+title
|
100
|
+
まず<tt>Items</tt>テーブルに+title+という名前のカラムを追加し
|
101
|
+
ます。ここでは、<tt>Text</tt>型のデータを持つカラムとして定義
|
102
|
+
します。
|
97
103
|
|
98
|
-
>>
|
99
|
-
|
104
|
+
>> Groonga::Schema.change_table("Items") do |table|
|
105
|
+
?> table.text("title")
|
106
|
+
>> end
|
107
|
+
=> [...]
|
100
108
|
|
101
|
-
|
102
|
-
|
103
|
-
います。
|
109
|
+
定義したカラムは「#{テーブル名}.#{カラム名}」という名前になります。
|
110
|
+
テーブルと同じようにGroonga.[]で参照できます。
|
104
111
|
|
105
|
-
|
106
|
-
|
107
|
-
いう名前でテーブルを定義します。
|
112
|
+
>> title_column = Groonga["Items.title"]
|
113
|
+
=> #<Groonga::VariableSizeColumn ...>
|
108
114
|
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
115
|
+
全文検索するために、文字列を分解して得られる各単語を格納する
|
116
|
+
ためのテーブルを別途用意します。ここではTermsという名前でテー
|
117
|
+
ブルを定義します。
|
118
|
+
|
119
|
+
>> Groonga::Schema.create_table("Terms",
|
120
|
+
?> :type => :patricia_trie,
|
121
|
+
?> :key_normalize => true,
|
122
|
+
?> :default_tokenizer => "TokenBigram")
|
113
123
|
|
114
124
|
ここでは、トークナイザとして<tt>:default_tokenzier =>
|
115
|
-
"TokenBigram"</tt>
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
125
|
+
"TokenBigram"</tt> を指定しています。トークナイザとは文字列を
|
126
|
+
単語に分解するオブジェクトのことです。デフォルトではトークナ
|
127
|
+
イザは指定されていません。全文検索を利用するためにはトークナ
|
128
|
+
イザを指定する必要があるので、ここではN-gramの一種であるバイ
|
129
|
+
グラムを指定しています。
|
120
130
|
|
121
131
|
N-gramを利用した全文検索では、分解したN文字とその出現位置を利
|
122
132
|
用して全文検索を行います。N-gramのNは文字列を何文字毎に分解す
|
123
133
|
るかの文字数になります。groongaは1文字で分解するユニグラム、
|
124
134
|
2文字のバイグラム、3文字のトリグラムをサポートしています。
|
125
135
|
|
136
|
+
また、大文字小文字の区別なく検索するために<tt>:key_normalize
|
137
|
+
=> true</tt>も指定しています。
|
138
|
+
|
126
139
|
単語格納用テーブルの準備ができたので、<tt>Items</tt>テーブ
|
127
140
|
ルの+title+カラムに対するインデックスを定義します。
|
128
141
|
|
129
|
-
>>
|
130
|
-
|
131
|
-
|
142
|
+
>> Groonga::Schema.change_table("Terms") do |table|
|
143
|
+
?> table.index("Items.title")
|
144
|
+
>> end
|
145
|
+
=> [...]
|
132
146
|
|
133
147
|
少し違和感を感じるかも知れませんが、<tt>Items</tt>テーブル
|
134
148
|
のカラムに対するインデックスは、<tt>Terms</tt>テーブルのカ
|
@@ -148,22 +162,31 @@ N-gramを利用した全文検索では、分解したN文字とその出現位
|
|
148
162
|
|
149
163
|
先ほど登録した各レコードの+title+カラムに値をセットします。
|
150
164
|
|
151
|
-
>> items
|
165
|
+
>> items["http://ja.wikipedia.org/wiki/Ruby"].title = "Ruby"
|
152
166
|
=> "Ruby"
|
153
|
-
>> items
|
167
|
+
>> items["http://www.ruby-lang.org/ja/"].title = "オブジェクトスクリプト言語Ruby"
|
154
168
|
"オブジェクトスクリプト言語Ruby"
|
155
169
|
|
156
170
|
以下のようにして検索することができます。
|
157
171
|
|
158
|
-
>>
|
159
|
-
|
172
|
+
>> ruby_items = items.select {|record| record.title =~ "Ruby"}
|
173
|
+
=> #<Groonga::Hash ..., size: <2>>
|
160
174
|
|
161
175
|
検索結果はGroonga::Hashで返されます。ハッシュのキーに見つかっ
|
162
|
-
た<tt>Items</tt
|
163
|
-
+record.key+で<tt>Items</tt>のレコードを取得して、さらにそ
|
164
|
-
のキーを指定して(+record.key.key+)で<tt>Items</tt>のキー
|
165
|
-
を返しています。
|
176
|
+
た<tt>Items</tt>のレコードが入っています。
|
166
177
|
|
178
|
+
>> ruby_items.collect {|record| record.key.key}
|
179
|
+
=> ["http://ja.wikipedia.org/wiki/Ruby", "http://www.ruby-lang.org/ja/"]
|
180
|
+
|
181
|
+
上の例では+record.key+で<tt>Items</tt>のレコードを取得して、
|
182
|
+
さらにそのキーを指定して(+record.key.key+)で<tt>Items</tt>
|
183
|
+
のキーを返しています。
|
184
|
+
|
185
|
+
+record["_key"]+でアクセスすると自動的に参照しているレコード
|
186
|
+
を辿っていき、参照先のキーにアクセスできます。
|
187
|
+
|
188
|
+
>> ruby_items.collect {|record| record["_key"]}
|
189
|
+
=> ["http://ja.wikipedia.org/wiki/Ruby", "http://www.ruby-lang.org/ja/"]
|
167
190
|
|
168
191
|
== マルチユーザ向けのブックマークアプリケーション
|
169
192
|
|
@@ -178,37 +201,35 @@ http://qwik.jp/senna/senna2.files/rect4605.png
|
|
178
201
|
|
179
202
|
まず、<tt>Users</tt>テーブルを追加します。
|
180
203
|
|
181
|
-
>>
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
=> #<Groonga::VarSizeColumn ...>
|
186
|
-
|
204
|
+
>> Groonga::Schema.create_table("Users", :type => :hash) do |table|
|
205
|
+
?> table.text("name")
|
206
|
+
>> end
|
207
|
+
=> [...]
|
187
208
|
|
188
209
|
次に、<tt>Comments</tt>テーブルを追加します。
|
189
210
|
|
190
|
-
>>
|
191
|
-
|
192
|
-
>>
|
193
|
-
|
194
|
-
>>
|
195
|
-
|
196
|
-
|
197
|
-
=> #<Groonga::VarSizeColumn ..>
|
198
|
-
>> comments.define_column("issued", "Time")
|
199
|
-
=> #<Groonga::FixSizeColumn ..>
|
211
|
+
>> Groonga::Schema.create_table("Comments") do |table|
|
212
|
+
?> table.reference("item")
|
213
|
+
>> table.reference("author", "Users")
|
214
|
+
>> table.text("content")
|
215
|
+
>> table.time("issued")
|
216
|
+
>> end
|
217
|
+
=> [...]
|
200
218
|
|
201
219
|
<tt>Comments</tt>テーブルの+content+カラムを全文検索できる
|
202
220
|
ようにインデックスを定義します。
|
203
221
|
|
204
|
-
>>
|
205
|
-
|
206
|
-
|
222
|
+
>> Groonga::Schema.change_table("Terms") do |table|
|
223
|
+
?> table.index("Comments.content")
|
224
|
+
>> end
|
225
|
+
=> [...]
|
207
226
|
|
208
227
|
これでテーブルが定義できました。
|
209
228
|
|
210
229
|
続いてユーザを何人か追加します。
|
211
230
|
|
231
|
+
>> users = Groonga["Users"]
|
232
|
+
=> #<Groonga::Hash ...>
|
212
233
|
>> users.add("moritan", :name => "モリタン")
|
213
234
|
=> #<Groonga::Record ...>
|
214
235
|
>> users.add("taporobo", :name => "タポロボ")
|
@@ -217,28 +238,32 @@ http://qwik.jp/senna/senna2.files/rect4605.png
|
|
217
238
|
次に、実際にユーザがブックマークを貼る時の処理を実行してみま
|
218
239
|
しょう。
|
219
240
|
|
220
|
-
ユーザ+moritan
|
221
|
-
|
241
|
+
ユーザ+moritan+が、Ruby関連のとあるページをブックマークしたと
|
242
|
+
想定します。
|
222
243
|
|
223
244
|
まず対象のページが<tt>Items</tt>テーブルに登録済かどうか調
|
224
245
|
べます。
|
225
246
|
|
226
|
-
>> items.
|
227
|
-
=>
|
247
|
+
>> items.has_key?("http://www.rubyist.net/~matz/")
|
248
|
+
=> false
|
228
249
|
|
229
250
|
未登録なのでまず当該ページを<tt>Items</tt>に登録します。
|
230
251
|
|
231
|
-
>> items.add("http://
|
232
|
-
|
252
|
+
>> items.add("http://www.rubyist.net/~matz/",
|
253
|
+
?> :title => "Matzにっき")
|
233
254
|
=> #<Groonga::Record ...>
|
234
255
|
|
235
256
|
次に、登録したitemを+item+カラムの値に指定して
|
236
257
|
<tt>Comments</tt>にレコードを登録します。
|
237
258
|
|
238
|
-
>>
|
239
|
-
|
240
|
-
|
241
|
-
|
259
|
+
>> require "time"
|
260
|
+
=> true
|
261
|
+
>> comments = Groonga["Comments"]
|
262
|
+
=> #<Groonga::Array ...>
|
263
|
+
>> comments.add(:item => "http://www.rubyist.net/~matz/",
|
264
|
+
?> :author => "moritan",
|
265
|
+
?> :content => "Ruby Matz",
|
266
|
+
?> :issued => Time.parse("2010-11-20T18:01:22+09:00"))
|
242
267
|
=> #<Groonga::Record ...>
|
243
268
|
|
244
269
|
== メソッド化
|
@@ -246,14 +271,17 @@ http://qwik.jp/senna/senna2.files/rect4605.png
|
|
246
271
|
上記の一連の手続きをメソッドにまとめてみます。
|
247
272
|
|
248
273
|
>> @items = items
|
274
|
+
=> #<Groonga::Hash ...>
|
249
275
|
>> @comments = comments
|
276
|
+
=> #<Groonga::Array ...>
|
250
277
|
>> def add_bookmark(url, title, author, content, issued)
|
251
|
-
>> item = @items
|
278
|
+
>> item = @items[url] || @items.add(url, :title => title)
|
252
279
|
>> @comments.add(:item => item,
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
>>
|
280
|
+
?> :author => author,
|
281
|
+
?> :content => content,
|
282
|
+
?> :issued => issued)
|
283
|
+
>> end
|
284
|
+
=> nil
|
257
285
|
|
258
286
|
+itmes+と+comments+をインスタンス変数に代入しているのはメソッ
|
259
287
|
ド内からでも見えるようにするためです。
|
@@ -267,15 +295,18 @@ http://qwik.jp/senna/senna2.files/rect4605.png
|
|
267
295
|
作成したメソッドを呼び出していくつかブックマークを登録してみ
|
268
296
|
ましょう。
|
269
297
|
|
270
|
-
>> add_bookmark("http://
|
271
|
-
|
298
|
+
>> add_bookmark("http://jp.rubyist.net/magazine/",
|
299
|
+
?> "Rubyist Magazine - るびま", "moritan", "Ruby 記事",
|
300
|
+
?> Time.parse("2010-10-07T14:18:28+09:00"))
|
272
301
|
=> #<Groonga::Record ...>
|
273
|
-
>> add_bookmark("http://
|
274
|
-
|
302
|
+
>> add_bookmark("http://groonga.rubyforge.org/",
|
303
|
+
?> "Rubyでgroonga使って全文検索 - ラングバ", "taporobo",
|
304
|
+
?> "Ruby groonga 全文検索",
|
305
|
+
?> Time.parse("2010-11-11T12:39:59+09:00"))
|
275
306
|
=> #<Groonga::Record ...>
|
276
|
-
>> add_bookmark("http://
|
277
|
-
|
278
|
-
|
307
|
+
>> add_bookmark("http://www.rubyist.net/~matz/",
|
308
|
+
?> "Matz日記", "taporobo", "Ruby 日記",
|
309
|
+
?> Time.parse("2010-07-28T20:46:23+09:00"))
|
279
310
|
=> #<Groonga::Record ...>
|
280
311
|
|
281
312
|
== 全文検索その2
|
@@ -283,25 +314,27 @@ http://qwik.jp/senna/senna2.files/rect4605.png
|
|
283
314
|
登録したレコードに対して全文検索を実行してみます。
|
284
315
|
|
285
316
|
>> records = comments.select do |record|
|
286
|
-
|
287
|
-
>>
|
317
|
+
?> record["content"] =~ "Ruby"
|
318
|
+
>> end
|
319
|
+
=> #<Groonga::Hash ...>
|
288
320
|
>> records.each do |record|
|
289
|
-
|
321
|
+
?> record = record.key
|
290
322
|
>> p [record.id,
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
>>
|
296
|
-
[1, Sat
|
297
|
-
[2,
|
298
|
-
[3,
|
299
|
-
[4,
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
323
|
+
?> record.issued,
|
324
|
+
?> record.item.title,
|
325
|
+
?> record.author.name,
|
326
|
+
?> record.content]
|
327
|
+
>> end
|
328
|
+
[1, Sat Nov 20 18:01:22 +0900 2010, "Matzにっき", "モリタン", "Ruby Matz"]
|
329
|
+
[2, Thu Oct 07 14:18:28 +0900 2010, "Rubyist Magazine - るびま", "モリタン", "Ruby 記事"]
|
330
|
+
[3, Thu Nov 11 12:39:59 +0900 2010, "Rubyでgroonga使って全文検索 - ラングバ", "タポロボ", "Ruby groonga 全文検索検"]
|
331
|
+
[4, Wed Jul 28 20:46:23 +0900 2010, "Matzにっき", "タポロボ", "Ruby 日記"]
|
332
|
+
|
333
|
+
カラム名と同じメソッドでカラムへのアクセスできます。複合デー
|
334
|
+
タ型の要素も再帰的に辿ることができます。(同様の出力を普通の
|
335
|
+
RDBで実現するためには、<tt>Items</tt>テーブル、
|
336
|
+
<tt>Comments</tt>テーブル、<tt>Users</tt>テーブルのJOIN操作が
|
337
|
+
必要になります。)
|
305
338
|
|
306
339
|
上の式の中で、肝心の検索処理は、第一引数の式を評価する時点で
|
307
340
|
完了していて、レコードセットオブジェクトとしてメモリに蓄積さ
|
@@ -314,31 +347,33 @@ http://qwik.jp/senna/senna2.files/rect4605.png
|
|
314
347
|
|
315
348
|
以下は、日付で降順にソートしてから出力した例です。
|
316
349
|
|
317
|
-
>> records.sort([{:key => "
|
318
|
-
|
350
|
+
>> records.sort([{:key => "issued", :order => "descending"}]).each do |record|
|
351
|
+
?> record = record.key
|
319
352
|
>> p [record.id,
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
>>
|
325
|
-
[
|
326
|
-
[
|
327
|
-
[
|
328
|
-
[
|
353
|
+
?> record.issued,
|
354
|
+
?> record.item.title,
|
355
|
+
?> record.author.name,
|
356
|
+
?> record.content]
|
357
|
+
>> end
|
358
|
+
[1, Sat Nov 20 18:01:22 +0900 2010, "Matzにっき", "モリタン", "Ruby Matz"]
|
359
|
+
[3, Thu Nov 11 12:39:59 +0900 2010, "Rubyでgroonga使って全文検索 - ラングバ", "タポロボ", "Ruby groonga 全文検索"]
|
360
|
+
[2, Thu Oct 07 14:18:28 +0900 2010, "Rubyist Magazine - るびま", "モリタン", "Ruby 記事"]
|
361
|
+
[4, Wed Jul 28 20:46:23 +0900 2010, "Matzにっき, "タポロボ", "Ruby 日記"]
|
362
|
+
=> [...]
|
329
363
|
|
330
364
|
同じitemが何度も出てくると検索結果が見にくいので、item毎にグ
|
331
365
|
ループ化してみます。
|
332
366
|
|
333
367
|
>> records.group("item").each do |record|
|
334
|
-
|
368
|
+
?> item = record.key
|
335
369
|
>> p [record.n_sub_records,
|
336
|
-
|
337
|
-
|
338
|
-
>>
|
339
|
-
[
|
340
|
-
[
|
341
|
-
[1, "http://
|
370
|
+
?> item.key,
|
371
|
+
?> item.title]
|
372
|
+
>> end
|
373
|
+
[2, "http://www.rubyist.net/~matz/", "Matzにっき"]
|
374
|
+
[1, "http://jp.rubyist.net/magazine/", "Rubyist Magazine - るびま"]
|
375
|
+
[1, "http://groonga.rubyforge.org/", "Rubyでgroonga使って全文検索 - ラングバ"]
|
376
|
+
=> nil
|
342
377
|
|
343
378
|
+n_sub_records+というのはグループ化した単位に含まれるレコード
|
344
379
|
の件数を示します。SQLで言えば、GROUP BY句を含むクエリのcount
|
@@ -346,8 +381,6 @@ http://qwik.jp/senna/senna2.files/rect4605.png
|
|
346
381
|
|
347
382
|
== 少し複雑な検索
|
348
383
|
|
349
|
-
↓はまだ動かない!!!
|
350
|
-
|
351
384
|
さらに実用的な検索について考えてみましょう。
|
352
385
|
|
353
386
|
ブックマークが大量に蓄積されるに従って、より的確に適合度を算
|
@@ -373,22 +406,28 @@ http://qwik.jp/senna/senna2.files/rect4605.png
|
|
373
406
|
以下のようにして、commentとitemとそれぞれに対する検索結果を求
|
374
407
|
めます。
|
375
408
|
|
376
|
-
>> ruby_comments = @comments.select {|record| record
|
377
|
-
#<Groonga::Hash ..., size: <
|
378
|
-
>> ruby_items = @items.select
|
379
|
-
|
409
|
+
>> ruby_comments = @comments.select {|record| record.content =~ "Ruby"}
|
410
|
+
=> #<Groonga::Hash ..., size: <4>
|
411
|
+
>> ruby_items = @items.select do |record|
|
412
|
+
?> target = record.match_target do |match_record|
|
413
|
+
?> match_record.title * 10
|
414
|
+
>> end
|
415
|
+
>> target =~ "Ruby"
|
416
|
+
>> end
|
417
|
+
#<Groonga::Hash ..., size: <4>>
|
380
418
|
|
381
419
|
_ruby_comments_の結果をitem毎にグループ化し、_ruby_items_と
|
382
420
|
unionして出力します。
|
383
421
|
|
384
422
|
>> ruby_items = ruby_comments.group("item").union!(ruby_items)
|
385
|
-
#<Groonga::Hash ..., size: <
|
386
|
-
>> ruby_items.sort([{:key => "
|
387
|
-
>> p [record
|
423
|
+
#<Groonga::Hash ..., size: <5>>
|
424
|
+
>> ruby_items.sort([{:key => "_score", :order => "descending"}]).each do |record|
|
425
|
+
>> p [record.score, record.title]
|
388
426
|
>> end
|
389
|
-
[
|
390
|
-
[
|
391
|
-
[
|
392
|
-
[
|
427
|
+
[10, "Rubyist Magazine - るびま"]
|
428
|
+
[10, "Ruby"]
|
429
|
+
[10, "Rubyでgroonga使って全文検索 - ラングバ"]
|
430
|
+
[10, "オブジェクトスクリプト言語Ruby"]
|
431
|
+
[2, "Matzにっき"]
|
393
432
|
|
394
|
-
|
433
|
+
これで目的の結果が得られました。
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rroonga
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 1.0.
|
9
|
+
- 2
|
10
|
+
version: 1.0.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Kouhei Sutou
|
@@ -19,13 +19,27 @@ autorequire:
|
|
19
19
|
bindir: bin
|
20
20
|
cert_chain: []
|
21
21
|
|
22
|
-
date: 2010-
|
22
|
+
date: 2010-11-25 00:00:00 +09:00
|
23
23
|
default_executable:
|
24
24
|
dependencies:
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
|
-
name:
|
26
|
+
name: pkg-config
|
27
27
|
prerelease: false
|
28
28
|
requirement: &id001 !ruby/object:Gem::Requirement
|
29
|
+
none: false
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
hash: 3
|
34
|
+
segments:
|
35
|
+
- 0
|
36
|
+
version: "0"
|
37
|
+
type: :runtime
|
38
|
+
version_requirements: *id001
|
39
|
+
- !ruby/object:Gem::Dependency
|
40
|
+
name: rubyforge
|
41
|
+
prerelease: false
|
42
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
29
43
|
none: false
|
30
44
|
requirements:
|
31
45
|
- - ">="
|
@@ -37,7 +51,7 @@ dependencies:
|
|
37
51
|
- 4
|
38
52
|
version: 2.0.4
|
39
53
|
type: :development
|
40
|
-
version_requirements: *
|
54
|
+
version_requirements: *id002
|
41
55
|
description: |-
|
42
56
|
rroonga is a extension library to use groonga's DB-API
|
43
57
|
layer. rroonga provides Rubyish readable and writable
|
@@ -51,12 +65,12 @@ executables: []
|
|
51
65
|
extensions:
|
52
66
|
- extconf.rb
|
53
67
|
extra_rdoc_files:
|
54
|
-
- text/expression.rdoc
|
55
|
-
- text/TUTORIAL.ja.rdoc
|
56
68
|
- NEWS.rdoc
|
57
|
-
- README.rdoc
|
58
|
-
- README.ja.rdoc
|
59
69
|
- NEWS.ja.rdoc
|
70
|
+
- README.ja.rdoc
|
71
|
+
- README.rdoc
|
72
|
+
- text/expression.rdoc
|
73
|
+
- text/tutorial.ja.rdoc
|
60
74
|
files:
|
61
75
|
- AUTHORS
|
62
76
|
- NEWS.ja.rdoc
|
@@ -73,6 +87,7 @@ files:
|
|
73
87
|
- example/search/public/css/groonga.css
|
74
88
|
- ext/.gitignore
|
75
89
|
- ext/groonga/extconf.rb
|
90
|
+
- ext/groonga/groonga.def
|
76
91
|
- ext/groonga/mkmf.log
|
77
92
|
- ext/groonga/rb-grn-accessor.c
|
78
93
|
- ext/groonga/rb-grn-array-cursor.c
|
@@ -118,15 +133,16 @@ files:
|
|
118
133
|
- html/developer.svg
|
119
134
|
- html/download.svg
|
120
135
|
- html/favicon.ico
|
121
|
-
- html/favicon.
|
136
|
+
- html/favicon.svg
|
122
137
|
- html/footer.html.erb
|
123
138
|
- html/head.html.erb
|
124
139
|
- html/header.html.erb
|
125
140
|
- html/heading-mark.svg
|
126
141
|
- html/index.html
|
127
142
|
- html/install.svg
|
128
|
-
- html/logo.
|
143
|
+
- html/logo.svg
|
129
144
|
- html/ranguba.css
|
145
|
+
- html/readme.svg
|
130
146
|
- html/tutorial.svg
|
131
147
|
- lib/groonga.rb
|
132
148
|
- lib/groonga/context.rb
|
@@ -136,12 +152,86 @@ files:
|
|
136
152
|
- lib/groonga/record.rb
|
137
153
|
- lib/groonga/schema.rb
|
138
154
|
- lib/groonga/view-record.rb
|
139
|
-
- license/GPL
|
140
155
|
- license/LGPL
|
141
|
-
- license/RUBY
|
142
156
|
- misc/grnop2ruby.rb
|
143
|
-
- pkg-config.rb
|
144
157
|
- rroonga-build.rb
|
158
|
+
- test-unit/Rakefile
|
159
|
+
- test-unit/TODO
|
160
|
+
- test-unit/bin/testrb
|
161
|
+
- test-unit/html/classic.html
|
162
|
+
- test-unit/html/index.html
|
163
|
+
- test-unit/html/index.html.ja
|
164
|
+
- test-unit/lib/test/unit.rb
|
165
|
+
- test-unit/lib/test/unit/assertionfailederror.rb
|
166
|
+
- test-unit/lib/test/unit/assertions.rb
|
167
|
+
- test-unit/lib/test/unit/attribute.rb
|
168
|
+
- test-unit/lib/test/unit/autorunner.rb
|
169
|
+
- test-unit/lib/test/unit/collector.rb
|
170
|
+
- test-unit/lib/test/unit/collector/descendant.rb
|
171
|
+
- test-unit/lib/test/unit/collector/dir.rb
|
172
|
+
- test-unit/lib/test/unit/collector/load.rb
|
173
|
+
- test-unit/lib/test/unit/collector/objectspace.rb
|
174
|
+
- test-unit/lib/test/unit/color-scheme.rb
|
175
|
+
- test-unit/lib/test/unit/color.rb
|
176
|
+
- test-unit/lib/test/unit/diff.rb
|
177
|
+
- test-unit/lib/test/unit/error.rb
|
178
|
+
- test-unit/lib/test/unit/exceptionhandler.rb
|
179
|
+
- test-unit/lib/test/unit/failure.rb
|
180
|
+
- test-unit/lib/test/unit/fixture.rb
|
181
|
+
- test-unit/lib/test/unit/notification.rb
|
182
|
+
- test-unit/lib/test/unit/omission.rb
|
183
|
+
- test-unit/lib/test/unit/pending.rb
|
184
|
+
- test-unit/lib/test/unit/priority.rb
|
185
|
+
- test-unit/lib/test/unit/runner/console.rb
|
186
|
+
- test-unit/lib/test/unit/runner/emacs.rb
|
187
|
+
- test-unit/lib/test/unit/runner/tap.rb
|
188
|
+
- test-unit/lib/test/unit/testcase.rb
|
189
|
+
- test-unit/lib/test/unit/testresult.rb
|
190
|
+
- test-unit/lib/test/unit/testsuite.rb
|
191
|
+
- test-unit/lib/test/unit/ui/console/outputlevel.rb
|
192
|
+
- test-unit/lib/test/unit/ui/console/testrunner.rb
|
193
|
+
- test-unit/lib/test/unit/ui/emacs/testrunner.rb
|
194
|
+
- test-unit/lib/test/unit/ui/tap/testrunner.rb
|
195
|
+
- test-unit/lib/test/unit/ui/testrunner.rb
|
196
|
+
- test-unit/lib/test/unit/ui/testrunnermediator.rb
|
197
|
+
- test-unit/lib/test/unit/ui/testrunnerutilities.rb
|
198
|
+
- test-unit/lib/test/unit/util/backtracefilter.rb
|
199
|
+
- test-unit/lib/test/unit/util/method-owner-finder.rb
|
200
|
+
- test-unit/lib/test/unit/util/observable.rb
|
201
|
+
- test-unit/lib/test/unit/util/procwrapper.rb
|
202
|
+
- test-unit/lib/test/unit/version.rb
|
203
|
+
- test-unit/sample/adder.rb
|
204
|
+
- test-unit/sample/subtracter.rb
|
205
|
+
- test-unit/sample/test_adder.rb
|
206
|
+
- test-unit/sample/test_subtracter.rb
|
207
|
+
- test-unit/sample/test_user.rb
|
208
|
+
- test-unit/test/collector/test-descendant.rb
|
209
|
+
- test-unit/test/collector/test-load.rb
|
210
|
+
- test-unit/test/collector/test_dir.rb
|
211
|
+
- test-unit/test/collector/test_objectspace.rb
|
212
|
+
- test-unit/test/run-test.rb
|
213
|
+
- test-unit/test/test-attribute.rb
|
214
|
+
- test-unit/test/test-color-scheme.rb
|
215
|
+
- test-unit/test/test-color.rb
|
216
|
+
- test-unit/test/test-diff.rb
|
217
|
+
- test-unit/test/test-emacs-runner.rb
|
218
|
+
- test-unit/test/test-fixture.rb
|
219
|
+
- test-unit/test/test-notification.rb
|
220
|
+
- test-unit/test/test-omission.rb
|
221
|
+
- test-unit/test/test-pending.rb
|
222
|
+
- test-unit/test/test-priority.rb
|
223
|
+
- test-unit/test/test-testcase.rb
|
224
|
+
- test-unit/test/test_assertions.rb
|
225
|
+
- test-unit/test/test_error.rb
|
226
|
+
- test-unit/test/test_failure.rb
|
227
|
+
- test-unit/test/test_testresult.rb
|
228
|
+
- test-unit/test/test_testsuite.rb
|
229
|
+
- test-unit/test/testunit-test-util.rb
|
230
|
+
- test-unit/test/ui/test_testrunmediator.rb
|
231
|
+
- test-unit/test/util/test-method-owner-finder.rb
|
232
|
+
- test-unit/test/util/test_backtracefilter.rb
|
233
|
+
- test-unit/test/util/test_observable.rb
|
234
|
+
- test-unit/test/util/test_procwrapper.rb
|
145
235
|
- test/.gitignore
|
146
236
|
- test/groonga-test-utils.rb
|
147
237
|
- test/run-test.rb
|
@@ -182,8 +272,8 @@ files:
|
|
182
272
|
- test/test-vector-column.rb
|
183
273
|
- test/test-version.rb
|
184
274
|
- test/test-view.rb
|
185
|
-
- text/TUTORIAL.ja.rdoc
|
186
275
|
- text/expression.rdoc
|
276
|
+
- text/tutorial.ja.rdoc
|
187
277
|
has_rdoc: true
|
188
278
|
homepage: http://groonga.rubyforge.org/
|
189
279
|
licenses: []
|