rroonga 1.0.1 → 1.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/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: []
|