我真的在我的智慧结束,有这个问题,我真的希望有人可以帮助我。我正在使用Postgresql 9.3。我的数据库主要包含德语文本,但不仅如此,因此它以utf-8编码。我想建立一个支持德语的全文搜索,到目前为止没什么特别的。 但搜索行为真的很奇怪,我无法找出我做错了什么。
因此,给出下面的表作为示例
select * from test;
a
-------------
ein Baum
viele Bäume
Überleben
Tisch
Tische
Café
\d test
Tabelle »public.test«
Spalte | Typ | Attribute
--------+------+-----------
a | text |
sintext=# \d
Liste der Relationen
Schema | Name | Typ | Eigentümer
--------+---------------------+---------+------------
(...)
public | test | Tabelle | paf
现在,让我们看看一些文本搜索示例:
select * from test where to_tsvector('german', a) @@ plainto_tsquery('Baum');
a
-------------
ein Baum
viele Bäume
select * from test where to_tsvector('german', a) @@ plainto_tsquery('Bäume');
--> No Hits
select * from test where to_tsvector('german', a) @@ plainto_tsquery('Überleben');
--> No Hits
select * from test where to_tsvector('german', a) @@ plainto_tsquery('Tisch');
a
--------
Tisch
Tische
Tische是Tisch的多个(表)而Bäume是Baum(树)的复数。所以,显然,在文本搜索表现良好的情况下,变音符号不起作用。
但令我困惑的是,a)非德国特殊字符匹配
select * from test where to_tsvector('german', a) @@ plainto_tsquery('Café');
a
------
Café
和b)如果我不使用德语词典,那么变音符号没有问题(当然也没有真正的文本搜索)
select * from test where to_tsvector(a) @@ plainto_tsquery('Bäume');
a
-------------
viele Bäume
所以,如果我使用德语词典进行文本搜索,那么只有德语特殊字符不起作用?严重吗?这到底有什么不对吗?我真的想不出来,请帮忙!
答案 0 :(得分:2)
您明确使用德语词典进行to_tsvector
来电,但不进行to_tsquery
或plainto_tsquery
来电。据推测,您的默认字典未设置为german
;查看SHOW default_text_search_config
。
比较
regress=> select plainto_tsquery('simple', 'Bäume'),
plainto_tsquery('english','Bäume'),
plainto_tsquery('german', 'Bäume');
plainto_tsquery | plainto_tsquery | plainto_tsquery
-----------------+-----------------+-----------------
'bäume' | 'bäume' | 'baum'
(1 row)
语言设置会影响单词简化和根提取,因此来自一种语言的向量不一定与来自另一种语言的查询匹配:
regress=> SELECT to_tsvector('german', 'viele Bäume'), plainto_tsquery('Bäume'),
to_tsvector('german', 'viele Bäume') @@ plainto_tsquery('Bäume');
to_tsvector | plainto_tsquery | ?column?
-------------------+-----------------+----------
'baum':2 'viel':1 | 'bäume' | f
(1 row)
如果您使用一致的语言设置,一切都很好:
regress=> SELECT to_tsvector('german', 'viele Bäume'), plainto_tsquery('german', 'Bäume'),
to_tsvector('german', 'viele Bäume') @@ plainto_tsquery('german', 'Bäume');
to_tsvector | plainto_tsquery | ?column?
-------------------+-----------------+----------
'baum':2 'viel':1 | 'baum' | t
(1 row)