在开始处使用附加单词进行搜索

drnojrws  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(268)

我想从数据库中查询可能以替换列表中的任何单词开头的行。例如,查询名称 blue tree house 将返回以下记录 the blue tree house 或者 le blue tree house 或者 A blue tree house .
我尝试如下查询:

SELECT NAME
FROM NAMES
WHERE (lower(names.name) ~ '^(no.?)*\s*\d*\s*\W*(an|the|le|leur|ils|a)?(blue)\W*\s*\y') AND
      (lower(names.name) ~ ' \yhouse ?\y')

这里的小提琴与其他例子和设置。

z31licg0

z31licg01#

由于字符串的结尾是常量,我建议您反向搜索,这样可以有效地使用匹配索引:

CREATE INDEX ON names (lower(reverse(name)));

您可能希望禁止在中使用尾随(和前导)空格 name .
然后:

SELECT name
FROM   names
WHERE  lower(reverse(name)) LIKE lower(reverse('BLUE HOUSE')) || '%' -- backed by index
AND    name ~* '^((?:no\.?\s*)?\d*\y| a|an|the|le|leur|ils|a)\y';  -- filter the few remaining rows

db<>在这里摆弄
你的“候补名单”完整吗?我添加了一个表达式来涵盖您提供的所有示例。
值得注意的是:
(?:no.?\s*)? (?:) ... 捕获型括号 \. ... 文字点需要转义反斜杠 ? ... 0或1次(如您所拥有的,示例不需要)

相关问题