2016-08-08 8 views
0

複数の表で複数の列を検索したい。 考えるのテーブル::postgresqlランキングで複数列検索

ユーザー ID first_nameの last_nameの のuser_id アドレス

土地 名 のcompany_id

は、ユーザーがジョニー・ブラボー(ジョニーあるとしましょう メール

企業このような.bravo @ gmail.com)は米国のワシントンで働いています。 私は「食べた」クエリ に基づいてレコードを検索したい - 私は「RAVは」私のジョニー・ブラボーランクはので、他の電子メールとジョニーBravosより高い入力すると、米国、またはブラボー

から 「RAV」から>それは結果の最初です

どうすればこのような機能を実装できますか? 私はts_vectorとts_rankを見てきましたが、正しいワイルドカード( "to_tsquery( 'Brav:*')"だけがサポートされているようです)、フルテキスト検索機能は必要ありません住所やユーザー名などの名前を別名にする必要はありません)ワイルドカード検索を行うことはできますが、手動でアプリケーションのランキングを計算する必要があります

答えて

1

pg_trgm extensionを使用できます。あなたはcontribのをインストールしておく必要があり

、あなたは拡張機能をインストール:

create extension pg_trgm; 

を次に、トライグラムインデックスを作成することができます

create index user_idx on user using gist (user_data gist_trgm_ops); 

そして、あなたは、ほとんどのあなたの最初の10を与えるどの照会することができます類似の値:

select * from user order by user_data <-> 'rav' limit 10; 

user_dataは、すべての情報を1つの(テキスト)フィールドに連結し、より多くのフィールドにわたる検索を可能にする不変関数を持ちます。

「ランキングスコア」を取得するには、similarity functionを使用できます。これは、同じ文字列の場合は1、完全に無関係の場合は0を返します。

データベース全体でフルテキスト検索が必要な場合は、Apache Solrなどの別の検索機能を使用する方がよい場合があります。

+1

+1私が言及する唯一の言い分は、類似性()関数を使用してユーザに最も関連性の高い結果を与えることです。 –

+0

同意して更新しました。 – hruske

+0

お返事ありがとうございます!類似点funcは私が欲しいものではありません。私は間違いのスペルを探していませんが、複数の単語の出現率を高くしたいと思います。 ohnyがファーストネーム、電子メール、会社名になったときはランクが高くなります。どのようなアイデアを私はそれに使用することができますか? –