Psql和rails搜索国家字符

问题描述 投票:0回答:1

我在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个回答
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)
© www.soinside.com 2019 - 2024. All rights reserved.