パスワードを忘れた? アカウント作成
491371 journal

hixの日記: キーワード検索を大いに語る

日記 by hix
既知かも知れないが、とりあえずメモ。

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文が長くなるのがイヤなのでこの手を使ってみたが、速度はどうか未だ検証していない。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

物事のやり方は一つではない -- Perlな人

読み込み中...