Kouhei Sutou
kou****@clear*****
2015年 11月 11日 (水) 11:59:35 JST
須藤です。 In <53122****@web30*****> "[groonga-dev,03648] Re: select文に関して" on Wed, 11 Nov 2015 10:53:59 +0900 (JST), takah****@yahoo***** wrote: > 下記、ご連絡頂きまして誠に有難う御座いました。 > また、既出である事、大変申し訳御座いませんでした。 大丈夫です! (だれか、メーリングリストでのやりとりで明らかになった知見を 参照しやすいようにまとめてくれるとうれしいです!) > --------------------------------------- > ■修飾子の省略の挙動に関して > SELECT * FROM mail00.mail > match(subject) against('ビジネス 最大' IN BOOLEAN MODE) > > 上記はビジネスor最大の論理式で間違い御座いませんでしょうか。 > また('*DOR ビジネス 最大' IN BOOLEAN MODE)と同様の挙動で > 認識相違御座いませんでしょうか。 はい、その通りです。 ただ、↑の中で「+」を使った場合の挙動はMySQL標準の挙動(*)と は異なるので注意してください。 (*) http://dev.mysql.com/doc/refman/5.6/ja/fulltext-boolean.html 詳細は↓のスレッドを参照してください。 https://osdn.jp/projects/groonga/lists/archive/dev/2014-October/002856.html > ■特殊記号に関して > 「こんにちは こんばんわ”''()\」という文言に対して > where match(subject) against('+"()"' IN BOOLEAN MODE) > と書くと上手く抽出出来ず、抽出方法や > 特殊記号にあたる文字が何であるかと、 > 確認したく、自分の探し方が悪いのか、 > 上手くリファレンスが探せず、 > 特殊文字の範囲、扱いに関して、 > URLでも構いませんので、ご教示頂ければ幸いで御座います。 これは特殊記号のエスケープはちゃんとできていて、問題は TokenMecabを使っていることです。 ↓というようにmroonga_commandでtable_tokenizeを実行するとど のようなトークンになるかがわかります。この場合は「''()\\」で ひとつのトークンになっているため「''()\\」そのものでしかヒッ トせず、「()」のように中にある一部の文字列ではヒットしません。 ---- USE mysql; DROP TABLE IF EXISTS mail; SET NAMES utf8mb4; CREATE TABLE mail ( subject text, FULLTEXT INDEX (subject) COMMENT 'tokenizer "TokenMecab"' ) ENGINE=Mroonga DEFAULT CHARSET utf8mb4; SELECT mroonga_command('table_tokenize mail-subject "こんにちは こんばんわ”\\\'\\\'\\\(\\\)\\\\" --mode ADD'); -- [ -- { -- "value": "こんにちは", -- "position": 0, -- "force_prefix": false -- }, -- { -- "value": "こんばんわ", -- "position": 1, -- "force_prefix": false -- }, -- { -- "value": "”", -- "position": 2, -- "force_prefix": false -- }, -- { -- "value": "''()\\\\", -- "position": 3, -- "force_prefix": false -- } -- ] あらゆる部分文字列でヒットさせたい場合は前のメールに書いた TokenRegexpを使ってください。使えるトークナイザーについては ↓を参照してください。 http://groonga.org/ja/docs/reference/tokenizers.html なお、特殊記号については↓を参照してください。 http://groonga.org/ja/docs/reference/grn_expr/query_syntax.html#escape あと、できればでよいのですが、次からは一部のSQLやSQLの一部で はなく、こちらでも試せるSQL一式を教えてもらえると助かります。 (SQL一式とはこのメールや前のメールで私が提示しているような SQLです。) 一部のSQLやSQLの一部だけだとこちらで動作確認をするためにSQL 一式をこちらで作らなければならなくて面倒なのです。。。 たぶん、手元には動作するSQL一式があるはずなので、それを提供し てもらえればこちらで作りなおさなくてもよくなるのです。。。 -- 須藤 功平 <kou****@clear*****> 株式会社クリアコード <http://www.clear-code.com/> Groongaベースの全文検索システムを総合サポート: http://groonga.org/ja/support/ パッチ採用 - プログラミングが楽しい人向けの採用プロセス: http://www.clear-code.com/recruitment/ コードリーダー育成支援 - 自然とリーダブルコードを書くチームへ: http://www.clear-code.com/services/code-reader/