当 Elasticsearch 在处理复杂聚合或高基数词条查询等场景时,可能会遇到性能瓶颈。为了解决这些问题,您可以使用 FalconSeek 云原生内核。该内核基于阿里巴巴自研的 Havenask 搜索引擎构建,通过 C++ 实现的列式内存结构与全异步执行框架,在完全兼容 Elasticsearch 生态的同时,显著提升查询性能,帮助您在不改变使用习惯的前提下,获得更高的性价比和更强的搜索能力。
适用范围
邀测免费使用:FalconSeek当前处于限量免费测试阶段,请联系技术支持申请白名单开通使用权限。
版本限制:当前功能强依赖于 Elasticsearch 8.17.0 版本,无法升级或降级。
实例限制:仅支持为新购买的向量增强版实例开启 FalconSeek 功能,存量实例暂不支持。
为集群开启 FalconSeek
FalconSeek 功能仅支持在创建新实例时开启,您需要按照以下步骤完成配置。
在实例购买页面,开启 FalconSeek 功能。
实例类型:必须选择向量增强版。
实例类型:必须选择8.17.0(向量场景首推)。
高级增强功能:勾选FalconSeek 云原生内核。
根据您的业务需求设置其他参数如专有网络、实例规格等,然后完成支付流程。
待实例创建成功后,您可以通过 Kibana 控制台执行以下命令,确认FalconSeek功能是否已在集群级别成功开启。
GET _cluster/settings?include_defaults&filter_path=defaults.havenask.engine.enabled如果返回结果中的
enabled字段为true,则表示功能已成功开启。{ "defaults": { "havenask": { "engine": { "enabled": "true" } } } }
为索引启用FalconSeek
在集群级别开启 FalconSeek 功能后,默认不会对任何索引生效。您需要通过索引设置(Index Settings),为希望加速的特定索引显式启用 FalconSeek 引擎。
索引级启用FalconSeek
为新索引启用FalconSeek
在创建索引时,在
settings中添加参数"index.havenask.engine.enabled": true,启用FalconSeek。PUT falcon_seek_test { "settings": { "index.havenask.engine.enabled": true // 开启FalconSeek功能 }, "mappings": { "properties": { "foo": { "type": "keyword" } } } }写入数据
POST falcon_seek_test/_bulk {"index":{}} {"foo":"hello"} {"index":{}} {"foo":"world"} {"index":{}} {"foo":"cpp"} {"index":{}} {"foo":"java"}查询数据,默认使用FalconSeek。
GET falcon_seek_test/_search { "query": { "term":{ "foo":{ "value": "hello" } } }, "sort": [ { "_doc": { "order": "desc" } } ] }
为已有索引启用FalconSeek
以下命令仅创建索引,未开启加速。
PUT my_existing_index { "settings": { "number_of_shards": 5, "number_of_replicas": 1 }, "mappings": { "properties": { "foo": { "type": "keyword" } } } }使用
_settingsAPI 更新索引配置,即可动态开启。PUT my_existing_index/_settings { "index.havenask.engine.enabled": true }该场景下若要生效FalconSeek,需要先执行
POST /my_existing_index/_close关闭索引,再执行POST /my_existing_index/_open重新打开索引。
字段级启用FalconSeek
以下示例在vector 字段上使用FalconSeek构建向量索引,此配置仅作用于 vector 字段,不影响索引中其他字段。
PUT falcon_seek_index
{
"mappings": {
"properties": {
"vector": {
"type": "dense_vector",
"dims": 768,
"index": true,
"similarity": "l2_norm",
"index_options": {
"type": "havenask_native"
}
}
}
}
}执行POST /my_existing_index/_close关闭索引,再执行POST /my_existing_index/_open重新打开索引,生效FalconSeek。
管理查询执行策略
FalconSeek 提供了灵活的查询执行策略,允许您在索引级别或单次查询级别中控制请求是由 FalconSeek 处理还是回退至 Elasticsearch 原生引擎。您可以通过 index.havenask.engine.search.type(索引级别)或 havenask_search_type(查询级别)参数进行设置,查询级别的参数优先级更高。
策略 | 描述 | 推荐场景 |
| 查询优先由 FalconSeek 执行。如果遇到不支持的语法或功能,请求会自动回退到 Elasticsearch 原生引擎执行。 | 兼顾性能与兼容性的通用生产环境。 |
| 查询强制由 Elasticsearch 原生引擎执行。 | 需要进行性能对比或绕过 FalconSeek 的未知问题时。 |
| 查询强制由 FalconSeek 引擎执行。如果遇到不支持的语法或功能,系统将直接抛出异常,不会回退。 | 调试场景。 |
在索引级别设置默认查询策略
以下示例将 my_index 上的所有查询默认都设置为使用 Elasticsearch 原生引擎执行。
PUT my_index/_settings
{
"index.havenask.engine.search.type": "es"
}在查询时临时覆盖默认策略
假设 my_index 默认使用 native 策略,但您希望某一次特定查询强制使用 Elasticsearch 原生引擎,可以在查询请求中添加 havenask_search_type 参数。
方式一:作为 URL 参数
GET my_index/_search?havenask_search_type=es { "query": { "match_all": {} } }方式二:作为请求体(Request Body)参数
GET my_index/_search { "query": { "match_all": {} }, "havenask_search_type": "es" }
使用 FalconSeek 加速向量检索
您可以利用 FalconSeek 内核集成的高性能向量检索引擎,构建高效的以图搜图、语义搜索等 AI 应用。
创建向量索引,在
mappings中定义一个dense_vector类型的字段mage_vector存储图像/文本的向量,并确保已为该索引开启 FalconSeek。PUT vector_index { "settings": { "index.havenask.engine.enabled": true }, "mappings": { "properties": { "image_vector": { "type": "dense_vector", "dims": 128 }, "title": { "type": "keyword" } } } }写入向量数据,使用
_bulk或_indexAPI 写入文档,其中向量字段的值为一个浮点数数组。POST vector_index/_bulk {"index":{"_id":"1"}} {"image_vector":[0.12, -0.05, 0.08, 0.24, -0.17, 0.31, 0.02, -0.19, 0.11, 0.28, -0.03, 0.15, 0.22, -0.11, 0.09, 0.33, -0.07, 0.14, 0.26, -0.21, 0.18, 0.29, -0.13, 0.06, 0.35, -0.08, 0.16, 0.23, -0.15, 0.12, 0.27, -0.22, 0.19, 0.32, -0.14, 0.07, 0.25, -0.18, 0.13, 0.30, -0.09, 0.17, 0.24, -0.16, 0.10, 0.34, -0.10, 0.20, 0.31, -0.23, 0.15, 0.28, -0.12, 0.11, 0.26, -0.19, 0.14, 0.29, -0.17, 0.08, 0.22, -0.20, 0.16, 0.27, -0.15, 0.09, 0.25, -0.21, 0.18, 0.30, -0.13, 0.07, 0.24, -0.22, 0.19, 0.32, -0.16, 0.10, 0.26, -0.18, 0.12, 0.28, -0.14, 0.06, 0.23, -0.19, 0.15, 0.29, -0.11, 0.05, 0.21, -0.17, 0.13, 0.27, -0.10, 0.04, 0.20, -0.15, 0.11, 0.25, -0.09, 0.03, 0.19, -0.13, 0.10, 0.24, -0.08, 0.02, 0.18, -0.12, 0.09, 0.23, -0.07, 0.01, 0.17, -0.11, 0.08, 0.22, 0.05, -0.06, 0.09, 0.23, -0.07, 0.01, 0.17, -0.11, 0.08, 0.22],"title":"Image One"} {"index":{"_id":"2"}} {"image_vector":[0.12, -0.05, 0.08, 0.24, -0.17, 0.31, 0.02, -0.19, 0.11, 0.28, -0.03, 0.15, 0.22, -0.11, 0.09, 0.33, -0.07, 0.14, 0.26, -0.21, 0.18, 0.29, -0.13, 0.06, 0.35, -0.08, 0.16, 0.23, -0.15, 0.12, 0.27, -0.22, 0.19, 0.32, -0.14, 0.07, 0.25, -0.18, 0.13, 0.30, -0.09, 0.17, 0.24, -0.16, 0.10, 0.34, -0.10, 0.20, 0.31, -0.23, 0.15, 0.28, -0.12, 0.11, 0.26, -0.19, 0.14, 0.29, -0.17, 0.08, 0.22, -0.20, 0.16, 0.27, -0.15, 0.09, 0.25, -0.21, 0.18, 0.30, -0.13, 0.07, 0.24, -0.22, 0.19, 0.32, -0.16, 0.10, 0.26, -0.18, 0.12, 0.28, -0.14, 0.06, 0.23, -0.19, 0.15, 0.29, -0.11, 0.05, 0.21, -0.17, 0.13, 0.27, -0.10, 0.04, 0.20, -0.15, 0.11, 0.25, -0.09, 0.03, 0.19, -0.13, 0.10, 0.24, -0.08, 0.02, 0.18, -0.12, 0.09, 0.23, -0.07, 0.01, 0.17, -0.11, 0.08, 0.22, 0.05, -0.06, 0.09, 0.23, -0.07, 0.01, 0.17, -0.11, 0.08, 0.22],"title":"Image Two"}执行 k-NN 向量检索,使用
knn查询子句查找与给定向量最相似的 Top K 个结果。GET vector_index/_search { "knn": { "field": "image_vector", "query_vector": [0.12, -0.05, 0.08, 0.24, -0.17, 0.31, 0.02, -0.19, 0.11, 0.28, -0.03, 0.15, 0.22, -0.11, 0.09, 0.33, -0.07, 0.14, 0.26, -0.21, 0.18, 0.29, -0.13, 0.06, 0.35, -0.08, 0.16, 0.23, -0.15, 0.12, 0.27, -0.22, 0.19, 0.32, -0.14, 0.07, 0.25, -0.18, 0.13, 0.30, -0.09, 0.17, 0.24, -0.16, 0.10, 0.34, -0.10, 0.20, 0.31, -0.23, 0.15, 0.28, -0.12, 0.11, 0.26, -0.19, 0.14, 0.29, -0.17, 0.08, 0.22, -0.20, 0.16, 0.27, -0.15, 0.09, 0.25, -0.21, 0.18, 0.30, -0.13, 0.07, 0.24, -0.22, 0.19, 0.32, -0.16, 0.10, 0.26, -0.18, 0.12, 0.28, -0.14, 0.06, 0.23, -0.19, 0.15, 0.29, -0.11, 0.05, 0.21, -0.17, 0.13, 0.27, -0.10, 0.04, 0.20, -0.15, 0.11, 0.25, -0.09, 0.03, 0.19, -0.13, 0.10, 0.24, -0.08, 0.02, 0.18, -0.12, 0.09, 0.23, -0.07, 0.01, 0.17, -0.11, 0.08, 0.22, 0.05, -0.06, 0.09, 0.23, -0.07, 0.01, 0.17, -0.11, -0.08,-0.22], "k": 10, "num_candidates": 100 }, "fields": ["title"] }
更多FalconSeek向量索引使用请参见FalconSeek向量索引使用指南。
常见问题
Q:我可以在已有的 Elasticsearch 实例上开启 FalconSeek 功能吗?
A:不可以。目前 FalconSeek 功能仅支持在新购实例时开启。对于存量实例,如果您希望使用该功能,建议您创建一个符合要求的新实例,并使用阿里云数据传输服务(DTS)或 Logstash 等工具将数据迁移至新实例。
Q:如果我执行了一个 FalconSeek 不支持的查询会发生什么?
A:这取决于您的查询执行策略。在默认的 native 模式下,查询会自动回退到 Elasticsearch 原生引擎执行,您仍能获得正确的结果,但无法享受 FalconSeek 的性能加速。如果在 native-direct 模式下,系统会直接返回错误信息。