一、Havenask介绍
Havenask 是阿里巴巴广泛使用的自研大规模分布式检索系统,是过去十多年阿里在电商领域积累下来的核心竞争力产品,广泛应用在搜推广和大数据检索等典型场景。在2022年云栖大会-云计算加速开源创新论坛上完成开源首发,同时作为阿里云开放搜索OpenSearch底层搜索引擎,OpenSearch 自2014年商业化,目前已有千余家外部客户。
在性能上Havenask 支持千亿级别数据实时检索、百万 QPS 查询,百万 TPS 高时效性写入保障,毫秒级查询延迟和数据更新,并具有良好的分布式架构、极致的性能优化,能够实现比现有技术方案更低的成本,普惠更多的开发者和企业。(Github地址:https://github.com/alibaba/havenask)
二、需求说明
下面以手机检索为例说明hape的流程,手机有多个属性,用户希望能够通过多种方式查询,比如召回某个品牌的手机、召回某个价格区间的手机,或者多个条件同时满足等。用户需要提供每个手机各个维度的信息,比如编号(nid)、名字(title)、价格(price)、品牌(brand)、屏幕尺寸(size)、颜色(color)等,并将其组织成一篇文档,在hape的概念里称为document(简称doc),如下表所示:
nid |
title |
price |
brand |
size |
color |
1 |
华为 Mate 9 麒麟960芯片 徕卡双镜头 |
3599 |
华为 |
5.9 |
红 |
2 |
Huawei/华为 P10 Plus全网通手机 |
4388 |
华为 |
5.5 |
蓝 |
3 |
Xiaomi/小米 红米手机4X 32G全网通4G智能手机 |
899 |
小米 |
5.0 |
黑 |
4 |
OPPO R11 全网通前后2000万指纹识别拍照手机r11r9s |
2999 |
OPPO |
5.5 |
红 |
5 |
Meizu/魅族 魅蓝E2 全网通正面指纹快充4G智能手机 |
1299 |
Meizu |
5.5 |
银白 |
6 |
Nokia/诺基亚 105移动大声老人机直板按键学生老年小手机超长待机 |
169 |
Nokia |
1.4 |
蓝 |
7 |
Apple/苹果 iin0 6s 32G 原封国行现货速发 |
3599 |
Apple |
4.7 |
银白 |
8 |
Apple/苹果 iin0 7 Plus 128G 全网通4G手机 |
5998 |
Apple |
5.5 |
亮黑 |
9 |
Apple/苹果 iin0 7 32G 全网通4G智能手机 |
4298 |
Apple |
4.7 |
黑 |
10 |
Samsung/三星 GALAXY S8 SM-G9500 全网通 4G手机 |
5688 |
Samsung |
5.6 |
雾屿蓝 |
三、数据准备
hape内部称用户的一条格式化数据为一篇document(简称doc),索引由用户提供的大量doc构建而成,检索的结果由多篇doc组成。
用户文档需要转换成标准格式才能构建索引,将以上手机信息转换为hape格式的doc并保存为文件in0.data
CMD=add^_ nid=1^_ title=华为 Mate 9 麒麟960芯片 徕卡双镜头^_ price=3599^_ brand=华为^_ size=5.9^_ color=红^_ ^^ CMD=add^_ nid=2^_ title=Huawei/华为 P10 Plus全网通手机^_ price=4388^_ brand=华为^_ size=5.5^_ color=蓝^_ ^^ CMD=add^_ nid=3^_ title=Xiaomi/小米 红米手机4X 32G全网通4G智能手机^_ price=899^_ brand=小米^_ size=5.0^_ color=黑^_ ^^ CMD=add^_ nid=4^_ title=OPPO R11 全网通前后2000万指纹识别拍照手机r11r9s^_ price=2999^_ brand=OPPO^_ size=5.5^_ color=红^_ ^^ CMD=add^_ nid=5^_ title=Meizu/魅族 魅蓝E2 全网通正面指纹快充4G智能手机^_ price=1299^_ brand=Meizu^_ size=5.5^_ color=银白^_ ^^ CMD=add^_ nid=6^_ title=Nokia/诺基亚 105移动大声老人机直板按键学生老年小手机超长待机^_ price=169^_ brand=Nokia^_ size=1.4^_ color=蓝^_ ^^ CMD=add^_ nid=7^_ title=Apple/苹果 iin0 6s 32G 原封国行现货速发^_ price=3599^_ brand=Apple^_ size=4.7^_ color=银白^_ ^^ CMD=add^_ nid=8^_ title=Apple/苹果 iin0 7 Plus 128G 全网通4G手机^_ price=5998^_ brand=Apple^_ size=5.5^_ color=亮黑^_ ^^ CMD=add^_ nid=9^_ title=Apple/苹果 iin0 7 32G 全网通4G智能手机^_ price=4298^_ brand=Apple^_ size=4.7^_ color=黑^_ ^^ CMD=add^_ nid=10^_ title=Samsung/三星 GALAXY S8 SM-G9500 全网通 4G手机^_ price=5688^_ brand=Samsung^_ size=5.6^_ color=雾屿蓝^_ ^^
注意:
- 文档中的'^_'和'^^'均是一个字符,换行符是linux格式'\n',如果是windows环境编辑则换行是'\r\n',此种情况下索引build不成功。请勿在windows环境中编辑任何配置、数据。
- 文档的最后一行要有一个'\n',否则最后一篇文档会丢失。
四、配置文件
下面说明一下schema文件,保存为in0.scheam:
{ "columns": [ { "name" : "nid", "type" : "UINT64" }, { "analyzer": "simple_analyzer", "name" : "title", "type" : "TEXT" }, { "name" : "price", "type" : "DOUBLE" }, { "analyzer": "simple_analyzer", "name" : "brand", "type" : "TEXT" }, { "name" : "size", "type" : "DOUBLE" }, { "analyzer": "simple_analyzer", "name" : "color", "type" : "TEXT" } ], "indexes": [ { "name": "default", "index_type": "PACK", "index_config": { "index_fields": [ { "boost": 1, "field_name": "title" }, { "boost": 1, "field_name": "brand" }, { "boost": 1, "field_name": "color" } ] } }, { "name": "nid", "index_config" : { "index_fields": [ { "field_name": "nid" } ] }, "index_type": "PRIMARY_KEY64" }, { "name": "title", "index_config" : { "index_fields": [ { "field_name": "title" } ] }, "index_type": "TEXT" }, { "name": "brand", "index_config" : { "index_fields": [ { "field_name": "brand" } ] }, "index_type": "TEXT" }, { "name": "color", "index_config" : { "index_fields": [ { "field_name": "color" } ] }, "index_type": "TEXT" }, { "name": "nid", "index_config" : { "index_fields": [ { "field_name": "nid" } ] }, "index_type": "ATTRIBUTE" }, { "name": "price", "index_config" : { "index_fields": [ { "field_name": "price" } ] }, "index_type": "ATTRIBUTE" }, { "name": "size", "index_config" : { "index_fields": [ { "field_name": "size" } ] }, "index_type": "ATTRIBUTE" }, { "name": "summary", "index_type": "SUMMARY", "index_config": { "index_fields": [ { "field_name": "title" }, { "field_name": "brand" }, { "field_name": "color" } ] } } ] }
columns
fields配置指定各个字段的类型,brand、title、color为为文本字段,配置分词器simple_analyzer。其他字段根据自身类型配置。
indexs
indexs配置需要建立倒排索引的字段,倒排索引(index)类似一个map,key是关键字,value是doc列表(docList),因而用户输入一个关键字后,hape能够通过docList快速取到所有命中的doc。所以,如果用户希望按照某个字段召回文档,则应该对该字段建倒排索引。
示例中希望支持的几种文本召回方式及索引配置说明如下:
- 不指定字段召回。任何TEXT类型字段包含查询词即召回,因而配置了default索引,该索引的类型是PACK,意思是将多个字段创建为一个index索引,查询该索引时,任何一个字段命中查询词都会召回。
- nid召回。输入id召回相应的doc,因而配置了nid索引,类型为PRIMARYKEY64,PRIMARYKEY64类型的索引除了能够召回外,还有去重功能,即nid相同的doc被认为是同一篇doc。
- title召回。title包含查询词则召回,以title字段建立title索引。
- brand召回。brand字段与查询词相同则召回,以brand字段建立brand索引。
- color召回。color字段与查询词相同则召回,以color字段建立color索引。
五、索引构建
已hapde单机模式为例,有两种索引构建的方式。第一方式,全量模式
hape create table -t in0 -p 1 -s ./in0_schema.json -f ./in0.data
第二种方式,直写表方式:
/ha3_install/sql_query.py --query "insert into in0 (nid,title,price,brand,size,color)values(6,'Nokia/诺基亚 105移动大声老人机直板按键学生老年小手机超长待机',169,'Nokia',1.4,'蓝')"
注意:构建索引之前操作请参考Havenask官网中的《hapd单机模式》文章。
六、查询
简单示例
query:
/ha3_install/sql_query.py --query "select in0.nid, in0_summary_.title, in0.price, in0_summary_.brand, in0.size, in0_summary_.color from in0 join in0_summary_ on in0.nid = in0_summary_.nid where MATCHINDEX('title', 'Nokia/诺基亚')" /ha3_install/sql_query.py --query "select in0.nid, in0_summary_.title, in0.price, in0_summary_.brand, in0.size, in0_summary_.color from in0 join in0_summary_ on in0.nid = in0_summary_.nid where MATCHINDEX('title', '105移动大声老人机直板按键学生老年小手机超长待机')" /ha3_install/sql_query.py --query "select in0.nid, in0_summary_.title, in0.price, in0_summary_.brand, in0.size, in0_summary_.color from in0 join in0_summary_ on in0.nid = in0_summary_.nid where MATCHINDEX('brand', 'Nokia')"
结果:
nid (uint64) | title (multi_char) | price (double) | brand (multi_char) | size (double) | color (multi_char) | 6 |Nokia/诺基亚 105移动大声老人机直板按键学生老年小手机超长待机 | 169 | Nokia | 1.4 | 蓝 |
七、总结
随着互联网的快速发展,信息爆炸已经成为一个普遍的现象。大量的数据需要被存储、管理和检索。在大量信息中进行文本搜索是一种非常重要的功能,它使用户能够快速而准确地找到所需的信息。Havenask具有实时数据更新秒级完成,能支持海量数据索引构建、检索性能高等优点,使用Havenask进行大数据文本检索、数据库检索加速,是一个非常好的选择。
参考资料:
Havenask官网-Hape单机模式:https://havenask.net/#/doc/v1-1-0/sql/petool/localmode#hape%E5%8D%95%E6%9C%BA%E6%A8%A1%E5%BC%8F
关注我们:
Havenask 开源官网:https://havenask.net/
Havenask-Github 开源项目地址:https://github.com/alibaba/havenask
阿里云 OpenSearch 官网:https://www.aliyun.com/product/opensearch
钉钉扫码加入 Havenask 开源官方技术交流群: