PostgreSQL 10-返回具有匹配ILIKE模式的部分列(文本)值及其';sn相邻词
我正试图实现与谷歌搜索在显示结果时所做的类似的功能,因此在标题和url下,我们得到了一个简短的文本预览,其中包含搜索字符串中匹配的单词 文本数据示例: 通常,如果您在模型和反射表对象之间正确设置了所有的关系,则只需处理相关模型(通过将模型对象添加到关系工具列表中),即可将数据插入反射表 用户输入: 关系 结果: 正常情况下,如果您拥有所有的关系在模型之间正确发货设置 目前,我提出了以下(非常糟糕的)实施方案:PostgreSQL 10-返回具有匹配ILIKE模式的部分列(文本)值及其';sn相邻词,sql,regex,postgresql,Sql,Regex,Postgresql,我正试图实现与谷歌搜索在显示结果时所做的类似的功能,因此在标题和url下,我们得到了一个简短的文本预览,其中包含搜索字符串中匹配的单词 文本数据示例: 通常,如果您在模型和反射表对象之间正确设置了所有的关系,则只需处理相关模型(通过将模型对象添加到关系工具列表中),即可将数据插入反射表 用户输入: 关系 结果: 正常情况下,如果您拥有所有的关系在模型之间正确发货设置 目前,我提出了以下(非常糟糕的)实施方案: SELECT id, COALESCE( (regexp_ma
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
是我们希望从文本中第一个匹配短语的每一侧(之前和之后)获得的单词数。您可以使用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)
有了
子字符串
,它就干净多了。非常感谢。我在regex的开头添加了一个(?I)
,使其具有类似于ILIKE的不区分大小写的行为(稍后在WHERE部分中有)。也许它也会帮助一些人。