我将使用 for/each 循环,使用正则表达式在另一个表 (
table1
) 中记录的文本信息中搜索不同的名称 (table2
)。
SELECT id FROM "table1"
where tags ~* 'south\s?\*?africa'
or description ~* 'south\s?\*?south'
order by id asc;
但我不知道如何将其放入 foreach 循环中!
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 行。 我需要使用一种时间明智且高效的方法!
你不需要循环。一个简单的连接就可以了。
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;
但对于大表来说,性能仍然会糟糕。
您可以采取以下几项措施来改进它:
将
table2.tags
标准化为单独的 1:n 表。tag
表建立 n:m 关系。参见:
使用三元组或文本搜索索引。参见:
使用
LATERAL
连接来实际使用这些索引。参见:
理想情况下,使用 Postgres 9.6 中的新功能通过全文搜索来搜索 短语。 发行说明:
全文搜索现在可以搜索短语(多个相邻单词)