我想知道在使用全文搜索时创建一个结合两个函数的索引是否有意义:lower(name)
而f_unaccent(name)
Wheref_unaccent
只是我的包装器,使 unaccent 函数不可变。
我确实有一个正在处理的索引:f_unaccent(name)
使用varchar_pattern_ops
. 我的问题是:组合lower
和unaccent
函数的索引是否会被 full_text_search 触发lower(f_unaccent(name))
。
我不知道该lower
函数是否对全文搜索算法有用。
我希望能够在 Postgres 中以屈折(波兰)语言搜索无重音的短语。
比如说,如果一个文档包含robi?em
,则词位应该是robi?
(infinivite)。它的形式有robi?
、robi?
、robi?a
等等。例如,我希望能够找到它,robie
其中包含一个不带重音的短语robi?
。
我所做的是从一个运行良好的波兰语文本搜索配置开始
CREATE TEXT SEARCH DICTIONARY polish_ispell (
TEMPLATE = pg_catalog.ispell,
dictfile = 'polish', afffile = 'polish', stopwords = 'polish' );
Run Code Online (Sandbox Code Playgroud)
然后我尝试扩展它以包含unaccent
.
create extension unaccent;
create text search configuration polish_unaccented (copy = polish);
ALTER TEXT SEARCH CONFIGURATION polish_unaccented ALTER MAPPING FOR hword,
hword_part, word WITH unaccen, polish_ispell, simple, ;
Run Code Online (Sandbox Code Playgroud)
遗憾的是,使用此配置无法正确创建词法:
select to_tsvector('polish_unaccented' ,'robi?');
'robil':1
Run Code Online (Sandbox Code Playgroud)
词素当然应该是:
'robi?':1
Run Code Online (Sandbox Code Playgroud)
所以下面不能返回true(这就是我认为我需要的):
select to_tsvector('polish_unaccented','robi?') @@ …
Run Code Online (Sandbox Code Playgroud) 我在 Mac OS X Yosemite 上运行 PostgreSQL 9.3。
我尝试创建一个非重音小写三元组索引。为了实现它,我这样做了:
mydb=# CREATE EXTENSION pg_trgm SCHEMA public VERSION "1.1";
CREATE EXTENSION unaccent SCHEMA public;
ALTER FUNCTION unaccent(text) IMMUTABLE;
CREATE EXTENSION
CREATE EXTENSION
ALTER FUNCTION
Run Code Online (Sandbox Code Playgroud)
然后我尝试创建索引:
mydb=# CREATE INDEX author_label_hun_gin_trgm ON address
USING gin (public.unaccent(lower(label_hun)) gin_trgm_ops);
ERROR: text search dictionary "unaccent" does not exist
Run Code Online (Sandbox Code Playgroud)
...并得到这个错误。如果我尝试列出可用的文本搜索词典,该unaccent
词典似乎就在那里:
mydb=# \dFd
List of text search dictionaries
Schema | Name | Description
------------+-----------------+-----------------------------------------------------------
pg_catalog | danish_stem | snowball stemmer for danish language
pg_catalog | dutch_stem | …
Run Code Online (Sandbox Code Playgroud) 假设我有一个words
包含非常多记录的表。
列是id
和name
。
在words
我的表格中,例如:
'systematic', '????','gear','synthesis','mysterious', etc.
Run Code Online (Sandbox Code Playgroud)
注意:我们也有 utf8 字样。
如何有效地查询,看看哪些词包含字母's'
,'m'
和'e'
(所有的他们)?
输出将是:
systematic,mysterious
Run Code Online (Sandbox Code Playgroud)
我不知道如何做这样的事情。它应该是高效的,否则我们的服务器会受到影响。