postgresql + textsearch + 德国元音变音 + UTF8

Paf*_*low 1 postgresql full-text-search utf-8 diacritics

我真的不知所措,遇到这个问题,我真的希望有人能帮助我。我正在使用 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
Run Code Online (Sandbox Code Playgroud)

现在,让我们看一些文本搜索示例:

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
Run Code Online (Sandbox Code Playgroud)

而 Tische 是 Tisch(桌子)的复数形式,而 Bäume 是 Baum(树)的复数形式。因此,显然变音符号不起作用而 textsearch 表现良好。

但真正让我困惑的是,a)非德语特殊字符正在匹配

select * from test where to_tsvector('german', a) @@ plainto_tsquery('Café');
   a   
 ------
  Café
Run Code Online (Sandbox Code Playgroud)

b) 如果我不使用德语词典,变音就没有问题(当然也没有真正的文本搜索)

select * from test where to_tsvector(a) @@ plainto_tsquery('Bäume');
     a      
-------------
 viele Bäume
Run Code Online (Sandbox Code Playgroud)

那么,如果我使用德语词典进行文本搜索,只是德语特殊字符不起作用?严重地?这里到底有什么问题?实在想不通,求大神帮忙!

Cra*_*ger 5

您明确地使用德语词典进行to_tsvector调用,但不使用to_tsqueryorplainto_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)
Run Code Online (Sandbox Code Playgroud)

语言设置会影响单词简化和词根提取,因此来自一种语言的向量不一定匹配来自另一种语言的查询:

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)
Run Code Online (Sandbox Code Playgroud)

如果您使用一致的语言设置,一切都很好:

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)
Run Code Online (Sandbox Code Playgroud)