如何在postgresql中创建n-gram

如何在postgresql中创建n-gram,postgresql,n-gram,trigram,Postgresql,N Gram,Trigram,我希望在我的应用程序中具有搜索功能 我使用三角形来实现它,它工作得很好 问题是: 三元图是创建3个字符组的单词序列。 我希望在单个对象中包含3个以上的字符。 例如: select show_trgm('abcpqrs'); 这将返回:{“a”、“ab”、“abc”、“bcp”、“cpq”、“pqr”、“qrs”、“rs”} 我想要{“a”、“ab”、“abc”、“bcp”、“cpq”、“pqr”、“qrs”、“rs”、“abcd”、“bcpq”、“cpqr”…} 如何实现此功能?尝试此功能 C

我希望在我的应用程序中具有搜索功能

我使用三角形来实现它,它工作得很好

问题是:

三元图是创建3个字符组的单词序列。 我希望在单个对象中包含3个以上的字符。 例如:

select show_trgm('abcpqrs');
这将返回:
{“a”、“ab”、“abc”、“bcp”、“cpq”、“pqr”、“qrs”、“rs”}

我想要
{“a”、“ab”、“abc”、“bcp”、“cpq”、“pqr”、“qrs”、“rs”、“abcd”、“bcpq”、“cpqr”…}

如何实现此功能?

尝试此功能

CREATE OR REPLACE FUNCTION myngram(mystr TEXT, n INT) RETURNS TEXT[]
AS $$
DECLARE
str VARCHAR;
arr TEXT[];
BEGIN

  str := lpad(mystr, n - 1 + char_length(mystr), ' ');
  str := rpad(str, n - 1 + char_length(str), ' ');

  arr := array[]::TEXT[];
  FOR i IN 1 .. char_length(str) - n + 1 LOOP
    arr := arr || substring(str from i for n);
  END LOOP;
  RETURN arr;
END
$$
LANGUAGE plpgsql;
我测试的结果

testdb=# SELECT myngram('abcpqrs', 4);
                             myngram                             
-----------------------------------------------------------------
 {"   a","  ab"," abc",abcp,bcpq,cpqr,pqrs,"qrs ","rs  ","s   "}
(1 row)

testdb=# SELECT myngram('abcpqrs', 5);
                                       myngram                                       
-------------------------------------------------------------------------------------
 {"    a","   ab","  abc"," abcp",abcpq,bcpqr,cpqrs,"pqrs ","qrs  ","rs   ","s    "}
(1 row)

您可以创建一个用户定义的函数来执行此操作。