Skip to Content
Author's profile photo Former Member

FUZZY SEARCH(一)

SAP HANA支持多种文本搜索技术。不仅支持大家所熟知的like搜索,还支持功能更加强大、性能优越的模糊搜索FUZZY SEARCH

       FUZZY SEARCHSAP HANA所支持的快速并且具有容错特性的模糊搜索功能。即使搜索的记录含有多余的字符或者缺失一些字符,该记录仍然有可能被返回。例如我们现在有一张SEARCH_TEXT的表如下所示:

/wp-content/uploads/2014/04/1_434103.png

     如果我们用FUZZY SEARCH搜索HANAGEEK的话,会发现无论的多了两个字符的HANAGEEKER或者是少了一个字符的HANAGEK都有可能作为结果返回:

/wp-content/uploads/2014/04/2_434104.png

     FUZZY SEARCH只对列式存储结果起作用。FUZZY SEARCH支持以下SQL类型和列存储类型:

/wp-content/uploads/2014/04/3_434112.png


字符串类型

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结果如下所示:

/wp-content/uploads/2014/04/4_434117.png

     我们发下没有查出该记录。可见得分很低。该表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));





结果如下所示:

/wp-content/uploads/2014/04/5_434118.png

时间类型

基于日期上的FUZZY SEARCH支持两种容错,日期类型的拼写错误和用户自定义的最大距离。

  1. 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;




/wp-content/uploads/2014/04/7_434138.png

该搜索返回了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;




/wp-content/uploads/2014/04/8_434139.png

使用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;




/wp-content/uploads/2014/04/9_434140.png

[本文的测试案例所使用的SAP HANA版本为SAP HANA SPS7 Revision 60.00]

想获取更多SAP HANA学习资料或有任何疑问,请关注新浪微博@HANAGeek!我们欢迎你的加入!

转载本文章请注明作者和出处<文章url>,请勿用于任何商业用途。



Assigned Tags

      Be the first to leave a comment
      You must be Logged on to comment or reply to a post.