高效的 for/each 循环来匹配短语?

问题描述 投票:0回答:1

我将使用 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 行。 我需要使用一种时间明智且高效的方法!

regex performance postgresql for-loop database-design
1个回答
2
投票

你不需要循环。一个简单的连接就可以了。

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 中的新功能通过全文搜索来搜索 短语发行说明:

    全文搜索现在可以搜索短语(多个相邻单词)

© www.soinside.com 2019 - 2024. All rights reserved.