【发布时间】:2023-03-09 16:20:01
【问题描述】:
我有一个包含常用词值的表来匹配品牌 - 所以当有人输入“可乐”时,我想匹配与其相关的任何可能的品牌名称以及原始术语。
CREATE TABLE word_association ( commonterm TEXT, assocterm TEXT);
INSERT INTO word_association ('coke', 'coca-cola'), ('coke', 'cocacola'), ('coke', 'coca-cola');
我有一个函数可以在管道分隔符字符串中创建这些值的列表以进行模式匹配:
CREATE OR REPLACE FUNCTION usp_get_search_terms(userterm text)
RETURNS text AS
$BODY$DECLARE
returnstr TEXT DEFAULT '';
BEGIN
SET DATESTYLE TO DMY;
returnstr := userterm;
IF EXISTS (SELECT 1 FROM word_association WHERE LOWER(commonterm) = LOWER(userterm)) THEN
SELECT returnstr || '|' || string_agg(assocterm, '|') INTO returnstr
FROM word_association
WHERE commonterm = userterm;
END IF;
RETURN returnstr;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION usp_get_search_terms(text)
OWNER TO customer_role;
如果你调用 SELECT * FROM usp_get_search_terms('coke') 你会得到 p>
coke|coca-cola|cocacola|coca cola
编辑:这个函数运行
我想运行一个插入此文本的查询,例如
SELECT X.article_number, X.online_description
FROM articles X
WHERE LOWER(X.online_description) % usp_get_search_terms ('coke');
这需要大约 56 秒才能针对我的约 500K 记录表运行。
如果我得到原始文本并在查询中使用它,它需要大约 300 毫秒,例如
SELECT X.article_number, X.online_description
FROM articles X
WHERE X.online_description % '(coke|coca-cola|cocacola|coca cola)';
结果集是相同的。
我尝试将函数的输出字符串修改为例如将其括在引号和括号中,但似乎没有什么区别。
有人能告诉我为什么这里有区别吗?是数据类型还是关于在查询中调用函数的东西?谢谢。
【问题讨论】: