12

モデル内のテキスト検索にpg_searchを使用しています。他の属性の中でも、urlフィールドがあります。

/残念ながら、Postgres はと.を単語の区切り文字として識別しないようですurl

例: http://test.comtestで検索しても結果が得られません。

おそらく別のgemまたはインラインSQLを使用して、この問題を解決する方法はありますか?

4

3 に答える 3

5

ドキュメントに記載されているように (そして 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;
于 2013-01-02T10:53:48.427 に答える
1

カラム名だけでなく、任意の ts_vector 式をサポートするようにpg_search gem を変更することになりました。変更点はこちら

今私は書くことができます:

pg_search_scope :search, 
    against: [[:title , 'B'], ["to_tsvector(regexp_replace(url, '[^\\w]+', ' ', 'gi'))", 'A']],
    using: {tsearch: {dictionary: "simple"}}
于 2013-01-06T10:44:47.900 に答える