SAP HANA搜索规则的创建和使用
本文我们将会使用HANA STUDIO一步一步地创建和使用搜索规则。
创建表
首先我们创建一张表CUSTOMER, 后面我们将会在这张表上进行搜索:
CREATE COLUMN TABLE customer
(
id INTEGER PRIMARY KEY,
firstname SHORTTEXT(100) FUZZY SEARCH INDEX ON,
lastname SHORTTEXT(100) FUZZY SEARCH INDEX ON,
streetname NVARCHAR(100) FUZZY SEARCH INDEX ON,
housenumber NVARCHAR(20) FUZZY SEARCH MODE 'housenumber',
postcode NVARCHAR(20) FUZZY SEARCH INDEX ON FUZZY SEARCH MODE 'postcode',
cityname NVARCHAR(100) FUZZY SEARCH INDEX ON,
countrycode NVARCHAR(2),
phone NVARCHAR(20),
dateofbirth DATE
);
然后,我们在该表内插入如下内容:
INSERT INTO customer VALUES(1, 'Billy', 'Smith', 'Summerset Drv', '1001', '123456789', 'Littleton', 'US', '555-1234', '1950-12-01');
INSERT INTO customer VALUES(2, 'Bally', 'Smiths', 'Summerset Drv', '1001', '123456789', 'Littleton', 'US', '555-1234', '1950-12-01');
最终生成的表如下所示:
创建属性视图
由于目前SAP HANA仅支持在attribute views、column views of type Join和 SQL views使用搜索规则进行搜索,因此我们需要基于该表创建一个attribute view。
首先切换到HANA STUDIO的SAP HANA ADMINISTRATION CONSOLE视图下,在我们使用的HANA实例的content目录下创建package app;并且在app下面再创建package customer。
然后我们我们再在package customer下面创建属性视图,取名为customer。
最终创建好的视图如下所示:
如果在激活视图过程中出现权限不如情况,我们可以执行以下语句来赋予权限:
GRANT SELECT ON CUSTOMER TO _sys_repo WITH GRANT OPTION;
验证视图数据是否正确
创建Search Rule Set
- 首先打开SAP HANA DEVELOPMENT视图
- 在SAP HANA Repositories视图下创建新的Repositories,名称为RuleRepo。其中HANA实例选择我们之前创建属性视图的HANA。
3. 在Project视图下创建一个新的项目SearchRule,并且右键项目选择Team/Share Project把项目共享到之前创建的SearchRule repository下的‘apps.customer’ 包里。
4. 在SearchRule下面创建search.searchruleset搜索规则集合文件。
上图展示了我们刚刚创建的ruleset文件,可以看到里面的View和Rule都是空的。所以我们首先把我们之前创建的view名称填写进去。我们可以选择直接在属性视图中编辑相应的值
也可以将system视图下content里面的视图直接拖拽到View结点上,之后如下所示:
在View结点下面有个Key Column结点,该结点主要用来保证返回记录的唯一性。因为我们可以针对一个视图定义多个Rule,每个Rule可能会返回相同的记录,这些记录合并去重的时候就需要靠我们定义的Key Column列了。这里我们定义了ID为Key Column。
注意我们所填写的列名称必须与定义视图时的一致。
接着我们开始编辑具体的Rule了。假设我们想搜索输入的记录与FIRSTNAME列相似度为0.8并且与LASTNAME相似度为0.8的Customer记录。我们首先需要在Rule下面添加两列,Column名称分别设为FIRSTNAME和LASTNAME。然后我们再将minFuzziness都设为0.8。
如上图所示,我们可以看到还有参数Weight,该参数用来设置该列在计算最终score时所占的比例,默认为1。完成上述所以步骤后,我们就可以进行搜索了。我们使用内置方法SYS.EXECUTE_SEARCH_RULE_SET进行搜索:
CALL SYS.EXECUTE_SEARCH_RULE_SET('
<query>
<ruleset name="app.customer.SearchRule.rule_set:search.searchruleset" />
<column name="FIRSTNAME">billy</column>
<column name="LASTNAME">smiths</column>
</query>
');
Ruleset的名称为我们之前创建的rule set文件名,注意package路径必须加上。然后把所有的列和值加上。