2016-07-26 15 views
0

Ich möchte Suchfunktion in meiner Anwendung.So erstellen Sie N-Gramm in Postgresql

Ich habe Trigramm verwendet, um es zu erreichen, und es funktioniert gut.

Problem ist:

Trigramm-Sequenz von 3 Zeichen Gruppe von Wort schafft. Ich möchte mehr als 3 Zeichen in einem einzelnen Objekt. Beispiel:

select show_trgm('abcpqrs'); 

Dies wird zurück: {" a"," ab","abc","bcp","cpq","pqr","qrs","rs "}

Ich möchte {" a"," ab","abc","bcp","cpq","pqr","qrs","rs ","abcd","bcpq","cpqr"...}

Wie kann ich das erreichen?

+0

Sie könnten eine benutzerdefinierte Funktion dafür erstellen. –

+0

Danke für die Antwort, ich werde das definitiv versuchen. –

Antwort

1

Probieren Sie diese Funktion aus.

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; 

Ergebnisse aus meinen Tests.

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

Danke für die Antwort, ich werde das versuchen. –