Hirano
hirano_verf****@mail*****
2012年 2月 21日 (火) 15:24:30 JST
お世話になっております。平野と申します。
TokenBigramSplitSymbolAlphaDigitを利用した全文検索で、データによって検索が意図した結果になりません。
[環境]
CentOS 5.5(x86_64)
ruby 1.8.7(patchlevel 330)
groonga 1.2.8
rroonga 1.3.0
検索語「to S」で検索を行うとデータによって
ヒットの有無が下記のようになります。
DBデータパターン1
to S(letter ver.)→ ヒット
to S《ラーメン》→ ヒット
DBデータパターン2
to S(letter ver.)→ ヒットしない
to S《ラーメン》→ ヒットしない
to S → ヒット
DBデータパターン2では3件ヒットすると思うのですが、実際は1件ヒットと
なってしまいます。
このような動作になる理由を教えていただけないでしょうか。
よろしくお願いいたします。
以下、検証で使用したソースコードです。
=====================================================
#!/usr/local/bin/ruby
require "rubygems"
gem "rroonga", "=1.3.0"
require "groonga"
$KCODE = "UTF-8"
STDOUT.sync = true
db_path = '/tmp/exam/test.db'
@table_name = 'search_word'
def do_search
result = Groonga[@table_name].select do |record|
record["word"] =~ 'to S'
end
result.each do |record|
r = record.key
puts r.word
end
end
Groonga::Context.default_options = {:encoding => :utf8}
Groonga::Database.create(:path => db_path)
Groonga::Database.open(db_path) do |db|
# DB作成
Groonga::Schema.create_table(
"ift_bigram",
:type => :patricia_trie,
:key_normalize => true,
:key_type => "ShortText",
:default_tokenizer => "TokenBigramSplitSymbolAlphaDigit")
Groonga::Schema.create_table(@table_name, :type => :hash, :key_type => "ShortText") do |t|
t.short_text("word")
end
Groonga::Schema.change_table("ift_bigram") do |t|
t.index(@table_name + ".word")
end
# データ投入
Groonga[@table_name].add("A", :word => "to S(letter ver.)")
Groonga[@table_name].add("B", :word => "to S《ラーメン》")
# 検索(1回目)
puts "--- search No.1 ---"
do_search
# データ追加
Groonga[@table_name].add("C", :word => "to S")
# 検索(2回目)
puts "--- search No.2 ---"
do_search
end
=====================================================