所以我正在开发一个需要搜索功能的项目。用户在文本字段中输入搜索词(可能包含通配符),我们需要在3个不同的表中搜索预定义的一组列(大约20个)。搜索还应该标准化á==a
,ç==c
等国际字符。
这样做的直接方法是构建一个巨大的查询并让Oracle完成工作。但是我对性能和可维护性有点担心。
SELECT * FROM table1 WHERE
normalize(column1) LIKE normalize(searchstring) OR
normalize(column2) LIKE normalize(searchstring) ...
SELECT * FROM table2 WHERE
normalize(column3) LIKE normalize(searchstring) OR
normalize(column4) LIKE normalize(searchstring) ...
SELECT * FROM table3 WHERE
normalize(column5) LIKE normalize(searchstring) OR
normalize(column6) LIKE normalize(searchstring) ...
我们也考虑使用SOLR,但这需要一些安装和维护工作,我们希望避免这种情况。
第三种选择是使用Oracle的一些内置功能。但是,我找不到符合我们特定要求的任何内容。
所以这是一个两部分问题:
答案 0 :(得分:0)
如果您可以将列名和表名存储在表格中,我会做这样的事情 -
FUNCTION user_search (search_string_in VARCHAR2(4000))
RETURN NUMBER
AS
temp_num NUMBER;
return_num NUMBER;
BEGIN
FOR search_rec in (SELECT table_name, column_name FROM local_table)
LOOP
EXECUTE IMMEDIATE
'SELECT COUNT(1) FROM ' || search_rec.table_name ||
' WHERE '||search_rec.column_name||' = '|| search_string_in
INTO temp_num;
return_num := return_num + temp_num;
END LOOP;
return return_num;
END;
显然,您需要更改任何返回值并处理异常等,但这比一个巨大的选择查询要容易得多。