Kouhei Sutou
kou****@clear*****
2013年 4月 22日 (月) 14:39:44 JST
須藤です。 In <77427****@web10*****> "[groonga-dev,01311] Re: utf8_unicode_ci使用時の検索結果について" on Mon, 22 Apr 2013 04:52:47 +0900 (JST), <mail_babir****@yahoo*****> wrote: >> 「ぁ」とかだけならNormalizerMySQLUnicodeCIExpectKanaCIでよさそ >> うです。濁点も区別するとなると、つなげて >> NormalizerMySQLUnicodeCIExpectKanaCIVoicedSoundMarkとかですか >> ねぇ。 >> 「゙」は「U+3099 COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK」 >> で、 >> 「゚」は「U+309A COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK」 >> なので、まとめてVoicedSoundMarkにしてみました。 > > 日本語表記にも色々ネーミングがあるんですね。 > 多少長くても、表現が厳密な方が間違いがなくていいですね! > > そもそも、ノーマライザーとして実装して頂ける時点で有り難いことです。 では、この方向で検討してみます。 >> まず、INDEXをFULLTEXT INDEXにして、parserをTokenDelimitNull >> にします。本当はparserなしにしたいのですが、今はそれはできな >> いのでTokenDelimitNullで代用しています。 > > これは、バイグラムだと先頭2文字までしかヒットしないなどが理由でしょうか? はい、そうです。 この前方一致検索機能は切りだされたトークン毎に処理するので、 「とら」「らっ」「っく」というトークンになっていると 「とらっく」から始まるトークンがないためヒットしないのです。 > ただ、全文インデックスの場合、単一カラムに対してはいいのですが、 > > SELECT * FROM `test` WHERE `main` LIKE 'とらっく%' AND `grp` = 'tag'; > > のような複数条件での検索時に、複合インデックスとして使うには難しいのではないかと思います。 > > SELECT * FROM `test` WHERE MATCH(`main`,`grp`) AGAINST('とらっく* +tag' IN BOOLEAN MODE); > > ではどちらのカラムに「とらっく」「tag」が含まれていてもヒットしてしまいますし、 > > SELECT * FROM `test` WHERE MATCH(`main`) AGAINST('とらっく*' IN BOOLEAN MODE) AND `grp` = 'tag'; > > では全文検索インデックスしか適用されないのではないかと思いますが、このような認識で合っているでしょうか? 以下のように2つのインデックスを作成し、 FULLTEXT INDEX (`main`) COMMENT 'parser "TokenDelimitNull"', INDEX (`grp`), 以下のように検索すると、 SELECT * FROM `test` WHERE MATCH(`main`) AGAINST('とらっく*' IN BOOLEAN MODE) AND `grp` = 'tag'; どちらのインデックスも使っているようにみえました。 (デバッグビルドにしてどのメソッドが呼ばれているか確認してみ た。) もし、そこそこのデータをすでに持っているのであれば、 「INDEX (`grp`)」ありなしで検索時間を比較することでインデッ クスが使われているかどうかを確認できます。インデックスが使わ れていると、ありなしで10倍くらい速度が変わります。ありなしで 速度が変わらない場合はインデックスが使われていません。 -- 須藤 功平 <kou****@clear*****> 株式会社クリアコード <http://www.clear-code.com/> (03-6231-7270) groongaサポート: http://groonga.org/ja/support/ パッチ採用はじめました: http://www.clear-code.com/recruitment/ コミットへのコメントサービスはじめました: http://www.clear-code.com/services/commit-comment.html