2016-09-08 93 views
1

我將使用for/each循環,使用正則表達式在另一個表(table2)中的記錄的文本信息中搜索不同的名稱(table1)。Effiecient for/each loop to match phrases?

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,其中包含table1中物品的ID。

例如:

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; 

,但性能將可怕對於大表。
有幾件事情可以做,以改善它:

  1. 正常化table2.tags到一個單獨的1:N表。
    如果標籤重複使用(典型情況),或者與tag表的關係爲n:m。詳細信息:
  2. 使用三元或文本搜索索引
  3. 使用LATERAL加入到實際使用的索引。
  4. 理想的情況下,使用新的能力,Postgres的9.6搜索短語全文搜索。The release notes:

全文搜索現在可以搜索短語(多個相鄰的字)

+0

感謝你的回覆! 我是Postgresql的新用戶,使用多個相鄰單詞!:( – Raha1986

+0

我想在java中進行搜索,但我認爲它可能在數據庫中更快! – Raha1986

+0

@ Raha1986:模式匹配是一件複雜的事情。 。如果做得對,你的RDBMS(尤其是Postgres)會比你的工具鏈中的任何其他實例執行得更快* –