PostgreSQL 10-返回具有匹配的ILIKE模式的列(TEXT)值的一部分,它是N个相邻单词

时间:2018-12-30 16:11:30

标签: sql regex postgresql

我正在尝试实现类似于Google搜索显示结果时所执行的操作,因此在标题和url下,我们对文本进行了简短的预览,其中包含来自搜索字符串的匹配词。

文本数据示例:

  

通常,如果模型和反射表对象之间的所有关系设置正确,则只需处理相关模型(通过将模型对象追加到关系InstrumentList中)即可插入数据放入反射表。

用户输入:

  

关系

结果:

  

通常情况下,如果模型之间所有关系设置都正确

目前,我想出了以下(非常糟糕的)实施方案:

SELECT id,
    COALESCE(
        (regexp_match(text, '(?i)\s.*?(relation.*?\s(\w+\s+){3})'))[1]
      , (regexp_match(text, '(?i)((\w+\s+){3}relation.*?)\s'))[1]
    ) AS text
FROM drafts.draft
WHERE
    text ILIKE '%relation%';

我真的不擅长正则表达式,因此它只显示下一个单词(而不是前一个单词),如果我们将上面给定的文本更改为3到8,则返回的不是8个单词,而是更多(我认为这是由于逗号引起的)在文字中)。此外,如果到文本末尾还剩下少于N个单词,则返回NULL。


简历:

给出一个随机长度的文本,我们要设置参数match, N,其中match是我们的子字符串,而N是我们希望从每一侧得到的多个单词(之前,以及之后)的第一个匹配词组。

1 个答案:

答案 0 :(得分:2)

您可以使用substring()基于模式进行提取。这似乎可以满足您的要求:

select substring(str from '((\w+\W){0,3}[\w]*relation[\w]*(\W[\w]+){0,3})')
from (values ('Normally if you have all the relationship setup properly between models and reflection table objects, you will only need to deal with related models (by appending model objects into the relationship InstrumentList) in order to insert data into reflection tables.')) v(str)