From kazuhiko @ fdiary.net Thu Sep 3 20:01:07 2009 From: kazuhiko @ fdiary.net (Kazuhiko) Date: Thu, 03 Sep 2009 13:01:07 +0200 Subject: [Tritonn-dev 132] =?iso-2022-jp?b?IndvcmQqIhskQiRIJCQkJjghOnc8MCROMFVMIxsoQg==?= Message-ID: <4A9FA1F3.7050504@fdiary.net> こんにちは、かずひこです。 Tritonnというか、Sennaの検索式の質問な気もしますが、"word*"という検索式 の意味が"word"とどう異なるのか分かりません。 * senna-1.1.4 * tritonn-1.0.12-mysql-5.0.67 "*"が付いている、付いていないに関わらず、exactマッチがあればそれだけ返し て、exactマッチが無ければ、部分一致を試しているように見えます。 しかし、 | ** 単語* | ある単語から始まる文字列を検索する、という条件を表す。 というQUERY.JAの記述からは、"word*"の場合は、exactマッチがあろうがなかろ うが部分一致もしてくれそうに感じます。 以下は、"garra"という語と"garrahan"という語が含まれるテーブルに対する検 索の例で、MySQLのクエリとsennaのログを載せておきます。 ・"garra"で検索 (exact=1) mysql> select uid from full_text where MATCH (`full_text`.`SearchableText`) AGAINST ('garra' in boolean mode) limit 1000; 1 row in set (0.00 sec) |i|3| ft_init_boolean_search => sen_query_open: str='garra', str_len=5, max_exprs=32 |d|3| ft_init_boolean_search => sen_query_rest: q=0x24b25e0, rest=0x440c80e8 |d|3| ft_init_boolean_search => sen_records_open |i|3| ft_init_boolean_search => sen_query_exec: i=0x2489d40, q=0x24b25e0, r=0x24b1e50 |i|3| n=1 (garra) |i|3| hits(exact)=1 |d|3| ft_init_boolean_search => sen_query_close: q=0x24b25e0 |d|3| ft_boolean_reinit_search => sen_records_rewind: records=0x24b1e50 |d|3| ft_boolean_close_search => sen_records_close: records=0x24b1e50 ・"garra*"で検索 (exact=1) mysql> select uid from full_text where MATCH (`full_text`.`SearchableText`) AGAINST ('garra*' in boolean mode) limit 1000; 1 row in set (0.00 sec) |i|3| ft_init_boolean_search => sen_query_open: str='garra*', str_len=6, max_exprs=32 |d|3| ft_init_boolean_search => sen_query_rest: q=0x24b25e0, rest=0x440c80e8 |d|3| ft_init_boolean_search => sen_records_open |i|3| ft_init_boolean_search => sen_query_exec: i=0x2489d40, q=0x24b25e0, r=0x24b1e50 |i|3| n=1 (garra*) |i|3| hits(exact)=1 |d|3| ft_init_boolean_search => sen_query_close: q=0x24b25e0 |d|3| ft_boolean_reinit_search => sen_records_rewind: records=0x24b1e50 |d|3| ft_boolean_close_search => sen_records_close: records=0x24b1e50 ・"garrah"で検索 (exact=0) mysql> select uid from full_text where MATCH (`full_text`.`SearchableText`) AGAINST ('garrah' in boolean mode) limit 1000; 40 rows in set (0.00 sec) |i|3| ft_init_boolean_search => sen_query_open: str='garrah', str_len=6, max_exprs=32 |d|3| ft_init_boolean_search => sen_query_rest: q=0x24b25e0, rest=0x440c80e8 |d|3| ft_init_boolean_search => sen_records_open |i|3| ft_init_boolean_search => sen_query_exec: i=0x2489d40, q=0x24b25e0, r=0x24b1e50 |i|3| hits(exact)=0 |i|3| n=1 (garrah) |i|3| hits(unsplit)=40 |d|3| ft_init_boolean_search => sen_query_close: q=0x24b25e0 |d|3| ft_boolean_reinit_search => sen_records_rewind: records=0x24b1e50 |d|3| ft_boolean_close_search => sen_records_close: records=0x24b1e50 ・"garrah*"で検索 (exact=0) mysql> select uid from full_text where MATCH (`full_text`.`SearchableText`) AGAINST ('garrah*' in boolean mode) limit 1000; 40 rows in set (0.00 sec) |i|3| ft_init_boolean_search => sen_query_open: str='garrah*', str_len=7, max_exprs=32 |d|3| ft_init_boolean_search => sen_query_rest: q=0x24b25e0, rest=0x440c80e8 |d|3| ft_init_boolean_search => sen_records_open |i|3| ft_init_boolean_search => sen_query_exec: i=0x2489d40, q=0x24b25e0, r=0x24b1e50 |i|3| hits(exact)=0 |i|3| n=1 (garrah*) |i|3| hits(unsplit)=40 |d|3| ft_init_boolean_search => sen_query_close: q=0x24b25e0 |d|3| ft_boolean_reinit_search => sen_records_rewind: records=0x24b1e50 |d|3| ft_boolean_close_search => sen_records_close: records=0x24b1e50 どうぞよろしくお願いします。 かずひこ From morita @ razil.jp Mon Sep 7 17:21:25 2009 From: morita @ razil.jp (morita @ razil.jp) Date: Mon, 7 Sep 2009 17:21:25 +0900 Subject: [Tritonn-dev 133] Re: =?iso-2022-jp?b?IndvcmQqIhskQiRIJCQkJjghOnc8MCROMFVMIxsoQg==?= In-Reply-To: <4A9FA1F3.7050504@fdiary.net> References: <4A9FA1F3.7050504@fdiary.net> Message-ID: <20090907082125.GA19112@epepe.com> こんにちは、森です。 すみません。。 "*"が付いているクエリのハンドリングに不備があるようです。 直した方がいいですよねぇ・・・。 >>> Kazuhiko さんは書きました: > こんにちは、かずひこです。 > > Tritonnというか、Sennaの検索式の質問な気もしますが、"word*"という検索式 > の意味が"word"とどう異なるのか分かりません。 > * senna-1.1.4 > * tritonn-1.0.12-mysql-5.0.67 > > "*"が付いている、付いていないに関わらず、exactマッチがあればそれだけ返し > て、exactマッチが無ければ、部分一致を試しているように見えます。 > > しかし、 > | ** 単語* > | ある単語から始まる文字列を検索する、という条件を表す。 > というQUERY.JAの記述からは、"word*"の場合は、exactマッチがあろうがなかろ > うが部分一致もしてくれそうに感じます。 > > 以下は、"garra"という語と"garrahan"という語が含まれるテーブルに対する検 > 索の例で、MySQLのクエリとsennaのログを載せておきます。 > > ・"garra"で検索 (exact=1) > mysql> select uid from full_text where MATCH > (`full_text`.`SearchableText`) AGAINST ('garra' in boolean mode) limit 1000; > 1 row in set (0.00 sec) > > |i|3| ft_init_boolean_search => sen_query_open: str='garra', str_len=5, > max_exprs=32 > |d|3| ft_init_boolean_search => sen_query_rest: q=0x24b25e0, rest=0x440c80e8 > |d|3| ft_init_boolean_search => sen_records_open > |i|3| ft_init_boolean_search => sen_query_exec: i=0x2489d40, > q=0x24b25e0, r=0x24b1e50 > |i|3| n=1 (garra) > |i|3| hits(exact)=1 > |d|3| ft_init_boolean_search => sen_query_close: q=0x24b25e0 > |d|3| ft_boolean_reinit_search => sen_records_rewind: records=0x24b1e50 > |d|3| ft_boolean_close_search => sen_records_close: records=0x24b1e50 > > ・"garra*"で検索 (exact=1) > mysql> select uid from full_text where MATCH > (`full_text`.`SearchableText`) AGAINST ('garra*' in boolean mode) limit > 1000; > 1 row in set (0.00 sec) > > |i|3| ft_init_boolean_search => sen_query_open: str='garra*', str_len=6, > max_exprs=32 > |d|3| ft_init_boolean_search => sen_query_rest: q=0x24b25e0, rest=0x440c80e8 > |d|3| ft_init_boolean_search => sen_records_open > |i|3| ft_init_boolean_search => sen_query_exec: i=0x2489d40, > q=0x24b25e0, r=0x24b1e50 > |i|3| n=1 (garra*) > |i|3| hits(exact)=1 > |d|3| ft_init_boolean_search => sen_query_close: q=0x24b25e0 > |d|3| ft_boolean_reinit_search => sen_records_rewind: records=0x24b1e50 > |d|3| ft_boolean_close_search => sen_records_close: records=0x24b1e50 > > ・"garrah"で検索 (exact=0) > mysql> select uid from full_text where MATCH > (`full_text`.`SearchableText`) AGAINST ('garrah' in boolean mode) limit > 1000; > 40 rows in set (0.00 sec) > > |i|3| ft_init_boolean_search => sen_query_open: str='garrah', str_len=6, > max_exprs=32 > |d|3| ft_init_boolean_search => sen_query_rest: q=0x24b25e0, rest=0x440c80e8 > |d|3| ft_init_boolean_search => sen_records_open > |i|3| ft_init_boolean_search => sen_query_exec: i=0x2489d40, > q=0x24b25e0, r=0x24b1e50 > |i|3| hits(exact)=0 > |i|3| n=1 (garrah) > |i|3| hits(unsplit)=40 > |d|3| ft_init_boolean_search => sen_query_close: q=0x24b25e0 > |d|3| ft_boolean_reinit_search => sen_records_rewind: records=0x24b1e50 > |d|3| ft_boolean_close_search => sen_records_close: records=0x24b1e50 > > ・"garrah*"で検索 (exact=0) > mysql> select uid from full_text where MATCH > (`full_text`.`SearchableText`) AGAINST ('garrah*' in boolean mode) limit > 1000; > 40 rows in set (0.00 sec) > > |i|3| ft_init_boolean_search => sen_query_open: str='garrah*', > str_len=7, max_exprs=32 > |d|3| ft_init_boolean_search => sen_query_rest: q=0x24b25e0, rest=0x440c80e8 > |d|3| ft_init_boolean_search => sen_records_open > |i|3| ft_init_boolean_search => sen_query_exec: i=0x2489d40, > q=0x24b25e0, r=0x24b1e50 > |i|3| hits(exact)=0 > |i|3| n=1 (garrah*) > |i|3| hits(unsplit)=40 > |d|3| ft_init_boolean_search => sen_query_close: q=0x24b25e0 > |d|3| ft_boolean_reinit_search => sen_records_rewind: records=0x24b1e50 > |d|3| ft_boolean_close_search => sen_records_close: records=0x24b1e50 > > どうぞよろしくお願いします。 > かずひこ > > _______________________________________________ > Tritonn-dev mailing list > Tritonn-dev @ lists.sourceforge.jp > http://lists.sourceforge.jp/mailman/listinfo/tritonn-dev > -- morita From kazuhiko @ fdiary.net Mon Sep 7 17:43:06 2009 From: kazuhiko @ fdiary.net (Kazuhiko) Date: Mon, 07 Sep 2009 10:43:06 +0200 Subject: [Tritonn-dev 134] Re: =?iso-2022-jp?b?IndvcmQqIhskQiRIJCQkJjghOnc8MCROMFVMIxsoQg==?= In-Reply-To: <20090907082125.GA19112@epepe.com> References: <4A9FA1F3.7050504@fdiary.net> <20090907082125.GA19112@epepe.com> Message-ID: <4AA4C79A.8010407@fdiary.net> こんにちは、かずひこです。 morita @ razil.jp wrote: > "*"が付いているクエリのハンドリングに不備があるようです。 > > 直した方がいいですよねぇ・・・。 お返事ありがとうございます。 MySQLと連動してバリバリ使う、というこちらのユースケースでは、Sennaがまだ まだ現役なのです。 このバグをふんだ経緯を補足します。 他のコンディション付きで"garra"で全文検索するとヒットせず、"garrah"で全 文検索するとヒットして、何故だ?と思って調べてみると、"garra"がexactマッ チする文書があって、それが他のコンディションを満たさなかったため、「完全 一致→非わかち書き→部分一致」という切り替えが行われていませんでした。 一方、"garrah"の場合は、exactマッチする文書が無かったので、「完全一致→非 わかち書き→部分一致」という切り替えが行われて、garrahanを含む文書を見つ けてくれました。 なので、こういうケースでは"garra*"で検索すればいいのかな? と思って試し た次第です。 "*E"プラグマをいじって対応するというワークアラウンドも検討したのですが、 上記のように「Sennaの全文検索では(*Eプラグマの数値1以上の件数)exact ヒットするけれど、他のコンディションを満たさない」というケースでは、「完 全一致→非わかち書き→部分一致」と切り替えてくれないので、そうなると常に-5 とか-7とかにするしかなく、それはパフォーマンスに対する影響が大きすぎそう でちょっと躊躇します。 「完全一致→非わかち書き→部分一致」の切り替えが、全文検索の結果だけでな く、クエリ全体の結果に応じて切り替わればいいのですが、これはバグではなく て仕様、でしょうか? どうぞよろしくお願いします。 かずひこ From morita @ razil.jp Mon Sep 7 18:49:22 2009 From: morita @ razil.jp (morita @ razil.jp) Date: Mon, 7 Sep 2009 18:49:22 +0900 Subject: [Tritonn-dev 135] Re: =?iso-2022-jp?b?IndvcmQqIhskQiRIJCQkJjghOnc8MCROMFVMIxsoQg==?= In-Reply-To: <4AA4C79A.8010407@fdiary.net> References: <4A9FA1F3.7050504@fdiary.net> <20090907082125.GA19112@epepe.com> <4AA4C79A.8010407@fdiary.net> Message-ID: <20090907094922.GA25239@epepe.com> こんにちは。森です。 sennaのtrunk最新版(rev1298)にパッチを入れてみました。 これでうまく動くかも知れません。 よろしかったら試してみていただけますでしょうか? どうぞよろしくお願いいたします。 >>> Kazuhiko さんは書きました: > こんにちは、かずひこです。 > > morita @ razil.jp wrote: > > "*"が付いているクエリのハンドリングに不備があるようです。 > > > > 直した方がいいですよねぇ・・・。 > > お返事ありがとうございます。 > > MySQLと連動してバリバリ使う、というこちらのユースケースでは、Sennaがまだ > まだ現役なのです。 > > このバグをふんだ経緯を補足します。 > > 他のコンディション付きで"garra"で全文検索するとヒットせず、"garrah"で全 > 文検索するとヒットして、何故だ?と思って調べてみると、"garra"がexactマッ > チする文書があって、それが他のコンディションを満たさなかったため、「完全 > 一致→非わかち書き→部分一致」という切り替えが行われていませんでした。 > 一方、"garrah"の場合は、exactマッチする文書が無かったので、「完全一致→非 > わかち書き→部分一致」という切り替えが行われて、garrahanを含む文書を見つ > けてくれました。 > > なので、こういうケースでは"garra*"で検索すればいいのかな? と思って試し > た次第です。 > > "*E"プラグマをいじって対応するというワークアラウンドも検討したのですが、 > 上記のように「Sennaの全文検索では(*Eプラグマの数値1以上の件数)exact > ヒットするけれど、他のコンディションを満たさない」というケースでは、「完 > 全一致→非わかち書き→部分一致」と切り替えてくれないので、そうなると常に-5 > とか-7とかにするしかなく、それはパフォーマンスに対する影響が大きすぎそう > でちょっと躊躇します。 > > 「完全一致→非わかち書き→部分一致」の切り替えが、全文検索の結果だけでな > く、クエリ全体の結果に応じて切り替わればいいのですが、これはバグではなく > て仕様、でしょうか? > > どうぞよろしくお願いします。 > > かずひこ > > _______________________________________________ > Tritonn-dev mailing list > Tritonn-dev @ lists.sourceforge.jp > http://lists.sourceforge.jp/mailman/listinfo/tritonn-dev > -- morita From kazuhiko @ fdiary.net Mon Sep 7 21:26:17 2009 From: kazuhiko @ fdiary.net (Kazuhiko) Date: Mon, 07 Sep 2009 14:26:17 +0200 Subject: [Tritonn-dev 136] Re: =?iso-2022-jp?b?IndvcmQqIhskQiRIJCQkJjghOnc8MCROMFVMIxsoQg==?= In-Reply-To: <20090907094922.GA25239@epepe.com> References: <4A9FA1F3.7050504@fdiary.net> <20090907082125.GA19112@epepe.com> <4AA4C79A.8010407@fdiary.net> <20090907094922.GA25239@epepe.com> Message-ID: <4AA4FBE9.6020200@fdiary.net> morita @ razil.jp wrote: > sennaのtrunk最新版(rev1298)にパッチを入れてみました。 どうもありがとうございます! さっそく試してみました。 garra * 1 garrahan * 40 というデータに対する検索です。 mysql> select uid from full_text where MATCH (`full_text`.`SearchableText`) AGAINST ('garra'); 1.1.4 : 1 record r1298 : 1 record mysql> select uid from full_text where MATCH (`full_text`.`SearchableText`) AGAINST ('garra' in boolean mode); 1.1.4 : 1 record r1298 : 41 record boolean modeの際、r1298ではアスタリスク無しでも部分一致検索をしているよ うです。この際、ログは n=1 (garra) hits(exact)=41 と出力されています。これは、意図どおりの動作でしょうか? mysql> select uid from full_text where MATCH (`full_text`.`SearchableText`) AGAINST ('garra*' in boolean mode) 1.1.4 : 1 record r1298 : 41 record boolean modeの際、r1298ではアスタリスク有りの場合、期待通りの動作になっ ています。 この際、ログは n=1 (garra*) hits(exact)=41 と出力されています。 mysql> select uid from full_text where MATCH (`full_text`.`SearchableText`) AGAINST ('arra' in boolean mode); 1.1.4 : 0 record r1298 : 0 record 1.1.4, trunkともに、ログは hits(exact)=0 hits(unsplit)=0 hits(partial)=0 となっています。このような中間文字列はpartialでもヒットしないのは意図ど おりの動作でしょうか? というわけで、当初の問題は解決されましたが、一部、挙動が意図どおりかよく わからなかった部分があったので確認させてください。 よろしくお願いします。 かずひこ From morita @ razil.jp Tue Sep 8 01:20:20 2009 From: morita @ razil.jp (morita @ razil.jp) Date: Tue, 8 Sep 2009 01:20:20 +0900 Subject: [Tritonn-dev 137] Re: =?iso-2022-jp?b?IndvcmQqIhskQiRIJCQkJjghOnc8MCROMFVMIxsoQg==?= In-Reply-To: <4AA4FBE9.6020200@fdiary.net> References: <4A9FA1F3.7050504@fdiary.net> <20090907082125.GA19112@epepe.com> <4AA4C79A.8010407@fdiary.net> <20090907094922.GA25239@epepe.com> <4AA4FBE9.6020200@fdiary.net> Message-ID: <20090907162020.GA11855@epepe.com> 森です。 すみません。意図通りのコードになってませんでした。 '*'が指定された場合のみ無条件に前方一致検索を行うようにrev1299で修正しました。 なお、'arra'で検索した場合は、partialでもヒットしません。 英数文字列の場合は、(ngramでsplit_alphaを指定した場合を除けば) 前方一致のみが有効となっていません。 以上よろしくお願いいたします。 >>> Kazuhiko さんは書きました: > morita @ razil.jp wrote: > > sennaのtrunk最新版(rev1298)にパッチを入れてみました。 > > どうもありがとうございます! > さっそく試してみました。 > > garra * 1 > garrahan * 40 > > というデータに対する検索です。 > > mysql> select uid from full_text where MATCH > (`full_text`.`SearchableText`) AGAINST ('garra'); > > 1.1.4 : 1 record > r1298 : 1 record > > mysql> select uid from full_text where MATCH > (`full_text`.`SearchableText`) AGAINST ('garra' in boolean mode); > > 1.1.4 : 1 record > r1298 : 41 record > > boolean modeの際、r1298ではアスタリスク無しでも部分一致検索をしているよ > うです。この際、ログは > n=1 (garra) > hits(exact)=41 > と出力されています。これは、意図どおりの動作でしょうか? > > mysql> select uid from full_text where MATCH > (`full_text`.`SearchableText`) AGAINST ('garra*' in boolean mode) > > 1.1.4 : 1 record > r1298 : 41 record > > boolean modeの際、r1298ではアスタリスク有りの場合、期待通りの動作になっ > ています。 > この際、ログは > n=1 (garra*) > hits(exact)=41 > と出力されています。 > > mysql> select uid from full_text where MATCH > (`full_text`.`SearchableText`) AGAINST ('arra' in boolean mode); > > 1.1.4 : 0 record > r1298 : 0 record > > 1.1.4, trunkともに、ログは > hits(exact)=0 > hits(unsplit)=0 > hits(partial)=0 > となっています。このような中間文字列はpartialでもヒットしないのは意図ど > おりの動作でしょうか? > > というわけで、当初の問題は解決されましたが、一部、挙動が意図どおりかよく > わからなかった部分があったので確認させてください。 > > よろしくお願いします。 > > かずひこ > > _______________________________________________ > Tritonn-dev mailing list > Tritonn-dev @ lists.sourceforge.jp > http://lists.sourceforge.jp/mailman/listinfo/tritonn-dev > -- morita From kazuhiko @ fdiary.net Tue Sep 8 03:50:05 2009 From: kazuhiko @ fdiary.net (Kazuhiko) Date: Mon, 07 Sep 2009 20:50:05 +0200 Subject: [Tritonn-dev 138] Re: =?iso-2022-jp?b?IndvcmQqIhskQiRIJCQkJjghOnc8MCROMFVMIxsoQg==?= In-Reply-To: <20090907162020.GA11855@epepe.com> References: <4A9FA1F3.7050504@fdiary.net> <20090907082125.GA19112@epepe.com> <4AA4C79A.8010407@fdiary.net> <20090907094922.GA25239@epepe.com> <4AA4FBE9.6020200@fdiary.net> <20090907162020.GA11855@epepe.com> Message-ID: <4AA555DD.5020901@fdiary.net> morita @ razil.jp wrote: > すみません。意図通りのコードになってませんでした。 > '*'が指定された場合のみ無条件に前方一致検索を行うようにrev1299で修正しました。 ありがとうございます! >> mysql> select uid from full_text where MATCH >> (`full_text`.`SearchableText`) AGAINST ('garra' in boolean mode); >> >> 1.1.4 : 1 record >> r1298 : 41 record r1299 : 1 record になりました。 > なお、'arra'で検索した場合は、partialでもヒットしません。 > 英数文字列の場合は、(ngramでsplit_alphaを指定した場合を除けば) > 前方一致のみが有効となっていません。 あ、そうでした。失礼いたしました。 すばやく対応してくださって、とても助かりました。 どうもありがとうございました。 かずひこ