2016-09-08 5 views
1

正規表現を使用して別のテーブル(table2)のレコードのテキスト情報の中で異なる名前(table1)を検索するために、for/eachループを使用します。フレーズに一致する/それぞれのループのための効率性?

SELECT id FROM "table1" 
where tags ~* 'south\s?\*?africa' 
    or description ~* 'south\s?\*?south' 
order by id asc; 

しかし、私はそれをどのループに入れるのかわかりません!

table1

t1ID | NAME 
1 | Shiraz  
2 | south africa 
3 | Limmatplatz 

table2

t2ID |TAGS     | DESCRIPTIONS 
101 |shiraz;Zurich;river | It is too hot in Shiraz and Limmatplatz 
201 |southafrica;limmatplatz| we went for swimming 

私はtable1に名前のリストを持っています。別のテーブルには、これらの名前を含むテキスト情報があります。 table2のIDを取得する場合は、アイテムのIDをtable1に記載してください。例えば

t2id | t1id 
101 |1 
101 |3 
201 |2 
201 |3 

私のテーブルには、60,000および550.000行を持っています。 時間を有効に使う方法を使用する必要があります。

答えて

1

ループは必要ありません。簡単な結合ができます。

SELECT t2.id AS t2id, t1.id AS t1id 
FROM table1 t1 
JOIN table1 t2 ON t2.tags  ~* replace(t1.name, ' ', '\s?\*?') 
       OR t2.description ~* replace(t1.name, ' ', '\s?\*?') 
ORDER BY t2.id; 

しかし、パフォーマンスが大きなテーブル用ひどいになります。 n個のテーブル:

  1. ノーマライズtable2.tags別の1へ:
    は、あなたがそれを改善するために行うことができますいくつかあります。
    タグが繰り返し使用される場合は、tagテーブルとのn:mの関係(通常の場合)。詳細:
  2. 使用トライグラムまたはTEXTSEARCHインデックス
  3. PostgreSQL LIKE query performance variations
  4. 使用LATERAL
      は、実際には、これらのインデックスを使用して参加します。理想的には

フルテキスト検索(隣接する複数の単語)

+0

が返事ありがとうございました! PostgreSQLで複数の単語を使用するのが新しいです!:( – Raha1986

+0

私はJavaで検索したいと思っていましたが、データベースがより速いと思っていました! – Raha1986

+0

@ Raha1986:パターンマッチングは複雑な問題です。あなたのRDBMS(特にPostgres)は、あなたのツールチェーン内の他のどのインスタンスよりもずっと高速に実行します –

関連する問題