select 行如果列包含名称元素,任何顺序
select rows if column contain name elements, any order
我有一个包含几千行的 table。这些结果是通过使用名称列表查询 api 产生的。
为了搜索 "John Snow",api 将 return 其数据库中包含令牌 "john" 和令牌 "snow" 的所有条目。所以我有很多误报。
我想做的是对 table 进行子集化,这样我只有 title
列(包含与我的搜索字符串匹配的字符串的列)包含 ALL 的记录搜索字符串的元素,不管顺序如何。
我试过了
select * from table where 'john snow' ~* title;
select * from table where 'john snow' ILIKE '%' || title || '%';
两者都有效,但前提是 title
列按该顺序恰好包含 john snow
。
之前
str_searched | title
-------------+-------
john snow | snow white
john snow | john wick
john snow | SNOW john
john snow | john Snow
john snow | Mr john snow
之后
str_searched | title
-------------+-------
john snow | SNOW john
john snow | john Snow
john snow | Mr john snow
SELECT
*
FROM
my_table
WHERE
regexp_split_to_array(lower('john snow'), ' ')
<@ regexp_split_to_array(lower(title), ' ')
lower()
标准化大写字母
regexp_split_to_array()
将文本转换为 space 处的数组
- 现在您有 2 个可以比较的数组(例如
[john,snow]
和 [mr,john,snow]
)。 <@
比较器检查左侧数组是否完整包含在右侧数组中。
免责声明:在非常大的桌子上,这可能会很慢。在这种情况下,我建议您查看全文搜索引擎:https://www.postgresql.org/docs/current/textsearch.html
我有一个包含几千行的 table。这些结果是通过使用名称列表查询 api 产生的。
为了搜索 "John Snow",api 将 return 其数据库中包含令牌 "john" 和令牌 "snow" 的所有条目。所以我有很多误报。
我想做的是对 table 进行子集化,这样我只有 title
列(包含与我的搜索字符串匹配的字符串的列)包含 ALL 的记录搜索字符串的元素,不管顺序如何。
我试过了
select * from table where 'john snow' ~* title;
select * from table where 'john snow' ILIKE '%' || title || '%';
两者都有效,但前提是 title
列按该顺序恰好包含 john snow
。
之前
str_searched | title
-------------+-------
john snow | snow white
john snow | john wick
john snow | SNOW john
john snow | john Snow
john snow | Mr john snow
之后
str_searched | title
-------------+-------
john snow | SNOW john
john snow | john Snow
john snow | Mr john snow
SELECT
*
FROM
my_table
WHERE
regexp_split_to_array(lower('john snow'), ' ')
<@ regexp_split_to_array(lower(title), ' ')
lower()
标准化大写字母regexp_split_to_array()
将文本转换为 space 处的数组
- 现在您有 2 个可以比较的数组(例如
[john,snow]
和[mr,john,snow]
)。<@
比较器检查左侧数组是否完整包含在右侧数组中。
免责声明:在非常大的桌子上,这可能会很慢。在这种情况下,我建议您查看全文搜索引擎:https://www.postgresql.org/docs/current/textsearch.html