[Senna-dev 750] データによって英字全角データがヒットしない件

アーカイブの一覧に戻る

ashib****@yahoo***** ashib****@yahoo*****
2008年 1月 15日 (火) 14:27:14 JST


はじめまして。渋谷です。
表題の件について質問させてください。

http://lists.sourceforge.jp/mailman/archives/senna-dev/2007-August/000663.html
の「 NGRAM での英数字の部分一致検索について」にかぶるところがあるかも知れません。

実際には井上さんが構築された環境を使って、全文一致検索について検証しているのですが
取得したいデータがとれない場合があるのでご相談です。

全角、反感の英字で、ヒットする場合とヒットしない場合とが、入力されるデータによって変化してしまいます。

例としましては、以下の3つのテーブルを作成して、データを挿入します。

******************
CREATE TABLE t1 (c1 TEXT, FULLTEXT INDEX ft USING NGRAM (c1)) ENGINE = MyISAM DEFAULT CHARSET utf8;
INSERT INTO t1 (c1) VALUES("極めるMySQLの技");
INSERT INTO t1 (c1) VALUES("極めるMySQLの技");
INSERT INTO t1 (c1) VALUES("こういう人がいいね!PHPでMySQLを使ってWEBサーバ構築");
INSERT INTO t1 (c1) VALUES("こういう人がいいね!phpでMySQLを使ってwebサーバ構築");
INSERT INTO t1 (c1) VALUES("VB6.0とSQL、Oracle!今日から朝は元気に6時に起きようと思ったのですが、結局起きれませんでした。。無念。明日は7:30からジムでトレーニングなので、なにがなんでも起きないとだめですねー。そろそろお昼にしますか");
INSERT INTO t1 (c1) VALUES("VB6.0とSQL、Oracle!今日から朝は元気に6時に起きようと思ったのですが、結局起きれませんでした。。無念。明日は7:30からジムでトレーニングなので、なにがなんでも起きないとだめですねー。そろそろお昼にしますか");
INSERT INTO t1 (c1) VALUES("JAVAかCOBOL開発経験。SQLによるDBアクセス経験。♪今日の朝は納豆ゴハン2杯");
INSERT INTO t1 (c1) VALUES("JAVAかCOBOL開発経験。SQLによるDBアクセス経験。♪今日の朝は納豆ゴハン2杯");
commit;

*****************************************

CREATE TABLE t2 (c1 TEXT, FULLTEXT INDEX ft USING NGRAM (c1)) ENGINE = MyISAM DEFAULT CHARSET utf8;
INSERT INTO t2 (c1) VALUES("極めるMySQLの技");
INSERT INTO t2 (c1) VALUES("極めるMySQLの技");
INSERT INTO t2 (c1) VALUES("JAVAかCOBOL開発経験。SQLによるDBアクセス経験。♪今日の朝は納豆ゴハン2杯");
INSERT INTO t2 (c1) VALUES("JAVAかCOBOL開発経験。SQLによるDBアクセス経験。♪今日の朝は納豆ゴハン2杯");
INSERT INTO t2 (c1) VALUES("こういう人がいいね!PHPでMySQLを使ってWEBサーバ構築");
INSERT INTO t2 (c1) VALUES("こういう人がいいね!phpでMySQLを使ってwebサーバ構築");
commit;

**************************************

CREATE TABLE t3 (c1 TEXT, FULLTEXT INDEX ft USING NGRAM (c1)) ENGINE = MyISAM DEFAULT CHARSET utf8;
INSERT INTO t3 (c1) VALUES("極めるMySQLの技");
INSERT INTO t3 (c1) VALUES("極めるMySQLの技");
INSERT INTO t3 (c1) VALUES("こういう人がいいね!PHPでMySQLを使ってWEBサーバ構築");
INSERT INTO t3 (c1) VALUES("こういう人がいいね!phpでMySQLを使ってwebサーバ構築");
INSERT INTO t3 (c1) VALUES("JAVAかCOBOL開発経験。SQLによるDBアクセス経験。♪今日の朝は納豆ゴハン2杯");
INSERT INTO t3 (c1) VALUES("JAVAかCOBOL開発経験。SQLによるDBアクセス経験。♪今日の朝は納豆ゴハン2杯");
commit;


ここで、PHPとPHPで検索した場合、
どのテーブルも、以下の2件がヒットし、問題はありません。

+-----------------------------------------------------------------------------------------------+
| c1                                                 &
nbsp;                                          |
+-----------------------------------------------------------------------------------------------+
| こういう人がいいね!PHPでMySQLを使ってWEBサーバ構築                                |
| こういう人がいいね!phpでMySQLを使ってwebサーバ構築                                           |
+-----------------------------------------------------------------------------------------------+

ですが、JAVA、JAVAで検索した場合、t2以外のテーブルは、半角のデータしかヒットしなくなります。

****************************************

mysql> select c1 from t1 where match(c1) against('JAVA');
+-----------------------------------------------------------------------------------------------------+
| c1                                                 &
nbsp;                                                |
+-----------------------------------------------------------------------------------------------------+
| JAVAかCOBOL開発経験。SQLによるDBアクセス経験。♪今日の朝は納豆ゴハン2杯                              |
+-----------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> select c1 from t1 where match(c1) against('JAVA');
+-----------------------------------------------------------------------------------------------------+
| c1                                                 &
nbsp;                                                |
+-----------------------------------------------------------------------------------------------------+
| JAVAかCOBOL開発経験。SQLによるDBアクセス経験。♪今日の朝は納豆ゴハン2杯                              |
+-----------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> select c1 from t2 where match(c1) against('JAVA');
+-----------------------------------------------------------------------------------------------------------------------------------+
| c1                                                 &
nbsp;                                                 ;                             |
+-----------------------------------------------------------------------------------------------------------------------------------+
| JAVAかCOBOL開発経験。SQLによるDBアクセス経験。♪今日の朝は納豆ゴハン2杯                                   &
nbsp;         |
| JAVAかCOBOL開発経験。SQLによるDBアクセス経験。♪今日の朝は納豆ゴハン2杯                                                            |
+-----------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> select c1 from t2 where match(c1) against('JAVA');
+-----------------------------------------------------------------------------------------------------------------------------------+
| c1                                                 &
nbsp;                                                 ;                             |
+-----------------------------------------------------------------------------------------------------------------------------------+
| JAVAかCOBOL開発経験。SQLによるDBアクセス経験。♪今日の朝は納豆ゴハン2杯                                   &
nbsp;         |
| JAVAかCOBOL開発経験。SQLによるDBアクセス経験。♪今日の朝は納豆ゴハン2杯                                                            |
+-----------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> select c1 from t3 where match(c1) against('JAVA');
+-----------------------------------------------------------------------------------------------------+
| c1                                                 &
nbsp;                                                |
+-----------------------------------------------------------------------------------------------------+
| JAVAかCOBOL開発経験。SQLによるDBアクセス経験。♪今日の朝は納豆ゴハン2杯                              |
+-----------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> select c1 from t3 where match(c1) against('JAVA');
+-----------------------------------------------------------------------------------------------------+
| c1                                                 &
nbsp;                                                |
+-----------------------------------------------------------------------------------------------------+
| JAVAかCOBOL開発経験。SQLによるDBアクセス経験。♪今日の朝は納豆ゴハン2杯                              |
+-----------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

****************************************

入力データに問題があるのか、それともSQL文を工夫しなくてはならないのか、という点をご教授いただけないでしょうか。
コンパイルでは、

バージョンは、下記の2パターンで試しています。※どちらのバージョンも結果は同じでした。

両方とも、http://lists.sourceforge.jp/mailman/archives/senna-dev/2007-August/000664.html
での指摘のとおりコメントアウトしてコンパイルしたものです。

senna-1.0.8
mysql-5.0.45-tritonn-1.0.4

senna-1.0.9
mysql-5.0.51-tritonn-1.0.8

よろしくお願いいたします。

 

 
---------------------------------
Easy + Joy + Powerful = Yahoo! Bookmarks x Toolbar



Senna-dev メーリングリストの案内
アーカイブの一覧に戻る