2016-07-26 1 views
0

私のアプリケーションで検索機能が必要です。postgresqlでn-gramを作成するには

私はそれを達成するためにトライグラムを使用しましたが、うまくいきました。

問題は次のとおりです。

トライグラムは、単語の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

返事ありがとう、私はこれを試してみます。 –

関連する問題