[groonga-dev,01514] 特殊記号混じりの前方一致検索について

Back to archive index

mail_babir****@yahoo***** mail_babir****@yahoo*****
2013年 7月 1日 (月) 14:00:08 JST


mroongaを利用させて頂いています。
田辺です。

表題の件についてですが、mroongaの場合、
http://y-ken.hatenablog.com/entry/mroonga-query-escape-string
こちらのブログで紹介されているように、半角特殊記号を用いた検索の場合、ダブルクオートでのエスケープが必要というのが現状かと思います。

ただ、ダブルクオートでのエスケープを行うと、前方一致演算子の「*」を使用できないようです。
特殊記号が含まれている場合にも前方一致を適用する方法はあるでしょうか?

以下再現手順となります。
-------------
CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `main` varchar(255) NOT NULL COLLATE 'utf8_unicode_ci',
  PRIMARY KEY (`id`)
) ENGINE=mroonga DEFAULT CHARSET=utf8;

INSERT INTO `test`(`main`) VALUES ('(仮)テスト テスト1');
ALTER TABLE `test` ADD FULLTEXT (`main`) COMMENT 'parser "TokenDelimit"';

SELECT * FROM `test` WHERE MATCH(`main`) AGAINST('(仮)*' IN BOOLEAN MODE);
#1064 - failed to parse fulltext search keyword: <(仮)*>: <Syntax error! ((仮)*)>

SELECT * FROM `test` WHERE MATCH(`main`) AGAINST('"(仮)*"' IN BOOLEAN MODE);
0件

SELECT * FROM `test` WHERE MATCH(`main`) AGAINST('"(仮)"*' IN BOOLEAN MODE);
#1064 - failed to parse fulltext search keyword: <"(仮"*>: <Syntax error! ("(仮"*)>
-------------

ちなみに、myisamにて同じ検索を行ったところ、クオートせずに期待する検索結果を得ることができました。

また、myisamの場合はダブルクオートで囲んだ内容はフレーズ検索になる仕様ですが、mroongaの場合もそうなっているように思います。
この場合、単にエスケープする用途であっても、連動してフレーズ検索になってしまうように思うのですが、このあたり、動作の認識は合っているでしょうか?

現状では特殊記号をマルチバイト文字に変換してから検索することで、エラーが出ない状態となるため、その方法で調整しています。


また、myisamではエラーとなっていなかった検索クエリが、mroongaを使うことでエラーとなるため、mroonga専用のエスケープ処理をアプリケーションに盛り込まなければならないこととなり、多少手間を感じております。

mroongaが構文エラーと見なした段階で、mroonga側でエスケープ処理をして再度クエリを実行するといったオプション等があると便利なのですが。

可能でしたらご検討頂けますと幸いです。


田辺公平




groonga-dev メーリングリストの案内
Back to archive index