hixの日記: キーワード検索を大いに語る
日記 by
hix
既知かも知れないが、とりあえずメモ。
PostgreSQLに入れられたデータをテキスト検索する。
検索で用いる語句は、一つではない。空白で区切られた任意の数を指定できる。とする。
一つだけなら、
PostgreSQLに入れられたデータをテキスト検索する。
検索で用いる語句は、一つではない。空白で区切られた任意の数を指定できる。とする。
一つだけなら、
WHERE データ LIKE '%検索文字列%'
とすればよい。
空白で区切られたら、その数だけ「OR」または「AND」で繋げればやれるが、SQL文が長くなる。
繋げずに一度にやるには。
SQLベースでの解は、
WHERE データ LIKE ALL( ARRAY[ '%検索文字列1%', '%検索文字列2% ] )
である。
上記「ALL()」ではいわゆるAND検索。これを「ANY()」にするとOR検索となる。
さて、Perlから呼び出す時はどうするか?
(当該のWHERE句のみを書く)
my @aWord = split( /\s+/, $strKeyword );
my $strQuestion = join( ', ', map { '\'%\' || ? || \'%\'' } @aWord );
my $strWhere = 'WHERE データ LIKE ALL( ARRAY[ '. $strQuestion. ' ] )';
$sth->execute( @aWord );
出来上がりのSQL文は、
WHERE データ LIKE ALL( ARRAY[ '%' || ? || '%', '%' || ? || '%' ] )
のようになる。指定されたキーワードの数だけ「'%' || ? || '%'」が繰り返される。「%」は文字列だが「?」は文字列から追い出す。そうしないと、パラメータとして認識しない。
SQL文が長くなるのがイヤなのでこの手を使ってみたが、速度はどうか未だ検証していない。
キーワード検索を大いに語る More ログイン