我在 postgres 中使用 dict_xsyn 扩展,它返回多个词位。
例如
CREATE EXTENSION dict_xsyn;
CREATE TEXT SEARCH DICTIONARY names_xsyn (TEMPLATE = 'xsyn_template');
CREATE SEARCH CONFIGURATION english_names ALTER MAPPING FOR asciiword, asciihword, hword_asciipart WITH names_xsyn, simple;
SELECT to_tsquery('english_names', 'ed')
-- returns: 'ed' & 'edward' & 'edwin' & 'edmond'
我更希望 to_tsquery 返回 ORed 词素,以便我可以匹配其他变体。例如
-- returns: 'ed' | 'edward' | 'edwin' | 'edmond'
我试过 ts_rewrite 但它似乎不支持交换逻辑运算符。
--Edit 我这样做是为了匹配部分匹配的集合。例如,我希望 ed 匹配 edward 和 edwin,但我不想让 edward 匹配 edwin。这是我的词素:
ed -> ed, edward, edwin
edward -> ed, 爱德华
埃德温 -> 埃德,埃德温
使用这些词素将 ed 与 edward 匹配将仅适用于 or。
"ed, edward" @@ "ed | edward | edwin" 会起作用
"ed, edward" @@ "ed & edward & edwin" 不会工作
除了将输出操作为文本并转换回来之外,我不知道如何专门使用 来做到这一点
dict_xsyn
,但我认为您无论如何都不想这样做。我认为这将是一场性能噩梦。您可能想要扭转这一局面,以便所有昵称都规范化为一个变体,而不是分解为所有变体。
但我不知道为什么这不是默认设置,所以也许我只是从根本上误解了该扩展的意义。
tsquery 和 tsvector 都将以相同的方式规范化,因此带有“bobbie”的查询将匹配带有“robert”的文档,反之亦然。
但也许我只是不明白你的最终目标。您可以直接使用 来完成您的要求
ts_rewrite
,但这不是通过构建在dict_xsyn
. 这个例子是否supernovae & crab
不只是你想要的?