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

本文涉及的产品
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
OpenSearch LLM智能问答版免费试用套餐,存储1GB首月+计算资源100CU
推荐全链路深度定制开发平台,高级版 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 开源官方技术交流群:

1715594790746.png




相关实践学习
基于OpenSearch搭建高质量商品搜索服务
本场景主要介绍开放搜索(OpenSearch)打造独有的电商行业垂直解决方案,模板内置电商查询分析、排序表达式及行业算法能力,沉浸式体验更高性能和效果的智能搜索服务,助力企业在线业务智能增长。
目录
相关文章
|
7月前
|
SQL 运维 搜索推荐
《揭秘,阿里开源自研搜索引擎Havenask的在线检索服务》
Havenask是阿里巴巴智能引擎事业部自研的开源高性能搜索引擎,深度支持了包括淘宝、天猫、菜鸟、高德、饿了么在内几乎整个阿里的搜索业务。本文针对性介绍了Havenask的在线检索服务,它具备高可用、高时效、低成本的优势,帮助企业和开发者量身定做适合业务发展的智能搜索服务。
83691 138
|
机器学习/深度学习 TensorFlow 算法框架/工具
以图搜图系统工程实践
以图搜图系统工程实践
149 0
|
1月前
|
机器学习/深度学习 数据采集 Python
从零到一:手把手教你完成机器学习项目,从数据预处理到模型部署全攻略
【10月更文挑战第25天】本文通过一个预测房价的案例,详细介绍了从数据预处理到模型部署的完整机器学习项目流程。涵盖数据清洗、特征选择与工程、模型训练与调优、以及使用Flask进行模型部署的步骤,帮助读者掌握机器学习的最佳实践。
130 1
|
7月前
|
存储 自然语言处理 搜索推荐
【技术解析 | 实践】Havenask分析器
本次分享内容为Havenask的分析器,本次课程主要分为3部分内容(分析器介绍、解释分析器主要配置、实战演示),希望本次通过分享帮助大家更好了解和使用Havenask。
52264 3
【技术解析 | 实践】Havenask分析器
|
2月前
|
存储 人工智能 自然语言处理
Github上的十大RAG(信息检索增强生成)框架
信息检索增强生成(RAG)是一种结合了检索系统和生成模型优势的技术,能够显著提升大型语言模型的性能。RAG通过从外部知识库中检索相关信息,增强模型的输入,从而生成更加准确、符合上下文、实时更新的响应。GitHub上涌现出多个开源RAG框架,如Haystack、RAGFlow、txtai等,每个框架都有独特的功能和特性,适用于不同的应用场景。这些框架不仅提高了模型的准确性和可靠性,还增强了过程的透明度和可解释性。
232 2
|
2月前
|
自然语言处理 数据可视化 数据挖掘
闭源与开源嵌入模型比较以及提升语义搜索效果的技术探讨
本文探讨了自然语言处理中嵌入技术的应用,重点在于语义搜索及聚类方法。通过对比不同规模的开源与闭源模型,文章展示了如何利用聚类技术过滤无关结果,提高搜索精度。实验结果显示,较小模型如mxbai在某些任务上表现优异,提示我们在追求高性能的同时不应忽视计算效率与成本效益。最后,文章还介绍了重新排序技术,进一步优化检索结果的相关性。
104 6
闭源与开源嵌入模型比较以及提升语义搜索效果的技术探讨
|
6月前
|
人工智能 Linux Docker
一文详解几种常见本地大模型个人知识库工具部署、微调及对比选型(1)
近年来,大模型在AI领域崭露头角,成为技术创新的重要驱动力。从AlphaGo的胜利到GPT系列的推出,大模型展现出了强大的语言生成、理解和多任务处理能力,预示着智能化转型的新阶段。然而,要将大模型的潜力转化为实际生产力,需要克服理论到实践的鸿沟,实现从实验室到现实世界的落地应用。阿里云去年在云栖大会上发布了一系列基于通义大模型的创新应用,标志着大模型技术开始走向大规模商业化和产业化。这些应用展示了大模型在交通、电力、金融、政务、教育等多个行业的广阔应用前景,并揭示了构建具有行业特色的“行业大模型”这一趋势,大模型知识库概念随之诞生。
140744 30
|
4月前
|
人工智能 自然语言处理 API
动手实践:高效构建企业级AI搜索
本文介绍了基于阿里云 Elasticsearch的AI搜索产品能力、业务价值、场景应用,以及搭建演示等。
11309 5
|
7月前
|
存储 自然语言处理 开发者
【技术解析 | 实践】Havenask文本索引
本次分享内容为Havenask的文本索引,本次课程主要分为两部分内容,首先简要介绍倒排索引的数据结构和文本索引的特性,然后进行对文本索引配置不同分析器的实践,希望通过分享帮助大家更好了解和使用Havenask。
41861 3
|
7月前
|
数据采集 Go Python
文本挖掘基础入门指南
本文介绍了文本挖掘中的数据预处理步骤,包括去除特殊字符和标点符号、移除停用词、小写化以及词干化或词形还原。使用Python的nltk库,通过示例代码展示了如何实现这些步骤,并强调了nltk库在文本处理中的便利性。文章最后提到,预处理后的文本更适合后续的文本分析任务.
153 6