postgresql 使用Postgres SIMILAR TO与Spring Data匹配列中的子字符串

3mpgtkmj  于 2023-08-04  发布在  PostgreSQL
关注(0)|答案(1)|浏览(108)

我有一个记录在一列的价值“非常好的宝马4轮驱动i5”。
如果我提供了一个这个值的子字符串,我怎么能做出一个能找到这个值的查询呢?假设我想通过提供这个“宝马i5”来找到它?
如果我使用LIKE方法,那么它需要按顺序输入单词。

@Query("SELECT p FROM Product p WHERE p.name LIKE CONCAT('%',:name,'%')")

字符串
我使用Sping Boot 和Spring DATA。数据库是postgres。
如果我用这个查询在Postgres上搜索字符串,我可以找到它,所以问题是如何用Spring DATA来做:

select name from product WHERE name similar TO '%((BMW) | (i5))%'

i2byvkas

i2byvkas1#

Using Postgres SIMILAR TO.

不要使用SIMILAR TO。完全没有意义。请参阅:

  • 对正则表达式使用SIMILAR TO?
  • Postgres中LIKE和~的区别

使用正则表达式匹配运算符**~**(或者不区分大小写的变体~*)可以更快地在字符串中的任何位置查找部分匹配。要以任意顺序匹配 two 字符串,请使用 two 表达式以保持简单。喜欢的:

SELECT * FROM Product p WHERE p.name ~ 'BMW' AND p.name ~ 'i5';

字符串
但我怀疑你想要在“BMW”之后的“i5”*(中间有一些或没有噪音):

SELECT * FROM Product p WHERE p.name ~ 'BMW.*i5';


或者:

SELECT * FROM Product p WHERE p.name LIKE '%BMW%i5%';


这两种方法都可以用三元组索引来支持,如:

CREATE INDEX ON Product USING gin (name gin_trgm_ops);


首先需要附加模块pg_trgm。请参阅:

  • PostgreSQL LIKE查询性能变化
    使用text search。然后,您可以传递一个包含多个单词(词素)的字符串。您的查询可能如下所示:
... WHERE to_tsvecor(p.name) @@ plainto_tsquery('simple', 'BMW i5');


或者使用短语搜索查找 'BMW'后跟'i5'

... WHERE to_tsvecor(p.name) @@ phraseto_tsquery('simple', 'BMW i5')


请参阅:

文本搜索功能强大,但您可能必须先熟悉它。手册提供了你需要知道的一切。索引可能如下所示:

CREATE INDEX ON Product USING GIN (to_tsvector('simple', name));


进一步阅读:

相关问题