全部产品

HBase SQL(Phoenix) SearchIndex使用说明

更新时间:2019-06-24 09:48:16

一、简介

云 HBase SQL服务(Phoenix)实现全文检索功能, 一站式解决全文、模糊、不固定组合条件等查询问题。

二、语法

1. DDL 部分

1). 创建全文索引

  1. create search index [if not exists] on [schema.]table_name
  2. [(column_def,......)]
  3. [ASYNC]
  4. [index_options]
  5. column_def:
  6. column_name [{(column_option,.....)}],
  7. column_option:
  8. docvalues=[true|false] // defalut value: false
  9. | analyer=standard // defalut value: none
  10. | stored=[true|false]; // defalut value: false
  11. | indexed=[true|false] // defalut value: true
  12. index_options:
  13. SHARD_NUM = [integer number] // defalut value: rs size
  14. | REPLICATION_NUM = [integer number] // default value: 1
  15. | COMMIT_INTERVAL_TIME = [integer number] // default value: 15000 (单位ms)
说明

其中 column_option 和 index_options 可省略,省略后使用默认的值。

  • SHARD_NUM 表示全文索引表的 shard 数量。
  • REPLICATION_NUM 表示全文索引表的 replication 数量。
  • COMMIT_INTERVAL_TIME 表示写全文索引表时每次自动commit的间隔时间。值越小索引可见间隔越短,但写入吞吐会下降。

分词器:对于字符类型的字段可以指定分词器,当前只支持英文分词器 standard,使用中文分词器请咨询云 HBase 答疑。

索引数据同步:

  1. 创建同步索引时,会自动发起索引 rebuild 操作,至到索引数据全部生成后,建表操作完成。
  2. 创建异步索引时(使用ASYNC 关键字),不会自动发起索引的 rebuild,需要再次执行 alter rebuild 完成索引同步。
示例
  1. CREATE SEARCH INDEX ON TEST (NAME,ADDR);
  2. CREATE SEARCH INDEX ON TEST (NAME,ADDR)SHARD_NUM=2, REPLICATION_NUM=3;
  3. CREATE SEARCH INDEX ON TEST (NAME,ADDR{{DOC_VALUES=true}) COMMIT_INTERVAL_TIME=10000 ;
  4. CREATE SEARCH INDEX ON TEST (NAME {DOC_VALUES=true, ANALYZER= standard}, ADDR);
  5. CREATE SEARCH INDEX ON TEST (NAME,ADDR)ASYNC SHARD_NUM = 1, REPLICATION_NUM = 1;

2). 删除全文索引

  1. drop search index [if exists] on [schema.]table_name;
示例
  1. drop search index on test;
  2. drop search index on s.test;
  3. drop search index if exists on test;

3). Alter 全文索引

  1. alter search index [if exists] on [schema.]table_name actions;
  2. actions:
  3. commit // commit 索引数据,立即可见
  4. | set option // 设置索引属性
  5. | rebuild // rebuild search index
  6. option:
  7. COMMIT_INTERVAL_TIME = [integer number] // default value: 15000
说明
  • set option 当前只支持设置 COMMIT_INTERVAL_TIME。
  • rebuld 表示根据索引信息全量的同步 Phoenix 表数据到全文索引中。
示例
  1. alter search index on test commit;
  2. alter search index on test set COMMIT_INTERVAL_TIME=10000;
  3. alter search index if exists on test rebuild;

2. DML 部分

1). 写

通过 Phoenix 提供的 Upsert 语法写入,索引数据会异步同步到全文索引中。主要支持 UPSERT VALUESUPSERT SELECT 两类语法,我们在此不做赘述,具体可参考 这里

2). 查询

当前版本并未完全兼容 Native SQL, 通过引入 search_query 列作来完成全文检索,基本 select 语法与 Phoenix select 大体相似。查询语法上的限制,具体参见第五小结使用限制。

  1. select selectExpression from [schema.]table_name
  2. where expression;
  3. expression: // 表达式中不支持 or 条件
  4. searchQueryCondition[andCondition]
  5. searchQueryCondition:
  6. search_query='Lucene Query Syntax'
  7. andCondition:
  8. booleanCondition [(and booleanCondition)...]
  9. booleanCondition:
  10. [not] condition
说明

数据表和全文索引字段的关系:

  1. 当数据表字段没有指定column family,全文索引中的对应的字段名为原字段的大写表示
  2. 当数据表字段指定了column family,全文索引中对应的字段名为原字段大写column family + 下划线 + 大写列名,例如:”a”.”c1” => A_C1。

search_query 支持所有的 lucene query 语法,相关语法可以参考这里

示例
  1. select * from test where SEARCH_QUERY='C2:c2_2' and c3 = 1;
  2. select * from test where search_query='C1:hello';
  3. select * from test where search_query='C1:"say hello"';
  4. select * from test
  5. where search_query='PHONE:138000 OR ADDR:*ang*' and id = 6 order by id limit 10 offset 1;

2). 删除

通过 Phoenix 提供的 Delete 语法删除数据,索引数据会异步同步到全文索引中,具体可参考 这里

三、Quick Start

1. 开通 Search Index

由于此功能正处于公测阶段,开通流程请咨询云 HBase 答疑。

2. sqlline

开启交互式命令行,bin/sqlline-thin.py

  1. -- 创建数据表
  2. create table test (id varchar not null primary key,C1 varchar,C2 varchar, C3 integer)SALT_BUCKETS=2;
  3. -- 写入数据
  4. upsert into test values('a','word','Learn the definition of a phrase as a grammatical unit', 38000);
  5. upsert into test values('b', 'say hello', 'I confused what truth is', 3000);
  6. -- 创建同步索引
  7. create search index on test (C1, C2 {ANALYZER=standard});
  8. -- 索引查询 & 数据表条件过滤
  9. select id from test where search_query='C2:truth OR C2:phrase' and C3 = 3000;

3. JDBC API DEMO

  1. Connection conn = DriverManager.getConnection(url);
  2. String tableName = "test";
  3. Statement stmt = conn.createStatement();
  4. stmt.execute("create table " + tableName
  5. + "(id varchar not null primary key,"
  6. + "C1 varchar,"
  7. + "C2 varchar, "
  8. + "C3 integer )");
  9. for (int i = 0; i < 15; i++) {
  10. stmt.executeUpdate("upsert into " + tableName
  11. + String.format(" values('id_%d', 'c1_%d', 'c2_%d', %d)", i, i % 3, i % 3, i % 2));
  12. }
  13. conn.commit();
  14. //create search index async
  15. stmt.execute("CREATE SEARCH INDEX ON " + tableName + " (C1, C2) ASYNC SHARD_NUM=1,REPLICATION_NUM=1");
  16. stmt.execute("ALTER SEARCH INDEX ON " + tableName + " REBUILD");
  17. stmt.execute("ALTER SEARCH INDEX ON " + tableName + " COMMIT");
  18. ResultSet rs = stmt.executeQuery(
  19. "select * from " + tableName + " where SEARCH_QUERY='C2:c2_2' and c3 = 1");
  20. while (rs.next()) {
  21. // fetch data
  22. }
  23. rs.close();
  24. stmt.execute("DROP SEARCH INDEX ON " + tableName);
  25. stmt.execute("DROP TABLE " + tableName);
  26. stmt.close();
  27. conn.close();

四、使用限制

  1. 暂时不支持中文分词器
  2. 不支持自定义的configsets,统一使用默认configsets
  3. 不支持查询分组和where子句中使用OR逻辑操作符
  4. search query 最大返回数据不能超过5000(防止大范围扫描影响solr 和回查数据表效率)

五、相关文章