2011-07-18 14 views
4

私は現在、PostgreSQL データベースで検索できるWebサイトを開発しています。この検索はto_tsquery()で動作し、クエリとして送信される前に入力を検証する方法を探しています。私も、誰かがHELLO | "I LIKE CATS"を検索した場合、それだけで結果を見つけるように、フレージング機能を追加しようとしているそれ以外to_tsquery()validation

"hello"またはあなたにすべて持っている記事を見つけますI & LIKE & CATSとは対照的に、フレーズ全体"i like cats"( 3ワード、どこに表示されるかに関係なく )。

+0

ここに回答がありませんでしたか?奇妙な – Asaf

答えて

1

DBサーバーで検証するには高価すぎる理由はありますか?クライアントのts_query解析アルゴリズムを複製するのは少し過度に思えます。

妥当性検査を行うたびにクエリ全体(おそらくテーブルアクセスを含む)を実行したくないという懸念がある場合は、小さなクエリで入力を使用することができます。 )Pythonのようなビットに見えるが、それは単なる偶然だ:

is_valid_query(input): 
    try: 
     execute("SELECT ts_query($1)", input); 
     return True 
    except DatabaseError: 
     return False 

フレージングに関しては、フレーズを持つため、これらをフィルタリングし、その後、)インデックスを使用して(最初の非言葉で表現クエリで検索する、おそらく最も簡単です。それはサーバー側またはクライアント側で行うことができます。解析される言語に応じて、繰り返し空白や他の無視できる記号を扱うフレーズの単純な正規表現を作成するのが最も簡単かもしれません。

  1. to_tsqueryを検索する( 'ハロー|(私は& CATSをLIKE &)')、緩く一致するドキュメントのリストを取り戻します。
  2. クライアントでは、正規表現 "HELLO |(I \ s + LIKE \ s + CATS)"に一致するフィルタをフィルタします。

欠点は、クエリを適切な疎なクエリに変換して正規表現に変換するための追加コードが必要なことです。

最後に、は、ts_vectorsに格納されている語彙の位置を使用して適切なフレーズ検索を行うためのPostgreSQLの手法とすることができます。私は、フレーズ検索が意図された用途の1つであると推測していますが、わかりやすい検索でその例を見つけることはできませんでした。 http://linuxgazette.net/164/sephton.htmlの底に近い部分があります。