[groonga-dev,00979] Re: mroonga検索スコア順のソートについて

Back to archive index

中谷宗嵩 nakatani_munet****@flyin*****
2012年 7月 5日 (木) 18:17:20 JST


須藤様

株式会社フライングラインの中谷です。
早速ご回答いただき、ありがとうございます。

>パフォーマンス的にはむしろ(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 メーリングリストの案内
Back to archive index