Diccionario personalizado para búsqueda fulltext en Postgres

Así que aquí va una historia sobre mi búsqueda para mejorar la búsqueda en una instancia de foro en checo.

Desafortunadamente, PostgreSQL actual (12) no incluye un diccionario checo integrado. El idioma checo tiene 7 declinaciones (es decir, un sustantivo puede tomar 7 formas diferentes según el contexto), por lo que, como pueden imaginar, la búsqueda funciona bastante mal para nosotros.

Descubrí cómo agregar el diccionario y hacerlo funcionar dentro de la instancia de Docker (detalles a continuación), pero aún así no pude lograr que funcionara incluso después de reindexar. Resulta que Discourse selecciona el diccionario según la configuración de default_locale, y solo lo selecciona para los idiomas que vienen con Postgres; para todos los demás, utiliza el diccionario simple.

Por favor, ¿podríamos tener una configuración de sitio adicional para especificar un diccionario de búsqueda personalizado?
Verifiqué que todo comienza a funcionar cuando edité manualmente lib/search.rb.

Esto es lo que hice para agregar el diccionario, replicando esencialmente los pasos de aquí:

y aquí:

sudo ./launcher enter app
# Lo siguiente también debe agregarse a container/app.yml para que se ejecute en cada reconstrucción del contenedor
curl -L https://github.com/freaz/docker-postgres-czech-unaccent/raw/master/czech_unaccent.tar.gz | tar -xzC /tmp/ && mv /tmp/fulltext_dicts/czech* /usr/share/postgresql/1?/tsearch_data/
sudo -u postgres psql discourse
CREATE TEXT SEARCH DICTIONARY czech
   (template=ispell, dictfile = czech_unaccent, afffile=czech_unaccent, stopwords=czech_unaccent);
CREATE TEXT SEARCH CONFIGURATION czech (copy=english);
ALTER TEXT SEARCH CONFIGURATION czech
  ALTER MAPPING FOR word, asciiword WITH cspell, simple;
# Verificar
\dF
# Probar
select * from ts_debug('czech_unaccent','Prilis zlutoucky kun se napil zlute vody');
Ctrl-D
rake search:reindex
Ctrl-D
# En containers/app.yml establecer
db_default_text_search_config: "public.czech"
# reconstruir

Hay un problema más con los acentos. El enfoque anterior descarga el diccionario sin acentos, por lo que funcionará junto con la configuración search ignore accents activada. Si desea buscar con acentos, debe descargar el diccionario de https://postgres.cz/data/czech.tar.gz.

Creo que este problema también aplica a otros idiomas con soporte predeterminado de Postgres. :frowning: Si elimina los acentos, esencialmente está desactivando el stemmer para su idioma en palabras que contienen caracteres acentuados. Por lo tanto, no está nada claro si esta función debería estar activada para estos idiomas.

4 Me gusta

@sam, ¿estarías abierto a una PR para lo anterior?

Alternativamente, podríamos modificar la imagen base de Docker para incluir más diccionarios de búsqueda de Postgres de forma predeterminada, pero eso sería mucho más difícil.