【问题标题】:index a formatted date for full text search in both english and french为英文和法文全文搜索的格式化日期编制索引
【发布时间】:2022-01-21 02:36:20
【问题描述】:

对于英语我做:

select to_char(starts_at, 'TMHH:MIAM DayDD MonthYYYY') from events limit 1;
             to_char              
----------------------------------
 5:40AM Saturday 18 December 2021
(1 row)

然后创建一个索引:

create index index_events_on_tsvector_english_starts_at
on events
using gin (to_tsvector('english', to_char(starts_at, 'TMHH:MIAM DayDD MonthYYYY'))

我知道我能做到:

SET LC_TIME = 'fr_FR';

但这不会为我的列编入法文索引以供将来添加的行吗? (不确定)

那么,我怎样才能创建一个英文索引和一个法文索引?这样我的法语和英语用户就可以通过全文搜索来搜索日期了吗?

编辑:我无法创建索引,因为我的函数不是不可变的

socializus_development=#       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
socializus_development=# 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

【问题讨论】:

  • 你给出的格式字符串无论如何都不依赖于 LC_TIME。
  • 是的,我应该使用TM,例如TMHH:MIAM DayDD MonthYYYY
  • @jjanes 奇怪的是即使我这样做SET LC_TIME = 'fr_FR.UTF-8';, select to_char(starts_at, 'TMHH:MIAM DayDD MonthYYYY') from events limit 1; 给我一个英文结果
  • 您需要在相关部分之前使用TM,例如:SET LC_TIME = 'fr_FR.UTF-8'; select to_char(now(), 'TMHH:MIAM TMDayDD TMMonthYYYY');,给出:" 07:13PM Samedi18 Décembre2021"
  • 谢谢@Luuk select to_char(starts_at, 'FMHH24hMI TMDay DD TMMonth YYYY') from events limit 1; 给了我5h40 Samedi 18 Décembre 2021,我想我需要有法语/英语索引的功能

标签: sql postgresql strftime


【解决方案1】:

你不应该找到Wednesday(或Mercredi),而是找到一周的第三天。

见:DBFIDDLE

我像这样创建了一个表dow

i name_en name_fr
0 Sunday Dimanche
1 Monday Lundi
2 Tuesday Mardi
3 Wednesday Mercredi
4 Thursday Jeudi
5 Friday Vendredi
6 Saturday Samedi

要查找法国人的下 5 个星期三,(使用“Mercredi”搜索):

SELECT  
    d,
    to_char(d,'TMDay'),
    to_char(d,'Day'),
    EXTRACT(DOW FROM dates.d)
FROM dates 
WHERE EXTRACT(DOW FROM dates.d) = (SELECT i FROM dow WHERE name_FR='Mercredi')
  AND d>NOW()
ORDER BY d
LIMIT 5;

而且,是的,这不是对 Mercredi 的全文搜索,但我认为,这是找到一周中第三天的更快方法。

【讨论】:

  • 我想我会做一个类似的方法,我将查询拆分为单词和搜索,并匹配对应于工作日名称或月份名称的单词,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多