【Havenask实践篇】搭建文本检索服务

本文涉及的产品
推荐全链路深度定制开发平台,高级版 1个月
简介: Havenask是阿里巴巴智能引擎事业部自研的开源高性能搜索引擎,深度支持了包括淘宝、天猫、菜鸟、高德、饿了么在内几乎整个阿里的搜索业务。本文举例数据库检索加速的一个简单场景,使用Havenask对数据库的文本字段建立倒排索引,通过倒排检索列提高检索性能,缩短检索耗时。

一、Havenask介绍

Havenask 是阿里巴巴广泛使用的自研大规模分布式检索系统,是过去十多年阿里在电商领域积累下来的核心竞争力产品,广泛应用在搜推广和大数据检索等典型场景。在2022年云栖大会-云计算加速开源创新论坛上完成开源首发,同时作为阿里云开放搜索OpenSearch底层搜索引擎,OpenSearch 自2014年商业化,目前已有千余家外部客户。

5CA3070E-C162-47C8-8F57-935495AD12D5.png


在性能上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=雾屿蓝^_
^^


注意:

  1. 文档中的'^_'和'^^'均是一个字符,换行符是linux格式'\n',如果是windows环境编辑则换行是'\r\n',此种情况下索引build不成功。请勿在windows环境中编辑任何配置、数据。
  2. 文档的最后一行要有一个'\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。所以,如果用户希望按照某个字段召回文档,则应该对该字段建倒排索引。

示例中希望支持的几种文本召回方式及索引配置说明如下:

  1. 不指定字段召回。任何TEXT类型字段包含查询词即召回,因而配置了default索引,该索引的类型是PACK,意思是将多个字段创建为一个index索引,查询该索引时,任何一个字段命中查询词都会召回。
  2. nid召回。输入id召回相应的doc,因而配置了nid索引,类型为PRIMARYKEY64,PRIMARYKEY64类型的索引除了能够召回外,还有去重功能,即nid相同的doc被认为是同一篇doc。
  3. title召回。title包含查询词则召回,以title字段建立title索引。
  4. brand召回。brand字段与查询词相同则召回,以brand字段建立brand索引。
  5. 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 开源官方技术交流群:




相关实践学习
基于OpenSearch搭建高质量商品搜索服务
本场景主要介绍开放搜索(OpenSearch)打造独有的电商行业垂直解决方案,模板内置电商查询分析、排序表达式及行业算法能力,沉浸式体验更高性能和效果的智能搜索服务,助力企业在线业务智能增长。
目录
相关文章
|
8月前
|
监控 网络协议 Java
|
8月前
|
C++
BaGet服务之基础搭建(上)
BaGet服务之基础搭建
236 0
|
5月前
|
Kubernetes Unix API
k8s搭建 遇到的问题
k8s搭建 遇到的问题
175 0
|
8月前
|
存储 数据库 C++
BaGet服务之基础搭建(下)
BaGet服务之基础搭建(下)
291 0
|
Linux 应用服务中间件 网络安全
手把手教你从零开始云服务器部署
很多互联网产品或者说文章是有时效的,我们在搜索的过程中尽量选择接近的时间内的文章,一般两个月到三个月最佳,再次一点半年,实在不行才再考虑一年等等,由于之前部署云服务器遇到了很多的坑,所以在此写了一篇文章,以帮助大家少走弯路。
924 0
手把手教你从零开始云服务器部署
个人实践
对于ESC的一些感想
91 2
|
弹性计算 开发者
我的云上实践初体验
文章讲述了我的第一次云上实践的经历,通过开发者社区的教程学习如何搭建云上简历。新人难免会有碰壁的时候,但是最终我还是成功地完成了作业并且获得了人生的启发。
我的云上实践初体验
html+css实战124-场景搭建
html+css实战124-场景搭建
330 0
html+css实战124-场景搭建
|
弹性计算 安全 NoSQL
阿里云在家实践感观
阿里云让我学会了很多很多
|
安全 Apache 数据安全/隐私保护
云上实践初体验
在老师的引领下,我们通过阿里云开启了云上学习实践之旅,使用云服务器等产品制作个人简历网站,博客等,在操作过程中我对相关知识有了更多的了解,为专业课程的深入学习奠定了基础。