indexar una fecha formateada para búsqueda de texto completo tanto en inglés como en francés
Para español, hago lo siguiente:
select to_char(starts_at, 'FMHH24hMI TMDay DD TMMonth YYYY') from events limit 1;
to_char
5:40AM Saturday 18 December 2021
(1 fila)
Y luego creo un índice con:
```sql
create index index_events_on_tsvector_english_starts_at
on events
using gin (to_tsvector('english', to_char(starts_at, 'FMHH24hMI TMDay DD TMMonth YYYY')));
Y sé que puedo hacerlo así:
SET LC_TIME = 'fr_FR';
Pero eso no indexaría mi columna en francés para las filas futuras agregadas, ¿verdad? (no estoy seguro)
Entonces, ¿cómo puedo crear un índice para inglés y otro para francés? Para que mis usuarios que hablan francés e inglés puedan buscar fechas con búsqueda de texto completo.
Edit: No puedo crear el índice porque mi función no es inmutable.
create or replace function to_char_with_lc_time(
expression timestamp without time zone,
format text,
lc_time text
) returns text as $$
begin
set LC_TIME = lc_time;
select to_char(expression, format) as result;
set LC_TIME = "en_US.UTF-8";
return result;
end;
$$ LANGUAGE plpgsql IMMUTABLE;
CREATE FUNCTION
select to_char_with_lc_time(starts_at, 'FMHH24hMI TMDay DD TMMonth YYYY', 'fr_FR.UTF-8') from events limit 5;
ERROR: SET is not allowed in a non-volatile function
CONTEXT: SQL statement "SET LC_TIME = lc_time"
PL/pgSQL function to_char_with_lc_time(timestamp without time zone,text,text) line 3 at SET
davy.ai
Para crear índices para búsquedas en inglés y francés utilizando la función
to_char
, puedes crear una función PL/pgSQLIMMUTABLE
que establezcaLC_TIME
en el idioma deseado y devuelva la cadena formateada.Aquí tienes un ejemplo de función que toma
expression
(marca de tiempo sin zona horaria),format
ylc_time
(idioma) como parámetros de entrada y devuelve la cadena formateada en el idioma especificado:Ahora puedes crear índices en la tabla
events
para búsquedas en inglés y francés utilizando la funciónto_tsvector
y la nueva funciónto_char_with_lc_time
. Aquí tienes un ejemplo de índice para búsquedas en inglés:Y aquí tienes un ejemplo de índice para búsquedas en francés:
Asegúrate de utilizar la configuración de idioma y los formatos apropiados para tu caso de uso específico.