1

アプリケーションに検索機能が必要です。

それを達成するためにtrigramを使用しましたが、うまく機能しています。

問題は次のとおりです。

trigram は単語の 3 文字グループのシーケンスを作成しています。1 つのオブジェクトに 3 つ以上の文字が必要です。例えば:

select show_trgm('abcpqrs');

これは以下を返します:{" a"," ab","abc","bcp","cpq","pqr","qrs","rs "}

私が欲しい{" a"," ab","abc","bcp","cpq","pqr","qrs","rs ","abcd","bcpq","cpqr"...}

どうすればこれを達成できますか?

4

1 に答える 1

2

この機能を試してみてください。

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)
于 2016-08-02T19:29:10.783 に答える