2012-05-25 9 views
12

He sido reclutados para ayudar en un proyecto y estoy de buceo de nuevo en PostgreSQL después de no trabajar con él durante varios años. Dejando de lado la falta de uso, nunca antes me había topado con los campos de tsvector y ahora me encuentro frente a un error basado en ellos. He leído la documentación del tipo de campo y su propósito, pero estoy teniendo dificultades para desenterrar documentación sobre cómo 'simple' difiere de 'Inglés' como primer parámetro a to_tsquery()"to_tsquery" en los rendimientos tsvector diferentes resultados cuando se utiliza "simple" y "Inglés"?

Ejemplo

> SELECT to_tsvector('mortgag') @@ to_tsquery('simple', 'mortgage') 
?column? 
---------- 
f 
(1 row) 

> SELECT to_tsvector('mortgag') @@ to_tsquery('english', 'mortgage') 
?column? 
---------- 
t 
(1 row) 

yo pensaría ambos deberían devolver cierto, pero, obviamente, el primero no lo hace - por qué?

Respuesta

18

El FTS utiliza dictionaries para normalizar el texto:

12,6. Diccionarios

diccionarios se utilizan para eliminar las palabras que no deben ser considerados en una búsqueda (palabras vacías ), y para normalizar palabras para que diferentes formas derivadas de la misma palabra coincidirán. Una palabra éxito normalizado se llama lexema .

Así diccionarios se utilizan para tirar cosas que son demasiado comunes o sin sentido a tener en cuenta en una búsqueda (palabras vacías) y normalizar todo lo demás por lo ciudad y ciudades, por ejemplo, coincidirá a pesar de que son palabras diferentes.

Veamos algunos salida de ts_debug y ver lo que está pasando con los diccionarios:

=> select * from ts_debug('english', 'mortgage'); 
    alias | description | token | dictionaries | dictionary | lexemes 
-----------+-----------------+----------+----------------+--------------+----------- 
asciiword | Word, all ASCII | mortgage | {english_stem} | english_stem | {mortgag} 

=> select * from ts_debug('simple', 'mortgage'); 
    alias | description | token | dictionaries | dictionary | lexemes 
-----------+-----------------+----------+--------------+------------+------------ 
asciiword | Word, all ASCII | mortgage | {simple}  | simple  | {mortgage} 

en cuenta que simple utiliza el diccionario simple mientras que english utiliza el diccionario english_stem.

El simple dictionary:

opera mediante la conversión de la señal de entrada a minúsculas y comprobar que en contra de un archivo de palabras vacías. Si se encuentra en el archivo, se devuelve una matriz vacía, lo que hace que la ficha se descarte. De lo contrario, la forma de la palabra en mayúsculas se devuelve como el lexema normalizado.

El diccionario simple simplemente arroja palabras de parada, en vano, y eso es todo. Podemos ver su simplicidad nosotros mismos:

=> select to_tsquery('simple', 'Mortgage'), to_tsquery('simple', 'Mortgages'); 
to_tsquery | to_tsquery 
------------+------------- 
'mortgage' | 'mortgages' 

El diccionario simple es demasiado simple para manejar incluso los plurales simples.

Entonces, ¿qué es este diccionario english_stem todo esto? La "madre" es un sufijo regalar: este diccionario se aplica un algoritmo de división de palabras para convertir (por ejemplo) ciudad y ciudades a lo mismo.Del fine manual:

12.6.6. Snowball Dictionary

La plantilla del diccionario Snowball se basa en un proyecto de Martin Porter, inventor del popular algoritmo de derivación de Porter para el idioma inglés. [...] Cada algoritmo entiende cómo reducir formas de palabras comunes a una base, o raíz, ortografía dentro de su lenguaje.

Y justo por debajo de lo que vemos el diccionario english_stem:

CREATE TEXT SEARCH DICTIONARY english_stem (
    TEMPLATE = snowball, 
    Language = english, 
    StopWords = english 
); 

Así el diccionario english_stem tallos palabras y podemos ver que esto suceda:

=> select to_tsquery('english', 'Mortgage'), to_tsquery('english', 'Mortgages'); 
to_tsquery | to_tsquery 
------------+------------ 
'mortgag' | 'mortgag' 

Resumen ejecutivo: 'simple' implica coincidencia literal de mente simple, 'english' se aplica debido a (con suerte) producir una mejor coincidencia. La derivación convierte hipoteca en hipoteca y eso le da su coincidencia.

+0

¡Fantástico! Eso es exactamente lo que estaba buscando. Tendré que pasar más tiempo en el manual. ¡Gracias! – phatskat

+0

@mu es demasiado corto ¿Te has encontrado con un problema con postgresql 9.6.1 donde los caracteres no romanos, como '你' en 'to_tsvector (título) @@ to_tsquery ('你')' no podrían encontrar una cadena que contiene '你' en '你 好嗎' – Growler

+0

@Growler Aún no, parece un buen tema para una nueva pregunta. –

Cuestiones relacionadas