2009-09-30 10 views
24

Estoy usando la búsqueda de texto completo de PostgreSQL para un proyecto donde las palabras de finalización tradicionales ('a', 'the', 'if', etc.) deben indexarse ​​y buscarse, lo cual no es el comportamiento predeterminado. Por ejemplo, podría querer que mis usuarios encuentren resultados para la consulta 'ser o no ser'.¿Puedo configurar palabras de detención programáticamente con la búsqueda de texto completo de PostgreSQL?

El documentation indica que podría lograr esto creando un diccionario de palabras vacías vacío en $SHAREDIR/tsearch_data/english.stop (por ejemplo), pero esto complicará la implementación; Quiero ser capaz de configurar el manejo de palabras de detención de PostgreSQL con SQL. es posible? Si es así, ¿puede proporcionar una declaración SQL de muestra?

Respuesta

34

De acuerdo con sus comentarios sobre la respuesta anterior, se puede cambiar fácilmente entre el uso de no hay palabras vacías ytodo dejar de palabras. Puede lograr esto con una configuración de búsqueda personalizada:

(1) Se puede crear un diccionario personalizado sin necesidad de utilizar el archivo de palabras vacías, por ejemplo:

CREATE TEXT SEARCH DICTIONARY english_stem_nostop (
    Template = snowball 
    , Language = english 
); 

nota, en lo anterior me he dejado la StopWords parámetro.

(2) A continuación, cree una nueva configuración a utilizar su nuevo diccionario:

CREATE TEXT SEARCH CONFIGURATION public.english_nostop (COPY = pg_catalog.english); 
ALTER TEXT SEARCH CONFIGURATION public.english_nostop 
    ALTER MAPPING FOR asciiword, asciihword, hword_asciipart, hword, hword_part, word WITH english_stem_nostop; 

(3) Entonces, cuando se busca especificar la configuración que desea utilizar (alternativamente, se puede cambiar la opción default_text_search_config cada vez), por ejemplo:

SELECT 
    title 
FROM 
    articles 
WHERE 
    to_tsvector('english_nostop', COALESCE(title,'') || ' ' || COALESCE(body,'')) 
    @@ to_tsquery('english_nostop', 'how & to'); 

puede especificar simplemente 'english' en el SQL anterior para utilizar la configuración normal.

Nota, en este ejemplo que el uso de la configuración estándar dará lugar a avisos porque hay sólo palabras vacías.


Tenga en cuenta lo siguiente, sin embargo:

  • Si está utilizando índices, se necesitan dos - uno para cada configuración. (vea estos documentos: tsearch tables y triggers).
  • Comprueba qué fichas del analizador quieres usar esta asignación según el paso 2 anterior (consulta Parsers).
+0

Gracias, catchdave, eso es lo que estaba buscando. – tomd

2

No, las palabras de finalización solo se pueden configurar a través de ese archivo. Puede tener una función del lado del servidor que modifique el archivo, pero eso requiere que el archivo se escriba: puede hacerlo el usuario del servicio postgres, que probablemente no desee.

+1

Bien, gracias. Para ser claro, no es posible decirle a PostgreSQL que no use * ningún * archivo de palabras vacías. – tomd

Cuestiones relacionadas