我正在尝试实现类似于Google搜索在显示结果时所做的事情,因此在标题和url下,我们得到了一个文本的简短预览,其中包含来自搜索字符串的匹配单词。
文本数据示例:
通常,如果模型和反射表对象之间的所有关系设置正确,则只需处理相关模型(通过将模型对象附加到关系工具列表中)即可将数据插入反射表。
用户输入:
关系
结果:
通常,如果模型之间的关系设置正确
目前,我提出了以下(非常糟糕的)实施方案:
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%';
我真的不擅长regexp,所以它只显示下一个单词(而不是上一个),如果我们将上面给定的文本的3改为8,它返回的不是8个单词而是更多(我认为这是因为文本中有逗号)。另外,如果在文本结束前剩余的单词少于N个,则返回NULL。
简历:
给定一个随机长度的文本,我们希望设置参数
match, N
,其中match
是我们的子字符串,N
是我们希望从文本的每一边(之前和之后)第一个匹配短语中得到的单词数。 最佳答案
可以使用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)
关于sql - PostgreSQL 10-返回具有匹配的ILIKE模式的列(TEXT)值的一部分,它是N个相邻单词,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53979220/