【问题标题】:Multiple synonym dictionary matches in full-text searching全文搜索中的多个同义词字典匹配
【发布时间】:2009-07-30 19:49:00
【问题描述】:

我正在尝试在 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;

【问题讨论】:

    标签: sql postgresql full-text-search


    【解决方案1】:

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

    bob    robert
    bobby  robert
    alan   al
    albert al
    allen  al
    

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

    【讨论】:

    • 嗯。这很有帮助,尽管我想这意味着不可能建立多对多关系。例如,这是不可能纠正的:vin vincent vin vincenzo vinnie vincent vinnie vincenzo 谢谢!
    【解决方案2】:

    字典必须定义单词和词位之间的函数关系,否则当你词法化时它不知道要返回哪个单词。在您的示例中,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
    

    并获得相同的效果(尽管您想要这样做的原因是另一回​​事)。

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

    【讨论】:

      【解决方案3】:

      在 8.4 文档中,它谈到了替换同义词词典,也许这会有所帮助?

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

      【讨论】:

        猜你喜欢
        • 2015-07-25
        • 2020-01-01
        • 2018-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多