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.
¡Fantástico! Eso es exactamente lo que estaba buscando. Tendré que pasar más tiempo en el manual. ¡Gracias! – phatskat
@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
@Growler Aún no, parece un buen tema para una nueva pregunta. –