kentoku
kento****@gmail*****
2012年 7月 6日 (金) 12:58:53 JST
斯波です。 > 今試していてわかったのですが、ORDER BY句を指定すると、 > そのカラムにキーワードが含まれていないデータは除外されているようです。 > 例えば(7)では、title・author・publisherの全てに"日本"が含まれているものしかマッチしていないと思われます。 > またその証拠に、(3)と(8)では同じ検索結果が得られています。 ありがとうございます。 バグの可能性も含めて確認させて頂きます。 どうぞ、よろしくお願いいたします。 2012年7月5日 18:17 中谷宗嵩 <nakatani_munet****@flyin*****>: > 須藤様 > > 株式会社フライングラインの中谷です。 > 早速ご回答いただき、ありがとうございます。 > >>パフォーマンス的にはむしろ(b)の方が(a)よりよさそうな気がします。 >> >>というのは、同じSQL内に同じMATCH AGAINSTが複数あっても実際に >>は1度しか検索しないからです。 >> >>冗長ですがORDER BYの数を減らせないということのようなので、 >>(b)が一番効率がよさそうです。 > > ご説明ありがとうございます。 > なるほど。重複を除いたMATCH AGAINSTの数が重要なのですね。 > それでは(b)の方向で、なるべくMATCH AGAINSTが少なくなるような設計を考えてみます。 > ありがとうございました! > > >>何かのバッファサイズを指定する、とかそういう類の設定というこ >>とですよね。実は、そういうのは存在しないのです。今後、できる >>かもしれませんが、今のところはありません。 > > こちらも了解致しました。 > やはり検索回数を減らす方法で、パフォーマンスを向上させたいと思います。 > > >>もしよかったらテーブル定義(create table (...))を教えて頂い >>てもよいでしょうか?インデックスの張り方を確認したいのと、手 >>元でも試してみたいというのが理由です。 > > 以下にテーブル構造を貼ります。 > ※実際に使用していたbookテーブルは、先程お伝えしたものより複雑な構造のため、 > book2テーブルで再現してみました。 > こちらでも同じ検索結果が得られました。 > > mysql> show create table book2 \G > *************************** 1. row *************************** > Table: book2 > Create Table: CREATE TABLE `book2` ( > `id` int(11) NOT NULL AUTO_INCREMENT, > `title` varchar(254) COLLATE utf8_unicode_ci DEFAULT NULL, > `author` varchar(254) COLLATE utf8_unicode_ci DEFAULT NULL, > `publisher` varchar(254) COLLATE utf8_unicode_ci DEFAULT NULL, > PRIMARY KEY (`id`), > KEY `book_title` (`title`), > KEY `book_title_author` (`title`,`author`), > FULLTEXT KEY `full_book_title` (`title`), > FULLTEXT KEY `full_book_title_author` (`title`,`author`), > FULLTEXT KEY `full_book_author` (`author`), > FULLTEXT KEY `full_book_publisher` (`publisher`), > FULLTEXT KEY `full_book_title_author_publisher` (`title`,`author`,`publisher`) > ) ENGINE=mroonga DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci > 1 row in set (0.00 sec) > > こちらには、約20万件のデータが入っています。 > mysql> select count(*) from book2; > +----------+ > | count(*) | > +----------+ > | 190818 | > +----------+ > 1 row in set (0.00 sec) > > 参考までに、以下、実行したSQLと取得した結果の件数です。 > (1)SELECT * FROM book2 WHERE MATCH(title,author,publisher) > AGAINST("日本" in boolean mode); > ⇒15500件 > (2)SELECT * FROM book2 WHERE MATCH(title,author,publisher) > AGAINST("日本" in boolean mode) ORDER BY MATCH(title,author,publisher) > AGAINST("日本" in boolean mode); > ⇒15500件 > (3)SELECT * FROM book2 WHERE MATCH(title,author,publisher) > AGAINST("日本" in boolean mode) ORDER BY MATCH(title) AGAINST("日本" in > boolean mode); > ⇒7568件の結果 > (4)SELECT * FROM book2 WHERE MATCH(title,author,publisher) > AGAINST("日本" in boolean mode) ORDER BY MATCH(author) AGAINST("日本" in > boolean mode); > ⇒1762件の結果 > (5)SELECT * FROM book2 WHERE MATCH(title,author,publisher) > AGAINST("日本" in boolean mode) ORDER BY MATCH(publisher) AGAINST("日本" > in boolean mode); > ⇒7204件の結果 > (6)SELECT * FROM book2 WHERE MATCH(title,author,publisher) > AGAINST("日本" in boolean mode) ORDER BY MATCH(title) AGAINST("日本" in > boolean mode),MATCH(author) AGAINST("日本" in boolean mode); > ⇒228件の結果 > (7)SELECT * FROM book2 WHERE MATCH(title,author,publisher) > AGAINST("日本" in boolean mode) ORDER BY MATCH(title) AGAINST("日本" in > boolean mode),MATCH(author) AGAINST("日本" in boolean > mode),MATCH(publisher) AGAINST("日本" in boolean mode); > ⇒31件の結果 > (8)SELECT * FROM book2 WHERE MATCH(title) AGAINST("日本" in boolean mode); > ⇒7568件の結果 > > 今試していてわかったのですが、ORDER BY句を指定すると、 > そのカラムにキーワードが含まれていないデータは除外されているようです。 > 例えば(7)では、title・author・publisherの全てに"日本"が含まれているものしかマッチしていないと思われます。 > またその証拠に、(3)と(8)では同じ検索結果が得られています。 > > テーブル構造などで、何か問題になりそうな箇所がありましたら、 > ご指摘いただけますと幸いです。 > > > どうぞよろしくお願い致します。 > > ----------------------------------------- > 株式会社 フライングライン > 中谷 宗嵩 > > 東京都中央区銀座8-11-11 TK銀座8丁目ビル > URL: http://www.flyingline.co.jp/ > Tel: 03-5537-0390 Fax: 03-5537-0391 > Mail: nakatani_munet****@flyin***** > > _______________________________________________ > groonga-dev mailing list > groon****@lists***** > http://lists.sourceforge.jp/mailman/listinfo/groonga-dev