【问题标题】: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 行)