如何解决使用 UTL 函数进行 Oracle 模糊搜索
我需要在数据库层实现模糊搜索,但我遇到了一些小问题。这是我用于演示的 SQL 代码:
SELECT *
FROM (SELECT *
FROM TOOLS
WHERE UTL_MATCH.jaro_winkler_similarity(UPPER('sample tool'),UPPER(NAME)) > 80
ORDER BY UTL_MATCH.EDIT_DISTANCE_SIMILARITY('sample tool',NAME) DESC)
where ROWNUM <= 10;
我正在选择 10 个最符合 jaro winkler 和编辑距离相似性 utl 函数标准的工具。我遇到的困难是,我没有首先获得完全匹配。例如,当我输入rich时,得分最高的候选人是'mich',然后是名称为'rich'的工具,例如'rich 12','富斧',...
- 是否可以首先使用这些 utl 函数获得“完全匹配”,或者是否有任何函数更符合我的要求?我们的模糊搜索应该更多地关注跳过某些字符,而不是用另一个字符替换它们。
- 这些函数是否可以不考虑字长? (例如,当我输入“di”时,我想得到“恐龙”的结果,但是这个词不符合我的分数标准,只是因为它的长度和我没有得到任何结果。
解决方法
先对结果进行排名,获取排名最高的结果。像这样(阅读代码中的注释):
SQL> with
2 tools (name) as
3 -- sample data
4 (select 'mich' from dual union all
5 select 'rich 12' from dual union all
6 select 'rich ax' from dual
7 ),8 temp as
9 -- rank similirities first
10 (select name,11 utl_match.jaro_winkler_similarity('&&par_tool',name) sim,12 --
13 rank() over (order by
14 utl_match.jaro_winkler_similarity('&&par_tool',name) desc) rnk
15 from tools
16 )
17 -- finally,return the "top" similar values
18 select name,sim,rnk
19 from temp
20 where rnk = 1;
Enter value for par_tool: rich
NAME SIM RNK
---------- ---------- ----------
rich 12 91 1
rich ax 91 1
SQL> undefine par_tool
SQL> /
Enter value for par_tool: mick
NAME SIM RNK
---------- ---------- ----------
mich 88 1
SQL>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。