PostgreSQL中的反向搜索

时间:2018-10-02 15:32:45

标签: postgresql

我想知道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的价格介于startPriceendPrice之间,而它们的keyword位于{{1} }:出售 Iphone 8 plus 32GB,白色

即使advert.title包含advert.title一词,我也不想接收ID为iphone的搜索,因为它们的2 and 4并不完全匹配({{ 1}}不包含 7 耳机

Elasticsearch具有Percolate Query,使您能够存储查询并针对集合中的每个元素运行该查询。

1 个答案:

答案 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

此查询将匹配包含所有关键字的任何字符串。请务必确保关键字不能包含任何包含匹配符号的字符(例如!,&,|等)。