[groonga-dev,02492] Re: 「GROUP BY」条件をmroonga_command()で再現する方法

Back to archive index

Kouhei Sutou kou****@clear*****
2014年 7月 10日 (木) 22:48:42 JST


須藤です。

In <BAY17****@phx*****>
  "[groonga-dev,02488] Re: 「GROUP BY」条件をmroonga_command()で再現する方法" on Wed, 9 Jul 2014 20:56:34 +0900,
  Kimura A <a.kim****@live*****> wrote:

> テスト用のtestデータベースには、以下のような構成になっています。

再現するために必要な情報をすべて提供してもらってありがとうご
ざいます!とても助かりました!

> 3つのテーブルのうち、t1テーブルとt2テーブルはほぼ同一の内容で、kana_nameカラムのコメントに「'type "name_kanas"」表記がある(t1)かない(t2)かだけの違いです。
...
> 以下に、これらのテーブルに対して走らせてみたクエリーと結果(件数のみ)を列挙します。
...
> クエリー:t1に対して前方一致
> SELECT mroonga_command("select t1 --limit 10 --query kana_name:^と") AS result;
> 結果
> 0件取得:異常?
> 
> クエリー:t2に対して前方一致
> SELECT mroonga_command("select t2 --limit 10 --query kana_name:^と") AS result;
> 結果
> 3件取得:正常
> 
> この3番目のクエリーが問題で、どうも「コメントによって外部テーブルと紐付けたVARCHARカラムに対しては、前方一致検索が効いていない」という挙動のように見えるのですが…。

たしかにそうですね!

カラムの値に対して前方一致検索するにはインデックスを張らない
といけないのでした。すみません。(_keyに対して前方一致検索す
るときはインデックスを張らなくてもよいです。)

で、今回の場合だとどうするかというと、t1にこんなのを書きます。

 INDEX `kana_name_index` (`kana_name`) COMMENT 'table "kana_names"',

↑を加えたt1の定義を全部書くとこうです。

CREATE TABLE IF NOT EXISTS `t1` (
 `id` int(11) NOT NULL auto_increment,
 `kana_name` varchar(255) DEFAULT NULL COMMENT 'type "kana_names"',
 INDEX `kana_name_index` (`kana_name`) COMMENT 'table "kana_names"',
 PRIMARY KEY (`id`)
) ENGINE=mroonga DEFAULT CHARSET=utf8;

これで、

  SELECT mroonga_command("select t1 --limit 10 --query kana_name:^と") AS result;

で3件取得できます。


# お知らせ:
# 2ヶ月くらい先ですが、Groonga関連プロダクトの「How-To」を共
# 有する勉強会がありますよー
#   ConoHa presents - Groonga "How-To" Talks
#   http://groonga.doorkeeper.jp/events/12676
# 発表者を募集しているので「How-To」を持っている人はぜひ紹介
# しにきてくださーい!(まだ1人しかいなくて私は不安ですよ!)

-- 
須藤 功平 <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/




groonga-dev メーリングリストの案内
Back to archive index