使用 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','富斧',...

  1. 是否可以首先使用这些 utl 函数获得“完全匹配”,或者是否有任何函数更符合我的要求?我们的模糊搜索应该更多地关注跳过某些字符,而不是用另一个字符替换它们。
  2. 这些函数是否可以不考虑字长? (例如,当我输入“di”时,我想得到“恐龙”的结果,但是这个词不符合我的分数标准,只是因为它的长度和我没有得到任何结果。
travelwink 回答:使用 UTL 函数进行 Oracle 模糊搜索

先对结果进行排名,获取排名最高的结果。像这样(阅读代码中的注释):

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>
本文链接:https://www.f2er.com/10817.html

大家都在问