2016-07-26 58 views
0

我希望在我的应用程序中使用搜索功能。如何在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"...}

我怎样才能做到这一点?

+0

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

+0

感谢您的回复,我一定会试试这个。 –

回答

1

试试这个功能。

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) 
+0

谢谢你的回复,我会试试这个。 –