Postgresql 中的反向搜索

Raz*_*oiu 2 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价格之间startPrice,并endPrice和他们keywordadvert.title:销售iPhone 8 32GB,白色

即使 advert.title 包含这个iphone词,我也不希望收到带有 ID 的搜索2 and 4,因为它们keywords不完全匹配(advert.title不包含7耳机

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

Mic*_*ers 5

如果要匹配特定字符串中的所有关键字,可以使用PostgreSQL 全文搜索功能,如下所示:

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, ' '), ' & '));
Run Code Online (Sandbox Code Playgroud)

结果如下:

 id |    keyword    | startprice | endprice 
----+---------------+------------+----------
  1 | iphone 8 plus |        100 |      300
  3 | iphone 8      |        200 |      300
Run Code Online (Sandbox Code Playgroud)

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