4

検索に Pg 全文検索を使用しています。Ruby on rails を使っているので、pg_search gem を使っています。部分文字列にもヒットするように構成するにはどうすればよいですか。

pg_search_scope :search_by_detail, 
              :against => [
                   [:first_name,'A'],
                   [:last_name,'B'],
                   [:email,'C']
              ],                  
              :using => {
                :tsearch => {:prefix => true}
              }

現在、部分文字列が先頭にある場合はヒットしますが、部分文字列が途中にある場合はヒットしません

example sdate@example.com にはヒットしますが、example.com にはヒットしません

4

1 に答える 1

7

私は pg_search の作成者でありメンテナーです。

残念ながら、PostgreSQL の tsearch はデフォルトで電子メール アドレスを分割せず、部分的に照合することができません。ただし、検索をオンに:trigramすると、検索可能なテキストの任意の場所にある任意の部分文字列に一致するため、機能する可能性があります。

pg_search_scope :search_by_detail,
                :against => [
                  [:first_name,'A'],
                  [:last_name,'B'],
                  [:email,'C']
                ],
                :using => {
                  :tsearch => {:prefix => true},
                  :trigram => {}
                }

psql で次のコマンドを実行して、これを確認しました。

grant=# SELECT plainto_tsquery('example.com') @@ to_tsvector('english', 'name@example.com');
 ?column? 
----------
 f
(1 row)

パーサーが電子メール アドレスを検出することはわかっているので、可能であるに違いないと思います。ただし、メールアドレスを適切にトークンに分割するテキスト検索辞書を PostgreSQL で構築する必要があります。

以下は、テキスト検索パーサーがメール アドレスであることを認識している証拠です。

grant=# SELECT ts_debug('english', 'name@example.com');
                                  ts_debug                                   
-----------------------------------------------------------------------------
 (email,"Email address",name@example.com,{simple},simple,{name@example.com})
(1 row)
于 2012-10-13T18:30:07.207 に答える