【发布时间】:2019-11-27 07:43:38
【问题描述】:
我有一个名为institutions 的表,其中包含机构的名称。每次出现新名称时,函数都需要找到与现有机构相关的任何匹配项。例如,我们有以下机构表:
NAME
FORMULA VIEW UNIVERSITY RESEARCH
FOURMULA VULCAN COLLEGE INSTITUTE
MOUNT VU FOOD GROWERS
FORMULA VU CAFE SHOP
以下同义词表:
WORD SYN_LIST
EDUCATION SCHOOL, UNIVERSITY, COLLEGE, TRAINING
RESTAURANT BAR, BISTRO, BREAKFAST, BUFFET, CABARET, CAFE, FOOD, GALLEY, GASTROPUB, GRILL
STORE CONVENIENCE, FOOD, GROCER, GROCERY, MARKET, MART, SHOP, STORE, VARIETY
REFRIGERATION APPLIANCE, COLDSTORAGE, FOODLOCKER, FREEZE, FRIDGE, ICE, REFRIGERATION
最后是替换表这个词:
WORD SUBS_LIST
MOUNTAIN MOUNTAIN, MOUNT, MT, MTN
VIEW VIEW, VU
FORMULA FORMULA, 4MULA, FOURMULA
最重要的是,来自机构的名称被归类为name|field。要完成将单词分类为name|field,只需使用两个输入参数手动传递给函数。例如,名称FORMULA VIEW UNIVERSITY RESEARCH 分解为FORMULA VIEW 作为名称,UNIVERSITY RESEARCH 作为字段。在机构中搜索名称时,名称部分(在本例中为 FORMULA VIEW 必须找到完全匹配)和至少一个字段词(在本例中为 UNIVERSITY 或/和 RESEARCH)。
之前的匹配规则如下所示:
select
from institutions
where name like '%FORMULA VIEW%' || ' %UNIVERSITY% '
UNION
select
from institutions
where name like '%FORMULA VIEW%' || ' %RESEARCH% '
然后,如果出现新名称,例如 FORMULA VIEW COLLEGE,就足以找到与 FORMULA VIEW UNIVERSITY RESEARCH 匹配的名称。
最后,同义词和单词替换适用于接收到的名称,并且每个单词可以在同义词表中的多个类别中(因为单词 food 包含在 store 和 restaurant 中),然后在查找匹配项的功能。考虑到前面的三个表,考虑一个新名称,例如MOUNTAIN VIEW STORE OFFICE,然后该函数在机构表中找到MOUNT VU FOOD GROWERSalready 作为匹配项。发生这种匹配是因为 food 有两个同义词,然后生成了两个词:MOUNTAIN VIEW FOOD GROWERS 和 MOUNTAIN VIEW STORE GROWERS。
select
from institutions
where name like '%MOUNTAIN VIEW%' || ' %STORE% '
UNION
select
from institutions
where name like '%MOUNTAIN VIEW%' || ' %OFFICE% '
即使只有 STORE 是匹配项,而不是 OFFICE,这足以识别为匹配项并指示 STORE 中的冲突。
我一直在研究这个问题并创建了this DBFiddle 以包含前面解释的大部分内容并尝试解决问题,但我无法弄清楚如何添加搜索逻辑对于 name 类别中的完全匹配并传递一个 field 类别,直到传递其余的 field 类别,如示例中所示:
select
from institutions
where name like '%MOUNTAIN VIEW%' || ' %STORE% '
UNION
select
from institutions
where name like '%MOUNTAIN VIEW%' || ' %OFFICE% '
如果您找到更适合解决此问题的其他解决方案,请告诉我。我希望我已经足够清楚了,请让我知道任何问题。
【问题讨论】:
标签: sql oracle query-optimization sql-like