モデル内のテキスト検索にpg_searchを使用しています。他の属性の中でも、url
フィールドがあります。
/
残念ながら、Postgres はと.
を単語の区切り文字として識別しないようですurl
。
例: http://test.comtest
で検索しても結果が得られません。
おそらく別のgemまたはインラインSQLを使用して、この問題を解決する方法はありますか?
モデル内のテキスト検索にpg_searchを使用しています。他の属性の中でも、url
フィールドがあります。
/
残念ながら、Postgres はと.
を単語の区切り文字として識別しないようですurl
。
例: http://test.comtest
で検索しても結果が得られません。
おそらく別のgemまたはインラインSQLを使用して、この問題を解決する方法はありますか?
ドキュメントに記載されているように (そして AJcodez によって通知された)、tsvector インデックス専用の列を作成する解決策があります。次に、挿入をキャッチして URL を適切にインデックス化するトリガーを定義します。
CREATE test_url (url varchar NOT NULL, url_tsvector tsvector NOT NULL);
このメソッドは、英字以外の文字を単一のスペースに変換し、文字列を tsvector に変換します。
CREATE OR REPLACE FUNCTION generate_url_tsvector(varchar)
RETURNS tsvector
LANGUAGE sql
AS $_$
SELECT to_tsvector(regexp_replace($1, '[^\w]+', ' ', 'gi'));
$_$;
次に、この関数を呼び出すトリガーを作成します。
CREATE OR REPLACE FUNCTION before_insert_test_url()
RETURNS TRIGGER
LANGUAGE plpgsql AS $_$
BEGIN;
NEW.url_tsvector := generate_url_tsvector(NEW.url);
RETURN NEW;
END;
$_$
;
CREATE TRIGGER before_insert_test_url_trig
BEFORE INSERT ON test_url
FOR EACH ROW EXECUTE PROCEDURE before_insert_test_url();
これで、url が挿入されると、`url_tsvectorè フィールドが自動的に入力されます。
INSERT INTO test_url (url) VALUES ('http://www.google.fr');
TABLE test_url;
id url url_tsvector
2 http://www.google.fr 'fr':4 'googl':3 'http':1 'www':2
(1 row)
URL を FT 検索するには、このフィールドに対してクエリを実行するだけです。
SELECT * FROM test_url WHERE url_tsvector @@ 'google'::tsquery;