iwasa****@nttda*****
iwasa****@nttda*****
2007年 12月 14日 (金) 19:27:16 JST
岩崎です。こんにちは。
> 最初は'青'で検索できたデータが、途中で別データを追加したらヒットしなくなる
のは、
> 変な気がするのですが、indexの作成方法が間違っているのでしょうか?
この例だと、
- 2-gramでインデックスを作って、1文字('青')で検索しているので、
部分一致(前方一致)検索が走らないと基本的にはヒットしない
('青ノ時代'の場合'青ノ'というトークンの前方一致でひっかかる)
- ただし、検索対象テキストの最後の1文字だけは前方一致でもヒットしないので、
1文字だけのトークンとしてインデックスに入っている
- Sennaのデフォルト設定だと、
1件でも完全一致でヒットすればがあれば部分一致検索は行われない
- '群青'というテキストの場合、最後の1文字が'青'なので完全一致検索でひっかか
る
という感じで、初めの段階では実行された部分一致検索が実行されなくなったため、
というのが原因ではないでしょうか。::
select * from foo where keyword @@ '*E10 青';
のような感じで、
検索処理方法を切り替える閾値を増やして試してみるとよいと思います。
-----Original Message-----
From: senna****@lists*****
[mailto:senna****@lists*****] On Behalf Of Yamada Takuji
Sent: Friday, December 14, 2007 6:59 PM
To: senna****@lists*****
Subject: [Senna-dev 718] 最初に検索できたデータが、別データを追加すると検索
できなくなります
こんにちは、山田です。
非常に分かりにくい表題で申し訳ありません。
以下、現象の説明と、ご質問をさせていただきます。
[環境]
PostgreSQL 8.1.9
Ludia 1.1.0
Senna 1.0.5
[現象]
(1) fooテーブルのkeywordカラムに、下記の条件でindexを作成します。
FOO_DB=> set ludia.sen_index_flags = 18; --#
SEN_INDEX_NGRAM|SEN_INDEX_SPLIT_ALPHA
FOO_DB=> create index foo_idx on foo using fulltextu (keyword);
(2) fooテーブルのkeywordカラムに検索データを1件登録します。
FOO_DB=> insert into foo (keyword) values ('青ノ時代');
(3) fooテーブルを'青'で検索すると、上記の「青ノ時代」がヒットします。
FOO_DB=> select * from foo where keyword @@ '青';
(4) 次にfooテーブルにもう1件データを登録します。
FOO_DB=> insert into foo (keyword) values ('群青');
(5) 再度fooテーブルを'青'で検索すると「群青」はヒットしますが、
「青ノ時代」がヒットしなくなります。
('青ノ'で検索すればヒットします)
[質問]
最初は'青'で検索できたデータが、途中で別データを追加したらヒットしなくなるの
は、
変な気がするのですが、indexの作成方法が間違っているのでしょうか?
もしくは、これがsennaとしては正しい動作になるのでしょうか?
期待している動作としては、'青'で検索したときに「青ノ時代」も「群青」も
どちらもヒットする、というものです。
_______________________________________________
Senna-dev mailing list
Senna****@lists*****
http://lists.sourceforge.jp/mailman/listinfo/senna-dev
バグ報告方法:http://qwik.jp/senna/bug_report.html