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的模糊搜索容许你搜索和输入相似的结构化数据。在结构化的数据上使用模糊搜索的一个案例是避免重复的记录。新的记录可以在插入之前及时的检查出数据库里面是否已经存在相似的或者相同的记录。

例如,在插入一个新的用户信息进入系统之前,我们不得不检查数据库内是否已经存在相似的用户。系统可能会进行一系列的搜索,以确定数据库内是否已经存在相似的用户,然后用户再确定是新加一条新的记录还是使用已经存在的记录。两个用户之间是否相似取决于我们定义的规则。例如,我们系统会认为两个用户是相似的如果他们之间满足以下任意一个条件:

  1. 用户的姓名和地址是相似的。
  2. 用户的姓和地址是相同的,但是名不同
  3. 用户的姓名相似但是出生日期相同。

对于这些规则,我们可以在应用程序里面直接写死在SQL语句中;然后每次检测的时候依次执行这三句SQL查询。然而,当我们定义的搜索规则发生变化时,应用程序不得不重新进行更改,测试和部署。这样很小的改动都会带来很大的代价。

针对上面问题,我们可以使用搜索规则把规则作为一个配置文件保存在SAP HANA数据库中,这样我们就可以使用调用存储过程的方式来执行所有的规则匹配。

支持的数据库对象

目前SAP HANA支持在attribute views、column views of type Join和 SQL views使用搜索规则进行搜索。

其它数据库对象,如行表、列表、计算视图和分析视图均不支持。

创建搜索规则集合

    搜索规则集合顾名思义就是包含搜索规则的可配置对象。当存储过程被调用时,搜索规则集合就会被执行,它所包含的搜索规则都会被执行。

    在使用HANA STUDIO创建搜索规则集合之前,我们需要先创建一个项目。然后创建一个包(package)用来放置你的搜索规则集合。

创建步骤:

  1. 在HANA STUDIO中打开项目视图,进入你的包(package)中。
  2. 在package上右键,选择 新建->其它->Search Rule Set。

3. 输入名称单击完成。文件以.searchruleset为扩展名。

4. 使用搜索规则集合编辑器打开和编辑。

5. 定义属性视图、键列、选择参数的分数、停用词以及术语映射。

6. 在你的package上或者搜索规则上右键选择Team->Active。

最后你就可以使用搜索规则集合进行搜索了。


在搜索规则集合上进行搜索

SAP HANA内建了方法SYS.EXECUTE_SEARCH_RULE_SET用来执行搜索规则。该方法只有一个参数,参数为一个xml格式的字符串。我们可以在该xml内指定如下内容:

  1. 将要执行的搜索规则集合
  2. 结果集返回方式,可以以普通结果集方式ResultSet返回或者物化到表中
  3. 结果集的大小限制
  4. 输入的值
  • 将结果集作为ResultSet返回

CALL EXECUTE_SEARCH_RULE_SET('
<query>
<ruleset name="documentation.customersearch:Search.searchruleset" /> --
specifies the SearchRuleSet
<column name="FIRSTNAME">Herbert</column> -- specifies the input value for
column FIRSTNAME
<column name="LASTNAME">Hofmann</column> -- specifies the input value for
column LASTNAME
</query>
');


  • 将结果集物化到表中

CALL EXECUTE_SEARCH_RULE_SET('
<query>
<ruleset name="documentation.customersearch:Search.searchruleset" />
specifies the SearchRuleSet
<resulttableschema name="MY_SCHEMA"/> -- specifies the schema of the result
table
<resulttablename name="MY_RESULT_TABLE"/> -- specifies the name of the result
table
<column name="FIRSTNAME">Herbert</column> -- specifies the input value for
column FIRSTNAME
<column name="LASTNAME">Hofmann</column> -- specifies the input value for
column LASTNAME
</query>');


  • 限制结果集的大小

CALL EXECUTE_SEARCH_RULE_SET('
<query limit="100">
<ruleset name="documentation.customersearch:Search.searchruleset" />
<column name="FIRSTNAME">billy</column>
<column name="LASTNAME">smith</column>
</query>
');