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

本文涉及的产品
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
OpenSearch LLM智能问答版免费试用套餐,存储1GB首月+计算资源100CU
智能开放搜索 OpenSearch向量检索版,4核32GB 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)打造独有的电商行业垂直解决方案,模板内置电商查询分析、排序表达式及行业算法能力,沉浸式体验更高性能和效果的智能搜索服务,助力企业在线业务智能增长。
目录
相关文章
|
6月前
|
SQL 运维 搜索推荐
《揭秘,阿里开源自研搜索引擎Havenask的在线检索服务》
Havenask是阿里巴巴智能引擎事业部自研的开源高性能搜索引擎,深度支持了包括淘宝、天猫、菜鸟、高德、饿了么在内几乎整个阿里的搜索业务。本文针对性介绍了Havenask的在线检索服务,它具备高可用、高时效、低成本的优势,帮助企业和开发者量身定做适合业务发展的智能搜索服务。
83600 138
|
1月前
|
存储 运维 监控
超越传统模型:从零开始构建高效的日志分析平台——基于Elasticsearch的实战指南
【10月更文挑战第8天】随着互联网应用和微服务架构的普及,系统产生的日志数据量日益增长。有效地收集、存储、检索和分析这些日志对于监控系统健康状态、快速定位问题以及优化性能至关重要。Elasticsearch 作为一种分布式的搜索和分析引擎,以其强大的全文检索能力和实时数据分析能力成为日志处理的理想选择。
103 6
|
4天前
|
人工智能 自然语言处理 数据挖掘
RAG 系统高效检索提升秘籍:如何精准选择 BGE 智源、GTE 阿里与 Jina 等的嵌入与精排模型的完美搭配
RAG 系统高效检索提升秘籍:如何精准选择 BGE 智源、GTE 阿里与 Jina 等的嵌入与精排模型的完美搭配
RAG 系统高效检索提升秘籍:如何精准选择 BGE 智源、GTE 阿里与 Jina 等的嵌入与精排模型的完美搭配
|
7天前
|
数据采集 人工智能 自然语言处理
万字干货|复杂表格多Agent方案:从LLM洞察、系统性 思考到实践经验总结
笔者结合实践经验以近期在负责的复杂表格智能问答为切入点,结合大模型的哲学三问(“是谁、从哪里来、到哪里去”),穿插阐述自己对大模型的一些理解与判断,以及面向公共云LLM的建设模式思考,并分享软件设计+模型算法结合的一些研发实践经验。
|
17天前
|
机器学习/深度学习 数据采集 Python
从零到一:手把手教你完成机器学习项目,从数据预处理到模型部署全攻略
【10月更文挑战第25天】本文通过一个预测房价的案例,详细介绍了从数据预处理到模型部署的完整机器学习项目流程。涵盖数据清洗、特征选择与工程、模型训练与调优、以及使用Flask进行模型部署的步骤,帮助读者掌握机器学习的最佳实践。
54 1
|
6月前
|
存储 自然语言处理 搜索推荐
【技术解析 | 实践】Havenask分析器
本次分享内容为Havenask的分析器,本次课程主要分为3部分内容(分析器介绍、解释分析器主要配置、实战演示),希望本次通过分享帮助大家更好了解和使用Havenask。
52253 3
【技术解析 | 实践】Havenask分析器
|
28天前
|
存储 数据可视化 大数据
从具体实践出发,手把手教你 TDengine 最佳建模方式
作为一款高效便捷的大数据平台,TDengine 的使用体验极为极为流畅,用户可以轻松实现数据的实时采集、存储与分析,快速获取所需的信息和洞察。但在追求最佳实践的过程中,我们仍需关注一些关键问题。例如,多个设备是否应该向同一个子表写入数据?在数据列过滤查询与基于标签的过滤查询之间,效率的差异有多大?此外,如何实现数据的高效压缩也是值得探讨的话题。本篇文章将通过具体的案例分析,详细讲解这些问题,以期帮助大家更深入地理解并高效使用 TDengine。
31 0
|
5月前
|
人工智能 Linux Docker
一文详解几种常见本地大模型个人知识库工具部署、微调及对比选型(1)
近年来,大模型在AI领域崭露头角,成为技术创新的重要驱动力。从AlphaGo的胜利到GPT系列的推出,大模型展现出了强大的语言生成、理解和多任务处理能力,预示着智能化转型的新阶段。然而,要将大模型的潜力转化为实际生产力,需要克服理论到实践的鸿沟,实现从实验室到现实世界的落地应用。阿里云去年在云栖大会上发布了一系列基于通义大模型的创新应用,标志着大模型技术开始走向大规模商业化和产业化。这些应用展示了大模型在交通、电力、金融、政务、教育等多个行业的广阔应用前景,并揭示了构建具有行业特色的“行业大模型”这一趋势,大模型知识库概念随之诞生。
139122 30
|
3月前
|
人工智能 自然语言处理 API
动手实践:高效构建企业级AI搜索
本文介绍了基于阿里云 Elasticsearch的AI搜索产品能力、业务价值、场景应用,以及搭建演示等。
11268 5
|
4月前
|
存储 人工智能 自然语言处理
社区供稿 | 源大模型的快速部署与高效推理——GGUF格式模型介绍与使用教程
在人工智能领域,大型语言模型的发展日新月异,它们在自然语言处理、机器翻译、智能助手等多个领域展现出了前所未有的能力。
社区供稿 | 源大模型的快速部署与高效推理——GGUF格式模型介绍与使用教程