【问题标题】:Effiecient for/each loop to match phrases?高效的 foreach 循环来匹配短语?
【发布时间】:2017-01-16 09:39:39
【问题描述】:

我将使用 for/each 循环,使用正则表达式在另一个表 (table2) 中记录的文本信息中搜索不同的名称 (table1)。

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

但我不知道如何将其放入 for each 循环中!

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】:

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

    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:

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

    【讨论】:

    • 感谢您的回复!我是 Postgresql 的新手,使用多个相邻的单词!:(
    • 我想在 java 中进行搜索,但我认为它在数据库中可能会更快!
    • @Raha1986:模式匹配是一件复杂的事情。要求的细节很重要。如果操作正确,您的 RDBMS(尤其是 Postgres)将比工具链中的任何其他实例更快地执行它。
    • 意味着最好的方法是使用 Postgres 9.6 的新功能!对吧?这是最有效的方法吗?
    • @Raha1986:可能是的——结合我的其他建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 2021-01-28
    相关资源
    最近更新 更多