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

本文涉及的产品
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
OpenSearch LLM智能问答版免费试用套餐,存储1GB首月+计算资源100CU
简介: 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 开源官方技术交流群:

1715594790746.png




相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
目录
相关文章
|
SQL 运维 搜索推荐
《揭秘,阿里开源自研搜索引擎Havenask的在线检索服务》
Havenask是阿里巴巴智能引擎事业部自研的开源高性能搜索引擎,深度支持了包括淘宝、天猫、菜鸟、高德、饿了么在内几乎整个阿里的搜索业务。本文针对性介绍了Havenask的在线检索服务,它具备高可用、高时效、低成本的优势,帮助企业和开发者量身定做适合业务发展的智能搜索服务。
84798 138
|
存储 消息中间件 搜索推荐
【前沿技术】 阿里开源搜索引擎Havenask的消息系统
Havenask是阿里巴巴智能引擎事业部自研的开源高性能搜索引擎,深度支持了包括淘宝、天猫、菜鸟、高德、饿了么在内几乎整个阿里的搜索业务。本文针对性介绍了Havenask的消息系统--Swift,它是一个设计用于处理大规模的数据流和实时消息传递的高性能、可靠的消息系统。
61051 3
|
SQL 搜索推荐 测试技术
【Havenask实践篇】完整的性能测试
Havenask是阿里巴巴智能引擎事业部自研的开源高性能搜索引擎,深度支持了包括淘宝、天猫、菜鸟、高德、饿了么在内几乎整个阿里的搜索业务。性能测试的目的在于评估搜索引擎在各种负载和条件下的响应速度、稳定性。通过模拟不同的用户行为和查询模式,我们可以揭示潜在的瓶颈、优化索引策略、调整系统配置,并确保Havenask在用户数量激增或数据量剧增时仍能保持稳定运行。本文举例对Havenask进行召回性能测试的一个简单场景,在搭建好Havenask服务并写入数据后,使用wrk对Havenask进行压测,查看QPS和查询耗时等性能指标。
66265 6
|
人工智能 搜索推荐 异构计算
|
机器学习/深度学习 算法 流计算
深度预测平台RTP介绍
前言 RTP平台是阿里内部一个通用的在线预测平台,不仅支持淘系搜索、推荐、聚划算、淘金币等业务,也支持国际化相关icbu、lazada等搜索推荐业务,同时还支持着淘客,优酷、飞猪等大文娱的搜索推荐场景。
9801 0
|
自然语言处理 搜索推荐 算法
【一文读懂】基于Havenask向量检索+大模型,构建可靠的智能问答服务
Havenask是阿里巴巴智能引擎事业部自研的开源高性能搜索引擎,深度支持了包括淘宝、天猫、菜鸟、高德、饿了么在内的几乎整个阿里的搜索业务。本文针对性介绍了Havenask作为一款高性能的召回搜索引擎,应用在向量检索和LLM智能问答场景的解决方案和核心优势。通过Havenask向量检索+大模型可以构建可靠的垂直领域的智能问答方案,同时快速在业务场景中进行实践及应用。
111762 64
|
自然语言处理 数据处理 调度
《Havenask分布式索引构建服务--Build Service》
Havenask是阿里巴巴智能引擎事业部自研的开源高性能搜索引擎,深度支持了包括淘宝、天猫、菜鸟、高德、饿了么在内几乎整个阿里的搜索业务。本文针对性介绍了Havenask分布式索引构建服务——Build Service,主打稳定、快速、易管理,是在线系统提升竞争力的一大利器。
102362 3
《Havenask分布式索引构建服务--Build Service》
|
消息中间件 Docker 索引
【一文解读】阿里自研开源核心搜索引擎 Havenask简介及发展历史
本次分享内容为Havenask的简介及发展历史,由下面五个部分组成(Havenask整体介绍、名词解释、架构、代码结构、编译与部署),希望可以帮助大家更好了解和使用Havenask。
73008 0
【一文解读】阿里自研开源核心搜索引擎 Havenask简介及发展历史
|
运维 监控 搜索推荐
【电商搜索】现代工业级电商搜索技术-Ha3搜索引擎平台简介
【电商搜索】现代工业级电商搜索技术-Ha3搜索引擎平台简介