【问题标题】:Psql and rails search with national characters使用国家字符的 Psql 和 rails 搜索
【发布时间】:2018-08-10 13:38:06
【问题描述】:

我在 psql/rails 中搜索带有国家字符的单词时遇到问题。 带有 'ö'、'ó'、'ł'、'ü' 等包词的词 - 现在在 db 中它的名称为:'łódź' - 搜索 'łódź' - 没关系,但有些人没有这些特殊包词当搜索“lodz”时搜索返回 0 个结果。 我希望“Hästgård”适合:Hästgård、Hästgard、Hastgård 和/或 Hastgard

如何解决这个问题? 在 mysql 中,它通过排序规则 'utf8_unicode_ci' 进行搜索及其工作..

【问题讨论】:

    标签: ruby-on-rails postgresql psql


    【解决方案1】:

    你可以使用扩展unaccent

    postgres=# create extension unaccent ;
    CREATE EXTENSION
    
    -- with fixed dictionary, the function can be immutable
    CREATE OR REPLACE FUNCTION public._unaccent(text)
    RETURNS text
    LANGUAGE sql
    IMMUTABLE
    AS $function$ SELECT unaccent('unaccent', $1) $function$
    
    postgres=# CREATE INDEX ON names((_unaccent(name)));
    CREATE INDEX
    
    postgres=# INSERT INTO names VALUES('Stěhule');
    INSERT 0 1
    
    postgres=# SELECT * FROM names WHERE _unaccent(name) = 'Stehule';
    +---------+
    |  name   |
    +---------+
    | Stěhule |
    +---------+
    (1 row)
    

    当可以有更多行时,使用索引:

    postgres=# SET enable_seqscan TO off; 放 postgres=# EXPLAIN SELECT * FROM names WHERE _unaccent(name) = 'Stehule'; +-------------------------------------------------- ---------------------------------+ |查询计划 | +-------------------------------------------------- ---------------------------------+ |在名称上使用 names__unaccent_idx 进行索引扫描 (cost=0.12..8.14 rows=1 width=32) | |索引条件: (_unaccent(name) = 'Stehule'::text) | +-------------------------------------------------- ---------------------------------+ (2 行)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-03
      • 2017-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多