1

我正在尝试使用 Postgres 创建一个基于三元词的搜索。这个想法是实现一个简单化的did you mean.

我想要一张带有三字词而不是字符串的表格。我确实知道 Postgres 为字符串(pg_tgrm)提供了三元组,但我想做到这一点:

` roses beautiful red colar sun`

三字词

[`roses beautiful red`, `beautiful red colar`, `red colar sun`]

如何在查询中实现这一目标的最有效和最快的方法。

Select column from table -- transforming into the above 每一行?

我试过了:

with words as (
 select unnest(regexp_split_to_array(`roses beautiful red colar sun`,'\s+')) as c from col
)
select c1.c || c2.c
from words c1
cross join words c2;

但我不知道如何将交叉连接用于更高级的场景。

4

1 回答 1

1

您可以通过以下功能使用 PostgreSQL 全文搜索的强大功能:

CREATE FUNCTION phrase_trigram(regconfig, text) RETURNS tsquery
   LANGUAGE plpgsql AS
$$DECLARE
   words text[];
   i integer;
   result tsquery;
   q tsquery;
BEGIN
   /* split the string into an array of words */
   words := regexp_split_to_array($2, '[[:space:]]+');

   FOR i IN 1..cardinality(words) - 2 LOOP
      /* a phrase consisting of three consecutive words */
      q := phraseto_tsquery($1, array_to_string(words[i:i+2], ' '));
      IF result IS NULL THEN
         result := q;
      ELSE
         /* append with "or" */
         result := result || q;
      END IF;
   END LOOP;

   RETURN result;
END;$$;

这构建了一个全文搜索查询,用于测试您想要的“三字”短语。

像这样使用它:

SELECT to_tsvector('english', 'a text containing beautiful red colar')
       @@ phrase_trigram('english', 'roses beautiful red colar sun'::text);
于 2020-11-23T00:30:02.993 回答