如何聚合ilike在PostgreSQL的多行上找到搜索?

时间:2017-09-20 02:27:23

标签: postgresql search query-optimization

假设我有这张表

CREATE TEMP TABLE pizzas (
  pizza_id             INT,
  name                 TEXT,
  ingredients          TEXT,
  kingsize_ingredients TEXT
);

和一些条目

pizza_id |      name       |       ingredients           |         kingsize_ingredients
---------+-----------------+-----------------------------+-------------------------------------
    1    |  moutainview    | cheese,sausage,potato       | cheese,sausage,potato,tomato
    2    |  the o' chicken | cheese,chicken,tomato       | cheese,chicken,tomato,eggs
    3    |  hawai          | mozarella,tomato,pineapple  | mozarella,tomato,pineapple,sausage

这是虚构的,在这个例子中我将成分堆叠在一个长逗号分隔的字符串中,我知道它是愚蠢的,但我试图为我的问题提供一个环境。

基本上,虚拟引擎接受一个字符串并在pizzas表中搜索匹配项。搜索是在多个列上执行的,我的目标是使搜索引擎不仅会返回搜索匹配的比萨的名称,还会返回搜索匹配的行中的列

例如,如果我在上一个表中搜索<​​em>&#34; tomato&#34; ,我应该有这个输出:

 name           |         found_in
----------------+-------------------------------------
 mountainview   | {kingsize_ingredients}
 hawai          | {ingredients,kingsize_ingredients}
 the o' chicken | {ingredients,kingsize_ingredients}

实际上我回答了我的问题,在这里我提供了解决方案:

SELECT
  name,
  array_agg(found_in) AS found_in
FROM (
       SELECT
         *,
         'ingredients' AS found_in
       FROM pizzas
       WHERE ingredients ILIKE '%tomato%'

       UNION ALL

       SELECT
         *,
         'kingsize_ingredients' AS found_in
       FROM pizzas
       WHERE kingsize_ingredients ILIKE '%tomato%'
     ) AS founds
GROUP BY (name)

但我认为在搜索方面,优化是一个优先事项,因为我用我个人对PostgreSQL的知识(这不是我的专业领域)进行了这个查询,我不确定我是否正确。这个问题不是要讨论使PostgreSQL查询尽可能优化的方式是什么,它是关于询问这个查询是否有错误的结构或缺陷?

以下是需要在家初始化的代码:

DROP TABLE IF EXISTS pizzas;
CREATE TEMP TABLE pizzas (
  pizza_id             INT,
  name                 TEXT,
  ingredients          TEXT,
  kingsize_ingredients TEXT
);

INSERT INTO pizzas VALUES
  (1, 'moutainview', 'cheese,sausage,potato', 'cheese,sausage,potato,tomato'),
  (2, 'the o'' chicken', 'cheese,chicken,tomato', 'cheese,chicken,tomato,eggs'),
  (3, 'hawai', 'mozarella,tomato,pineapple', 'mozarella,tomato,pineapple,sausage');

由于

0 个答案:

没有答案