我想知道Postgresql是否可以处理以下用例?
我们有一个应用程序,可以抓取来自不同平台的广告。用户可以使用关键字和其他过滤器属性(价格,位置等)添加搜索。收到新广告后,我们希望找到与广告详细信息匹配的所有搜索。
每次接收广告时,我需要检查这些查询(搜索)中的哪一个与广告对象匹配。
这基本上是反向搜索。
更新
示例:
我有这个searches table
:
+----+-------------------+------------+----------+
| Id | keyword | startPrice | endPrice |
+----+-------------------+------------+----------+
| 1 | iphone 8 plus | 100 | 300 |
+----+-------------------+------------+----------+
| 2 | Ipohne 7 | 50 | 500 |
+----+-------------------+------------+----------+
| 3 | iphone 8 | 200 | 300 |
+----+-------------------+------------+----------+
| 4 | headphones iphone | 10 | 300 |
+----+-------------------+------------+----------+
现在,我和advert
对象具有以下结构:
{
title: Sell Iphone 8 plus 32GB, white,
price: 250
}
我想对searches
表进行查询,以查找所有映射到此广告的搜索。在我的示例中,我希望仅返回搜索1 and 3
,因为250
的价格介于startPrice
和endPrice
之间,而它们的keyword
位于{{1} }:出售 Iphone 8 plus 32GB,白色
即使advert.title包含advert.title
一词,我也不想接收ID为iphone
的搜索,因为它们的2 and 4
并不完全匹配({{ 1}}不包含 7 和耳机)
Elasticsearch具有Percolate Query,使您能够存储查询并针对集合中的每个元素运行该查询。
答案 0 :(得分:3)
如果要匹配特定字符串中的所有关键字,可以使用PostgreSQL full text search feature,如下所示:
SELECT id, keyword, startPrice, endPrice
FROM searches
WHERE
startPrice <= 250
AND endPrice >= 250
AND to_tsvector('Sell Iphone 8 plus 32GB, white') @@ to_tsquery(array_to_string(string_to_array(keyword, ' '), ' & '));
结果如下:
id | keyword | startprice | endprice
----+---------------+------------+----------
1 | iphone 8 plus | 100 | 300
3 | iphone 8 | 200 | 300
此查询将匹配包含所有关键字的任何字符串。请务必确保关键字不能包含任何包含匹配符号的字符(例如!,&,|等)。