sql >> Base de Datos >  >> RDS >> PostgreSQL

Búsqueda de texto completo de PG en rieles usando la gema pg_search para la subcadena

Soy el autor y mantenedor de pg_search.

Desafortunadamente, tsearch de PostgreSQL por defecto no divide las direcciones de correo electrónico y le permite compararlas con partes. Podría funcionar si activas :trigram Sin embargo, busca, ya que coincide con subcadenas arbitrarias que aparecen en cualquier parte del texto que se puede buscar.

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

Lo confirmé ejecutando el siguiente comando en psql:

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

Sé que el analizador detecta direcciones de correo electrónico, así que creo que debe ser posible. Pero implicaría construir un diccionario de búsqueda de texto en PostgreSQL que dividiría correctamente la dirección de correo electrónico en tokens.

Aquí hay evidencia de que el analizador de búsqueda de texto sabe que es una dirección de correo electrónico:

grant=# SELECT ts_debug('english', '[email protected]');
                                  ts_debug                                   
-----------------------------------------------------------------------------
 (email,"Email address",[email protected],{simple},simple,{[email protected]})
(1 row)