Psql和rails搜索国家字符

时间:2018-03-02 10:38:32

标签: ruby-on-rails postgresql psql

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

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

1 个答案:

答案 0 :(得分:0)

您可以使用扩展程序 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)

当可以有更多行时,则使用index:

postgres=# SET enable_seqscan TO off;
SET
postgres=# EXPLAIN SELECT * FROM names WHERE _unaccent(name) = 'Stehule';
+----------------------------------------------------------------------------------+
|                                    QUERY PLAN                                    |
+----------------------------------------------------------------------------------+
| Index Scan using names__unaccent_idx on names  (cost=0.12..8.14 rows=1 width=32) |
|   Index Cond: (_unaccent(name) = 'Stehule'::text)                                |
+----------------------------------------------------------------------------------+
(2 rows)