Technology Blogs by SAP
Learn how to extend and personalize SAP applications. Follow the SAP technology blog for insights into SAP BTP, ABAP, SAP Analytics Cloud, SAP HANA, and more.
cancel
Showing results for 
Search instead for 
Did you mean: 
Former Member
0 Kudos

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

       FUZZY SEARCHSAP 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. 拼写错误的得分计算

类似于是用编辑距离或者其他的字符串比较算法,时间比较算法也比较类似:

   (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>,请勿用于任何商业用途。