全文搜索postgresql:如何替换2个字母

全文搜索postgresql:如何替换2个字母,postgresql,Postgresql,我有一个postgresql数据库,里面有拉丁语的条目。字母u和v可以在任何文本中随时相互替换 因此,individue这个词也可以写成individue或Individve 如何指示查询或格式化数据库,以便对IndividDue进行搜索时也返回其他两种可能性 谢谢,一种方法是使用选择。。。类似例如: > createdb test > psql -d test psql (9.4.9) Type "help" for help. test=# create table mytes

我有一个postgresql数据库,里面有拉丁语的条目。字母u和v可以在任何文本中随时相互替换

因此,individue这个词也可以写成individue或Individve

如何指示查询或格式化数据库,以便对IndividDue进行搜索时也返回其他两种可能性


谢谢,

一种方法是使用选择。。。类似例如:

> createdb test
> psql -d test
psql (9.4.9)
Type "help" for help.

test=# create table mytest(thestring varchar(20));
CREATE TABLE

test=# insert into mytest values('individue');
INSERT 0 1
test=# insert into mytest values('indiuidue');
INSERT 0 1
test=# insert into mytest values('indiuidve');
INSERT 0 1
test=# insert into mytest values('indiuidde');
INSERT 0 1
test=# insert into mytest values('indiiidde');
INSERT 0 1

test=# select * from mytest
test-# ;
 thestring 
-----------
 individue
 indiuidue
 indiuidve
 indiuidde
 indiiidde
(5 rows)

test=# select * from mytest where thestring similar to '%(u|v)%';
 thestring 
-----------
 individue
 indiuidue
 indiuidve
 indiuidde
(4 rows)

如果这不符合您的目的,那么正则表达式将能够处理更复杂的情况。

有几种方法-您可以为FTS创建自定义解析器,也可以 只需做如下操作:

create index on base_table 
    using gin( (to_tsvector(replace(upper(column_to_search),'U','V')))
并记住对所有搜索执行相同的替换搜索条件,'U','V'


当然,您可以将其转换为一个不变的函数,该函数将始终将U转换为V。。只要在索引和搜索时都调用它。这样,你就不必经常写出那些难看的替代品了……

如果你真的想用一种可推广的方式来写,你需要创建自己的替代品。如果你需要为有限数量的单词做这项工作,同义词词典可以完成这项工作。否则,您需要创建自定义词典。我会从开始考虑。再考虑一下:也许使用带有适当规则的uncent可以帮你完成这项工作,你不会消除口音,但是更改v->uDoes意味着我应该创建一个文件/usr/local/var/postgres/tsearch_data/latin.rules,其中包含第一行v和第二行v u?更简单的解决方案是:在将数据输入数据库时,将所有v和v都分为u和u。这将导致一个查询,如select id、document_number、,文档的日期来自文档,其中整个文档文本类似于“%indiu | vidu | v%”;恐怕我不能对整个数据库中的所有单词都这样做……谢谢,我这样做了,但是使用了ruby方法,它还有一个优点,就是随着时间的推移,拉丁语拼写不断更新,目前没有字母v和j。因此,在将数据插入数据库之前,我会执行.gsub/[vV]/,'v'=>'u','v'=>'u',搜索时也会执行类似操作。只要您对实际数据的更改感到满意。索引方法的优点是既有原始版本又有替代版本。如果您不需要原件,那么在插入之前进行替换肯定更容易。