FUZZY SEARCH(一)
SAP HANA支持多种文本搜索技术。不仅支持大家所熟知的like搜索,还支持功能更加强大、性能优越的模糊搜索FUZZY SEARCH。
FUZZY SEARCH是SAP HANA所支持的快速并且具有容错特性的模糊搜索功能。即使搜索的记录含有多余的字符或者缺失一些字符,该记录仍然有可能被返回。例如我们现在有一张SEARCH_TEXT的表如下所示:
如果我们用FUZZY SEARCH搜索HANAGEEK的话,会发现无论的多了两个字符的HANAGEEKER或者是少了一个字符的HANAGEK都有可能作为结果返回:
FUZZY SEARCH只对列式存储结果起作用。FUZZY SEARCH支持以下SQL类型和列存储类型:
字符串类型
FUZZYSEARCH搜索字符串的时候会匹配整个字符串。例如我们搜索字符SAP的时候,记录‘SAP Deutschland AG & Co. KG’就会得到很低的分数。
我们向SEARCH_TEXT里面插入该记录值:
TRUNCATE TABLE SEARCH_TEXT;
INSERT INTO SEARCH_TEXT VALUES('SAP Deutschland AG & Co. KG')
然后执行FUZZY SEARCH结果如下所示:
我们发下没有查出该记录。可见得分很低。该表content列一直使用的是NVARCHAR类型。如果我们将类型变成TEXT类型结果会怎么改变呢。
文本类型
当采用文本类型进行FUZZY SEARCH时,文本会被分割成一个个的词;然后FUZZY SEARCH会在这些词之间一个个的进行比较。我们采用同样的例子,首先建立同样字段的表,当字段类型采用TEXT,然后插入同样的记录进行搜索:
CREATE COLUMN TABLE SEARCH_TEXT_TMP(
CONTENT TEXT
);
INSERT INTO SEARCH_TEXT_TMP VALUES('SAP Deutschland AG & Co. KG');
SELECT SCORE(),*
FROM SEARCH_TEXT_TMP
WHERE CONTAINS(CONTENT, 'SAP', FUZZY(0.2));
结果如下所示:
时间类型
基于日期上的FUZZY SEARCH支持两种容错,日期类型的拼写错误和用户自定义的最大距离。
- 1. 拼写错误的得分计算
类似于是用编辑距离或者其他的字符串比较算法,时间比较算法也比较类似:
(1) 一个任意位置数据错误(例如2011-08-15代替2011-08-25)。这类错误会得到0.9分。
(2) 日期中一个部分(年、月、日)的两个数字颠倒位置(例如2001-01-12, 2010-10-12,或者2010-01- 21代替2010-01-12)。这类错误会得到0.85分。
(3) 月和日期颠倒(例如2010-10-12代替2010-12-10)。这类错误会得到0.8分。
日期比较中,上述错误中仅容许有且只有一个。两个及以上的错误被认为是非相似的,得分为0.0。
我们创建一张日期类型的表:
CREATE TABLE SEARCH_DATE(
CONTENT DATE
);
然后插入如下几个数据,2000-01-11、2000-01-10,2000-01-01、2000-10-01,2000-10-02。
SELECT SCORE() AS score,TO_VARCHAR (CONTENT, 'YYYY-MM-DD')
FROM SEARCH_DATE
WHERE CONTAINS(CONTENT, '2000-01-10', FUZZY(0.8))
ORDER BY score DESC;
日期距离得分的计算
容许日期之间的最大距离可以用搜索选项‘maxDateDistance’来设置。默认值为0,该选项被禁用。如果我们设置为5那么,搜索日期的前后五天都是有效的时间。
(1) 相同的日期得分1.0。
(2) 日期距离等于‘maxDateDistance’的日期,得分为用户输入的fuzzySimilarity参数值,如下面的0.95。
(3) 位于‘maxDateDistance’之内的日期并且出去相同的,得分为1-((1-fuzzySimilarity) /
maxDateDistance。
(4) 除此之外,其他的得分均为0.
例如我们向SEARCH_DATE 表中插入2000-01-05 到 2000-01-15的日期。然后执行如下搜索:
SELECT SCORE() AS score,TO_VARCHAR (CONTENT, 'YYYY-MM-DD')
FROM SEARCH_DATE
WHERE CONTAINS(CONTENT, '2000-01-10', FUZZY(0.95, 'maxDateDistance=5'))
ORDER BY score DESC;
该搜索返回了2000-01-05到2000-01-15的所有日期。
如果一个日期同时满足拼写错误和最大距离,score()会返回得分最高的那个分数。基于上面同样的数据,我们作下面的搜索:
SELECT SCORE() AS score,TO_VARCHAR (CONTENT, 'YYYY-MM-DD')
FROM SEARCH_DATE
WHERE CONTAINS(CONTENT, '2000-01-10', FUZZY(0.8, 'maxDateDistance=5'))
ORDER BY score DESC;
使用FUZZY(0.0)搜索
我们不能试图使用FUZZY(0)来返回所有结果。FUZZY(0)将会返回所有FUZZY SCORE大于0的记录。
TRUNCATE TABLE SEARCH_TEXT;
INSERT INTO SEARCH_TEXT VALUES('HANAGEEK');
INSERT INTO SEARCH_TEXT VALUES('SAP');
SELECT SCORE() AS SCORE,*
FROM SEARCH_TEXT
WHERE CONTAINS(CONTENT,'HANAGEEK',FUZZY(0.0))
ORDER BY SCORE DESC;
[本文的测试案例所使用的SAP HANA版本为SAP HANA SPS7 Revision 60.00。]
想获取更多SAP HANA学习资料或有任何疑问,请关注新浪微博@HANAGeek!我们欢迎你的加入!
转载本文章请注明作者和出处<文章url>,请勿用于任何商业用途。