使用 FalconSeek 云原生内核加速 Elasticsearch 查询

当 Elasticsearch 在处理复杂聚合或高基数词条查询等场景时,可能会遇到性能瓶颈。为了解决这些问题,您可以使用 FalconSeek 云原生内核。该内核基于阿里巴巴自研的 Havenask 搜索引擎构建,通过 C++ 实现的列式内存结构与全异步执行框架,在完全兼容 Elasticsearch 生态的同时,显著提升查询性能,帮助您在不改变使用习惯的前提下,获得更高的性价比和更强的搜索能力。

适用范围

  • 邀测免费使用:FalconSeek当前处于限量免费测试阶段,请联系技术支持申请白名单开通使用权限。

  • 版本限制:当前功能强依赖于 Elasticsearch 8.17.0 版本,无法升级或降级。

  • 实例限制:仅支持为新购买向量增强版实例开启 FalconSeek 功能,存量实例暂不支持。

为集群开启 FalconSeek

FalconSeek 功能仅支持在创建新实例时开启,您需要按照以下步骤完成配置。

  1. 在实例购买页面,开启 FalconSeek 功能。

    • 实例类型:必须选择向量增强版

    • 实例类型:必须选择8.17.0(向量场景首推)

    • 高级增强功能:勾选FalconSeek 云原生内核

  2. 根据您的业务需求设置其他参数如专有网络实例规格等,然后完成支付流程。

  3. 待实例创建成功后,您可以通过 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

  1. 在创建索引时,在settings 中添加参数 "index.havenask.engine.enabled": true,启用FalconSeek。

    PUT falcon_seek_test
    {
      "settings": {
        "index.havenask.engine.enabled": true    // 开启FalconSeek功能
      },
      "mappings": {
        "properties": {
          "foo": {
            "type": "keyword"
          }
        }
      }
    }
  2. 写入数据

    POST falcon_seek_test/_bulk
    {"index":{}}
    {"foo":"hello"}
    {"index":{}}
    {"foo":"world"}
    {"index":{}}
    {"foo":"cpp"}
    {"index":{}}
    {"foo":"java"}
  3. 查询数据,默认使用FalconSeek。

    GET falcon_seek_test/_search
    {
      "query": {
        "term":{
          "foo":{
            "value": "hello"
          }
        }
      },
      "sort": [
        {
          "_doc": {
            "order": "desc"
          }
        }
      ]
    }

为已有索引启用FalconSeek

  1. 以下命令仅创建索引,未开启加速。

    PUT my_existing_index
    {
      "settings": {
        "number_of_shards": 5,
        "number_of_replicas": 1
      },
      "mappings": {
        "properties": {
          "foo": {
            "type": "keyword"
          }
        }
      }
    }
  2. 使用 _settings API 更新索引配置,即可动态开启。

    PUT my_existing_index/_settings
    {
      "index.havenask.engine.enabled": true
    }
  3. 该场景下若要生效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(查询级别)参数进行设置,查询级别的参数优先级更高。

策略

描述

推荐场景

native (默认)

查询优先由 FalconSeek 执行。如果遇到不支持的语法或功能,请求会自动回退到 Elasticsearch 原生引擎执行。

兼顾性能与兼容性的通用生产环境。

es

查询强制由 Elasticsearch 原生引擎执行。

需要进行性能对比或绕过 FalconSeek 的未知问题时。

native-direct

查询强制由 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 应用。

  1. 创建向量索引,在 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"
          }
        }
      }
    }
  2. 写入向量数据,使用 _bulk_index API 写入文档,其中向量字段的值为一个浮点数数组。

    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"}
  3. 执行 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 模式下,系统会直接返回错误信息。