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

这是对的吗?有没有办法在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;

我做错了什么?谢谢!

有帮助吗?

解决方案

这是同义词工作方式的限制。你可以做的就是把它转过来:

bob    robert
bobby  robert
alan   al
albert al
allen  al

它应该给出相同的最终结果,即搜索其中任何一个都会匹配相同的东西。

其他提示

字典必须定义单词和词汇之间的函数关系,否则当你理解时它不会知道返回哪个单词。在您的示例中, al 映射到三个不同的值,从而定义了一个多值函数,而lexize函数不知道返回什么。正如马格努斯所示,你可以从正确的名称 alan,albert,allen 中提炼为昵称 al

但请记住,FTS字典本身并不是要执行转换,而是要对语义相关的单词进行有效的索引。这意味着词汇在任何语言学意义上都不需要与原始词条相似。虽然你很难定义多对多的关系,但你真的需要吗?例如,要解析 vin 示例:

vin        vin
vincent    vin
vincenzo   vin
vinnie     vin

但你也可以这样做:

vin        grob
vincent    grob
vincenzo   grob
vinnie     grob

并获得相同的效果(虽然你想要的是另一个故事)。

因此,如果你要用11个版本的Vincent解析文档,那么 to_tsvector 函数将在前一种情况下返回 vin:11 并且 grob:11 在后者。

在8.4文档中,它讨论了替代同义词词典,这可能会有所帮助吗?

http://www.postgresql.org/docs/8.4 /interactive/dict-xsyn.html

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top