2009-07-30 96 views
4

我想在PostgreSQL 8.3中进行全文搜索。它工作出色,所以我使用同义词词典添加了同义词匹配(例如'bob'=='robert')。这也很好。但我注意到它显然只允许一个词有一个的同义词。也就是说,'al'不能是'albert'和'allen'。PostgreSQL全文搜索中的多个同义词字典匹配

这是正确的吗?有没有办法在PostgreSQL同义词字典中有多个字典匹配?

供参考,这是我的样本字典文件:

bob robert 
bobby robert 
al  alan 
al  albert 
al  allen 

以及创建全文搜索配置的SQL:

CREATE TEXT SEARCH DICTIONARY nickname (TEMPLATE = synonym, SYNONYMS = nickname); 
CREATE TEXT SEARCH CONFIGURATION dxp_name (COPY = simple); 
ALTER TEXT SEARCH CONFIGURATION dxp_name ALTER MAPPING FOR asciiword WITH nickname, simple; 

我在做什么错?谢谢!

回答

4

这是限制同义词的工作方式。你可以做的是把它周围,如:

bob robert 
bobby robert 
alan al 
albert al 
allen al 

它应该给相同的最终结果,这是一个搜索或者其中的一个将匹配同样的事情。

+0

嗯。这有帮助,但我想这意味着没有可能的方式来建立多对多的关系。例如,这是不可能的整顿: VIN文森特 VIN蒙特拉 维尼尔·文森​​特 温尼蒙特拉 谢谢您的好意! – 2009-07-31 15:59:56

2

字典必须定义词语之间的函数关系和语意,否则也不会知道什么时候你lexize要返回的字。在你的例子中,al映射到三个不同的值,从而定义一个多值函数,而lexize函数不知道要返回什么。正如Magnus所示,您可以从专有名称alan, albert, allen转换为昵称al

但请记住,FTS字典的重点不在于执行本身的转换,而是为了对语义相关的单词进行有效的索引。这意味着在任何语言意义上,词位不需要与原始条目相似。虽然你认为多对多的关系是不可能定义的,你真的需要吗?例如,为了解决您的vin例如:

vin  vin 
vincent vin 
vincenzo vin 
vinnie  vin 

,但你也可以这样做:

vin  grob 
vincent grob 
vincenzo grob 
vinnie  grob 

,并得到同样的效果(虽然你为什么会想是另一回事)。

因此,如果您要解析文件名称为Vincent的11个版本,那么to_tsvector函数将在前一种情况下返回vin:11,在后者中返回grob:11

相关问题