Elasticsearch 9.0 在语义搜索领域带来了重大升级,通过原生支持 semantic_text
字段类型、改进的查询方式以及与向量搜索的深度整合,为用户提供了更强大、更灵活的语义检索能力。本文将详细介绍 Elasticsearch 9 的语义检索特性、工作原理,并通过实际测试示例展示如何使用这些新功能。
一、Elasticsearch 9 语义检索核心特性
1. semantic_text 字段类型
Elasticsearch 9 引入了 semantic_text
字段类型,这是一种专为语义搜索设计的字段类型,能够自动处理文本的向量化表示。与传统的 text
字段不同,semantic_text
字段在索引时会自动通过配置的推理模型将文本转换为向量表示,而无需用户手动处理向量转换过程。
关键优势:
- 开箱即用:只需配置推理端点,无需手动管理向量转换过程
- 透明处理:自动处理文本扩展和向量化,对用户完全透明
- 混合搜索:可与传统关键词搜索(BM25)结合使用,提升搜索结果相关性
2. 查询方式扩展
Elasticsearch 9 为语义搜索扩展了多种查询方式:
- 原生 semantic 查询:专为语义搜索设计的简洁查询语法
- match 查询支持:现在 match 查询也可用于 semantic_text 字段,提供更熟悉的查询体验
- knn 查询支持:可直接对 semantic_text 字段执行近似最近邻搜索
- sparse_vector 查询:支持稀疏向量搜索技术
3. 性能优化
Elasticsearch 9 基于 Lucene 10 构建,引入了多项性能优化:
- BBQ(Better Binary Quantization):Elastic 自主研发的二进制量化技术,性能比 OpenSearch 快5倍
- 硬件加速:利用 SIMD 指令加速向量计算,搜索性能提升30%以上
- 小端编码优化:向量元素编码从大端改为小端,显著降低暴力搜索延迟
二、语义检索工作原理
Elasticsearch 的语义搜索基于文本扩展(text expansion)技术,其核心流程如下:
- 查询扩展:将用户查询输入通过推理模型扩展为包含相关术语的扩展查询
- 向量转换:将扩展后的查询转换为向量表示(密集或稀疏向量)
- 相似度计算:计算查询向量与文档向量的相似度
- 结果排序:根据相似度得分对结果进行排序
与传统的基于关键词的搜索相比,语义搜索能够理解查询的意图和上下文,而不仅仅是匹配字面词汇。例如,搜索"副业"可以匹配到包含"第二收入"的文档,即使文档中没有出现"副业"这个词。
三、测试示例:构建语义搜索系统
1. 环境准备
首先确保已安装 Elasticsearch 9.0 并配置了适当的推理端点。Elasticsearch 提供了开箱即用的 ELSER(Elastic Learned Sparse Encoder)模型,适合英文语义搜索。对于中文,可以使用阿里云的稀疏向量模型。
2. 创建索引
PUT index-songs-semantic
{
"mappings": {
"properties": {
"song_title": {
"type": "text"
},
"artist": {
"type": "keyword"
},
"lyric": {
"type": "semantic_text",
"inference_id": ".multilingual-e5-small-elasticsearch"
}
}
}
}
对于中文场景,可以使用阿里云模型:
PUT alibaba_sparse
{
"mappings": {
"properties": {
"content": {
"type": "semantic_text",
"inference_id": "alibabacloud_ai_search_sparse"
}
}
}
}
3. 索引文档
POST index-songs-semantic/_doc/1
{
"song_title": "...Baby One More Time",
"artist": "Britney Spears",
"lyric": "When I'm with you, I lose my mind, give me a sign"
}
POST index-songs-semantic/_doc/2
{
"song_title": "Crazy",
"artist": "Britney Spears",
"lyric": "You drive me crazy, I just can't sleep, I'm so excited, I'm in too deep"
}
4. 执行语义搜索
使用 semantic 查询:
GET index-songs-semantic/_search
{
"query": {
"semantic": {
"field": "lyric",
"query": "song lyrics about love"
}
}
}
使用 match 查询(9.0新特性):
GET index-songs-semantic/_search
{
"query": {
"match": {
"lyric": "song lyrics about love"
}
}
}
使用 knn 查询:
GET index-songs-semantic/_search
{
"query": {
"knn": {
"field": "lyric",
"query_vector": [0.1, 0.2, -0.3, ...],
"k": 10,
"num_candidates": 100
}
}
}
5. 混合搜索示例
Elasticsearch 9 引入了 Reciprocal Rank Fusion(RRF)技术,可以轻松组合多种搜索技术:
GET index-songs-semantic/_search
{
"query": {
"hybrid": {
"queries": [
{
"match": {
"lyric": "love song"
}
},
{
"knn": {
"field": "lyric",
"query_vector": [0.1, 0.2, -0.3, ...],
"k": 10,
"num_candidates": 100
}
}
],
"rank": {
"rrf": {}
}
}
}
}
6. 中文语义搜索示例
使用阿里云模型进行中文语义搜索:
POST _inference/alibabacloud_ai_search_sparse
{
"input": "阿里巴巴(中国)有限公司成立于2007年03月26日,法定代表人蒋芳"
}
GET alibaba_sparse/_search
{
"query": {
"semantic": {
"field": "content",
"query": "云资源是什么时候成立的?"
}
}
}
四、语义搜索最佳实践
-
选择合适的模型:
- 英文:ELSER 模型(开箱即用)
- 中文:阿里云稀疏向量模型
-
混合搜索策略:
- 结合语义搜索与传统关键词搜索(BM25)
- 使用 RRF 进行结果融合,无需手动调整权重
-
性能优化:
- 对于高维向量,启用 BBQ 二进制量化
- 利用 SIMD 指令加速向量计算
-
结果重排序:
- 对初步搜索结果使用 rerank 端点进行精细排序
POST _inference/alibabacloud_ai_search_rerank { "query": "阿里巴巴(中国)有限公司是哪一年成立的?", "input": [ "阿里巴巴是全球领先的B2B电子商务网上贸易平台", "阿里巴巴(中国)有限公司成立于2007年03月26日,法定代表人蒋芳" ] }
-
RAG 应用:
- 将语义搜索结果作为大语言模型的上下文
POST _inference/alibabacloud_ai_search_completion { "input": "阿里巴巴公司的法人是谁?基于以下上下文回答:阿里巴巴(中国)有限公司成立于2007年03月26日,法定代表人蒋芳" }
五、语义搜索评估指标
评估语义搜索效果时,应考虑以下指标:
- 相关性:结果与查询意图的匹配程度
- 召回率:系统找到所有相关文档的能力
- 响应时间:查询执行时间
- 资源消耗:CPU、内存使用情况
根据 Elastic 的测试,混合搜索(BM25+语义)在12个相关性基准测试中全部优于单一方法。
六、总结
Elasticsearch 9 的语义检索功能通过 semantic_text
字段类型、多样化的查询方式以及性能优化,为用户提供了强大而灵活的语义搜索能力。无论是英文还是中文场景,都能找到合适的解决方案。特别是混合搜索和 RRF 技术的引入,使得结合多种搜索技术变得简单高效。
对于希望构建下一代搜索应用的开发者,Elasticsearch 9 的语义检索功能无疑提供了坚实的基础,无论是构建简单的语义搜索系统,还是复杂的 RAG 应用,都能从中受益。