使用i18n规范化搜索多个表中的多个列

时间:2014-05-21 11:39:45

标签: oracle plsql

所以我正在开发一个需要搜索功能的项目。用户在文本字段中输入搜索词(可能包含通配符),我们需要在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的一些内置功能。但是,我找不到符合我们特定要求的任何内容。

所以这是一个两部分问题:

  • 在没有任何索引的情况下编写查询的最佳方法是什么?如何实现规范化?
  • 有没有办法使用某些Oracle的功能来简化它? (多列索引......?)

1 个答案:

答案 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;

显然,您需要更改任何返回值并处理异常等,但这比一个巨大的选择查询要容易得多。

相关问题