web-dev-qa-db-ja.com

postgresqlでテキストを検索するときに単純なcontainsメソッドを探す

PostgreSQLの世界では初めてなので、これらの質問に対する明確な答えがあるかどうかわからないことを事前に謝罪します。

基本的に私は2つのことを探しています。まず、python同等のものは次のようになります。

def find_all_containing( input_array=[], target ):
    output=[]
    for i in input_array:
        if target in i:
            output.append(i)
    return(output) 

私が現在作成しているデータベースでは、論理的に、説明に「悪」を含むすべてのスニペットタイトルを表示しようとすると、SQLコマンドが次のように見えると信じがちです。

SELECT title FROM snippets WHERE 'evil' in description;
/* or */
SELECT title FROM snippets WHERE description CONTAINS 'evil';

インラインpython関数を記述して、「TRUE」または「FALSE」を返し、次のように動作させました。

/* contains function here */
CREATE FUNCTION contains (input_text text, target text) RETURNS text AS $$
if target in input_text:
  return("TRUE")
return("FALSE")
$$ LANGUAGE plpythonu;

/* working command of the script */
SELECT title FROM snippets WHERE contains(description,'Evil')='TRUE';

これは機能し、私が尋ねるのを止めるはずですが、SQLを学習する目的は、単に別の方法を見つけるのではなく、データベースの操作方法を学ぶことだったので、SQLの世界がどのようにこれを解決するかを学びたいと思いますpython nosqlの雰囲気を再現するために。

2つ目は、データベースにPython的な考え方を取り入れるために、いくつかのpython=スニペットを一緒に投げたのは今回が初めてではありません。SQLの世界に精通している人のために私はこれを行うことで何かを逃していますか?私はスピードのためにそれを手に入れますが、スピードが今まで問題であるなら、私はCで実装を書き直す必要があるだけだと思います。

私ができる限りシンプルに保つことは、これまでのところかなりうまくいきました、そしてこれは今のところ現状のままです。しかし、ほとんどすべてのソリューションのコードに別の言語を組み込んでいることに気づいたとき、それはより大きな全体像を見逃していないかと尋ね始めたときです。

5
codykochmann

これを表現するには、2つの典型的な方法があります。

LIKEインフィックス検索の場合:

SELECT title FROM snippets WHERE description LIKE '%evil%';

またはpositionを使用:

SELECT title FROM snippets WHERE position('evil' in description) > 0;

どちらもデフォルトでは索引付けできないことに注意してください。詳細については、「中置検索インデックス」を検索し、必要に応じてpg_trgmを調べてください。

9
Craig Ringer