向量数据库是设计为专门用于存储和管理向量数据,在许多人工智能应用中发挥着关键作用,如语义文本搜索和图像搜索。虽然传统的词项匹配和 BM25 算法在文本检索中仍然具有重要意义,但广泛采用的 Elasticsearch 系统最近也增加了向量搜索功能,而开源高性能 SQL 向量数据库 MyScaleDB 最近也引入了全文检索功能。
在本文中,我们展示了 MyScaleDB 在全文搜索性能方面与 Elasticsearch 不相上下,同时实现了更低的延迟和40%的内存利用率。此外,当结合向量搜索时,MyScaleDB 的性能提高了10倍,而成本仅为原来的12%。凭借其高性能、低成本以及基于 ClickHouse 的丰富 SQL 生态系统,MyScaleDB 成为 Elasticsearch 的高效升级和强大的替代方案。
Elasticsearch 介绍
Elasticsearch 是一个分布式 RESTful 风格的搜索和分析引擎,基于 Apache Lucene 构建,可以快速地存储、搜索和分析大量数据,广泛应用于日志分析、应用搜索、安全分析、业务分析等领域。
Elasticsearch 具有以下优势:
- 强大的搜索能力:Elasticsearch 提供了强大的全文搜索功能,包括对精确值、全文检索和向量搜索,以及复杂的查询、过滤和聚合操作,使用户能够快速准确地检索所需信息。
- 丰富的功能:Elasticsearch 提供了丰富的功能和灵活的配置选项,例如文本分析、聚合分析和地理空间搜索等,以满足各种不同的搜索和分析需求。
- 丰富的生态系统:Elasticsearch 生态系统庞大,包括各种插件、工具和第三方集成,可以扩展其功能和应用场景,为用户提供更多选择和灵活性。
- 分布式架构:作为一个分布式系统,Elasticsearch 可以轻松地扩展到多个节点,实现高可用性和横向扩展,使其适用于大规模的数据处理和分析任务。
- 实时数据处理:Elasticsearch 支持实时数据的索引和搜索,可以快速地处理大量的实时数据,并提供即时的查询结果。
然而,Elasticsearch 仍存在一些不足,例如:
- 学习曲线陡峭:Elasticsearch 的学习曲线相对陡峭,特别是对于新手来说,需要花费一些时间来理解其复杂的概念和使用方法。
- 向量检索算法单一:截止目前 8.13 版本,Elasticsearch 在向量检索领域支持的算法有限,仅包括 brute-force kNN 和基于 HNSW 的 Approximate kNN 两种算法,这限制了其在复杂的向量检索场景下的应用。
- 资源占用较高:由于其强大的功能和分布式架构,Elasticsearch 在运行时需要相对较高的资源,包括内存、CPU 和存储空间等。
总的来说,Elasticsearch 在文本检索领域是一个强大的工具,但其在易用性、向量检索和资源利用等方向存在一些不足,在目前复杂的 AI 检索分析场景中存在一定的局限性。
Elasticsearch 首选替代方案:MyScale
MyScale AI 数据库基于开源的 SQL 列式存储数据库 ClickHouse 打造,自研高性能和高数据密度的向量索引算法,并针对 SQL 和向量的联合查询对检索和存储引擎进行了深度的研发和优化,是全球第一个综合性能和性价比大幅超越了专用向量数据库的 SQL 向量数据库产品。
原生兼容 SQL 与向量
MyScale 只需使用 SQL 即可与之交互,使其更易于使用且学习门槛较低,适合广大开发人员快速上手。MyScale 提供了灵活的数据模型和查询语言,支持用户根据具体需求定制数据处理和分析策略,提高了应用的灵活性和执行效率。在实际复杂 AI 应用场景中,SQL 和向量结合可以为开发人员提供了更加直观、高效的开发方式,极大程度增加了开发效率。
相比于 Elasticsearch 基于 JSON 查询 的 DSL (Domain Specific Language), MyScale 只需用户掌握向量检索函数 distance()
的使用方法,便可以凭借已经掌握的 SQL 基础完成向量检索需求。用户还可以在数据库层面完成对数据的进一步复杂分析处理,加快应用系统整体的处理效率。
-- Perform vector search and return top 10 results
SELECT
id, title, text
distance(vector, query_vector) as dist
FROM doc_table
ORDER BY
dist ASC
LIMIT 10;
全文检索可替代 Elasticsearch
MyScale 在最新的版本中推出了强大的全文检索和混合检索等功能,为处理复杂的 AI 需求和未来的数据挑战提供了高效的解决方案。MyScale 嵌入了 Tantivy 全文搜索引擎库,具有快速索引构建、高效搜索、多线程支持、易于使用等特点,允许用户对存储在数据库中的文本数据进行快速且灵活的搜索,并按照 BM25 分数返回最匹配的结果集,更适合用于快速检索大规模文本数据。
下面是对同一个数据集 wiki (560w) 文本搜索能力测试结果。两者在吞吐量相近的情况下,MyScale 的 P95 查询延迟显著降低,并且内存的使用量方面也有明显下降。因此,MyScale 在全文检索的场景下可以实现对 Elasticsearch 的功能替代。
Engine | Function | QPS | p95 Latency | Peak Memory |
MyScale | TextSearch | 4099.16 | 4.563ms | 2.35GB |
ElasticSearch | match | 3907 | 8.863ms | 3.7GB |
wildcard | 4679.16 | 5.583ms | 3.7GB |
向量搜索领先 Elasticsearch
MyScale 利用向量检索技术,支持了多种向量索引算法,包括 MSTG、SCANN、FLAT、HNSW family、IVF family,更加符合各种 AI 场景的检索需求,并且在处理大规模高维数据具有绝对的优势。使用大规模数据集(LAION 5M向量,768维) 测试 MyScale 和 Elasticsearch 在不同的并发查询线程下向量搜索性能表现, 精度和吞吐量的测试结果如下图所示。关于更多的性能测试结果,可以查看 MyScale Vector Database Benchmark。
在该测试中,分别测试了两种常见的过滤比例 0.1 和 0.01。根据测试结果分析可知,在达到相近准确度的情况下,MyScale MSTG 索引可以表现出更加出色的 QPS 性能,并且在索引资源占用、创建时间、查询时延、查询成本等方面相比 Elasticsearch 都存在显著优势。而且,MyScale 支持多种向量索引类型,并且结合强大的检索性能和性价比颇高的使用成本,比 Elasticsearch 更适合向量检索和分析查询场景。
资源利用效率高
MyScale 基于高性能的列式数据库 ClickHouse 构建,它通过高效的索引机制、数据压缩技术、列式存储结构、向量化查询执行和分布式处理能力,是目前实时应用和分析的最快、资源效率最高的开源数据库。MyScale 查询引擎针对现代 CPU 和内存进行了优化,利用向量化查询处理和数据并行处理技术,能够充分发挥多核处理器的性能,加速数据计算。同时继承了 ClickHouse 的列式存储模型,MyScale 能够实现高效的数据压缩和快速的列级操作,能够只读取查询中需要的列,减少数据读取量,同时提高了数据压缩率,降低了存储成本,特别适合分析和处理大量数据。
综上所述,MyScale 通过结合向量检索技术、全文检索引擎 Tantivy 和 ClickHouse 的高性能特性,以及其分布式架构和优化的查询引擎,实现了对大规模数据集的高效处理和分析,特别适合用于复杂的数据分析、混合搜索、全文检索、向量检索等场景。
如何实现 MyScale 对 Elasticsearch 的替换
将 Elasticsearch 替换为 MyScale 需要进行数据模型设计、数据迁移、 查询逻辑转换等工作。用户可以根据 Quickstart 指南快速启动 MyScale 集群、导入数据和执行SQL查询等操作。
设计数据模型
数据模型设计阶段是确定如何将 Elasticsearch 中的文档模型映射到 MyScale 中的表结构的过程,主要涉及到在 MyScale 中定义迁移数据表的列、数据类型、索引类型等。
- 数据类型转换:MyScale 兼容 ClickHouse 所有的数据类型,因此 Elasticsearch 的 Field data types 都能在 MyScale 中找到与之对应的数据类型。但是值得注意的是,Elasticsearch 中用于向量搜索的类型
dense_vector
应该根据element_type
的float
和byte
映射为 MyScale 中对应的的Array(Float32)
或FixedString
,并在相应的列上添加对应的长度约束。 - 向量索引定义:MyScale 支持更多的向量索引类型,我们强烈推荐用户使用 MSTG 索引来获得最优的性能,您可以参考向量查询的教程来创建和操作 vector indexes 来加速向量搜索。
下面是一个 Elasticsearch 中 image-index
转换为 MyScale 中 es_data_migration 数据表的例子:
{
"image-index": {
"mappings": {
"properties": {
"file-type": {
"type": "keyword"
},
"image-vector": {
"type": "dense_vector",
"dims": 3,
"index": true,
"similarity": "l2_norm"
},
"title": {
"type": "text"
},
"title-vector": {
"type": "dense_vector",
"dims": 5,
"index": true,
"similarity": "l2_norm"
}
}
}
}
}
CREATE TABLE default.es_data_migration
(
`id` UInt32,
`file_type` String,
`image_vector` Array(Float32),
`title` String,
`title_vector` Array(Float32),
VECTOR INDEX vec_ind_image image_vector TYPE MSTG('metric_type=L2'),
VECTOR INDEX vec_ind_title title_vector TYPE MSTG('metric_type=L2'),
CONSTRAINT check_length_image CHECK length(image_vector) = 3,
CONSTRAINT check_length_title CHECK length(title_vector) = 5
)
ENGINE = MergeTree
PRIMARY KEY id;
数据迁移
数据迁移阶段主要涉及到 Elasticsearch 数据导出和 MyScale 数据导入过程。
- Elasticsearch 数据导出: 用户可以使用 Elasticsearch API、Logstash、 Kibana 的 CSV Reports 功能、Python es2csv 工具等多种方式将 Elasticsearch 中的数据导出为 JSON 或 CSV 等常用格式文件。
- 导入数据到 MyScale:MyScale 支持多种数据导入方式,包括 Python client ,HTTPS interface 等。下面以 Python client 为例将 Elasticsearch 导出的数据文件迁移到 MyScale 中。
import clickhouse_connect
import pandas as pd
# initialize client
# For SaaS users, navigate to the MyScale Clusters page, click the Action drop-down link, and select Connection details.
client = clickhouse_connect.get_client(
host='127.0.0.1',
port=8123,
username='default',
password=''
)
def convert_vector(vector_str):
return list(map(float, vector_str.split(', ')))
# read migration data file
data = pd.read_csv('test.csv', usecols=['_id', 'image-vector', 'title', 'title-vector'], converters={'image-vector': convert_vector, 'title-vector': convert_vector})
# insert data into the migration table
client.insert('default.es_data_migration', data.values.tolist(), ['id', 'image_vector', 'title', 'title_vector'])
查询逻辑转换
将原应用处理中查询检索部分的逻辑由 Elasticsearch search 改为 MyScale search,并更新逻辑相应数据处理逻辑。
{
"knn": {
"field": "image-vector",
"query_vector": [-5, 9, -12],
"k": 10,
"num_candidates": 100
},
"fields": [ "title", "file-type" ]
}
SELECT
id,
title,
file_type,
distance(image_vector, [-5.0, 9.0, -12.0]) AS l2_dist
FROM default.es_data_migration
ORDER BY l2_dist ASC
LIMIT 10;
写在结尾
通过 MyScale 与 Elasticsearch 的功能和性能对比分析可知,MyScale 不仅是一款 ElasticSearch 的高效升级替代品,更是一个适应未来数据需求和技术发展趋势的先进数据解决方案,尤其是在向量搜索和资源成本等方向存在明显优势。此外,基于 ClickHouse 强大的分布式存储和处理的架构,MyScale 在扩展性方面具有很高的灵活性,可以轻松地扩展到大型集群,满足不断增长的数据需求。
MyScale 一方面兼容 ClickHouse 的生态组件,拥有丰富的文档资源和广泛的社区支持;另一方面,与全球流行的开发者工具如 Python Client, Node.js 和 LLM 框架进行了集成,包括 OpenAI, LangChain, LangChain JS/TS 和 LlamaIndex,为用户提供了更好的使用体验和支持。最后,MyScale 还支持丰富的数据类型和查询语法,使其能够适应不同的数据需求和查询场景。
未来,借助完善的 SQL 数据管理能力,强大高效的数据存储和查询能力,MyScale 会在数据存储和处理领域发挥越来越重要的作用,为用户提供更加丰富和高效的服务。