PostgreSQL全文搜索中的多个同义词词典匹配
-
05-07-2019 - |
题
我正在尝试在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
不隶属于 StackOverflow