es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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
Tags:  , ,

Answer

  1. Avatar for 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/pgSQL IMMUTABLE que establezca LC_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 y lc_time (idioma) como parámetros de entrada y devuelve la cadena formateada en el idioma especificado:

    CREATE FUNCTION to_char_with_lc_time(
        expression timestamp without time zone,
        format text,
        lc_time text
    ) RETURNS text AS $$
    BEGIN
      -- Establecer LC_TIME en el idioma especificado
      EXECUTE 'SET LC_TIME = ''' || lc_time || ''';';
    
      -- Formatear la marca de tiempo
      RETURN to_char(expression, format);
    
      -- Restablecer LC_TIME al idioma predeterminado
      EXECUTE 'SET LC_TIME = ''en_US.UTF-8'';';
    END;
    $$ LANGUAGE plpgsql IMMUTABLE;
    

    Ahora puedes crear índices en la tabla events para búsquedas en inglés y francés utilizando la función to_tsvector y la nueva función to_char_with_lc_time. Aquí tienes un ejemplo de índice para búsquedas en inglés:

    CREATE INDEX index_events_on_tsvector_english_starts_at
    ON events
    USING gin (to_tsvector('english', to_char_with_lc_time(starts_at, 'TMHH:MIAM DayDD MonthYYYY', 'en_US.UTF-8')));
    

    Y aquí tienes un ejemplo de índice para búsquedas en francés:

    CREATE INDEX index_events_on_tsvector_french_starts_at
    ON events
    USING gin (to_tsvector('french', to_char_with_lc_time(starts_at, 'TMHH:MIAM DayDD MonthYYYY', 'fr_FR.UTF-8')));
    

    Asegúrate de utilizar la configuración de idioma y los formatos apropiados para tu caso de uso específico.

Comments are closed.