📣 极限科技诚招搜索运维工程师(Elasticsearch/Easysearch)- 全职/北京 👉 : 立即申请加入

前言 - 什么是 Easysearch #

在介绍 Easysearch 之前,我们无法绕过 Elasticsearch(简称 ES)。作为全文检索领域的绝对霸主,ES 几乎是所有搜索和日志分析场景的首选。但是, 自 2021 年 ES 宣布修改开源协议(从 Apache 2.0 变更为 SSPL)后,以及同年 Elastics 解散了中国的直销团队,许多企业和开发者开始寻求更稳定、协议更友好的替代方案。 Easysearch 正是在这样的背景下诞生的。

为什么叫 “Easy”?对于中国开发者来说,原生 ES 的“毛坯房”体验往往伴随着不少痛点:下载后要寻找对应版本的中文分词插件、企业级的安全功能缺失,只有简单的用户权限控制、在黑乎乎的命令行使用 cURL 拼 DSL 体验劝退、用了 SQL 插件但却不支持 JOIN。

Easysearch 的核心理念就是“开箱即用”,它在保持与 ES 7.10.2 API 100% 兼容的基础上,替开发者完成了以下工作:

  • 原生集成中文分词:默认集成了最流行的 analysis-ik 插件,不再需要因为版本不匹配而头秃,下载启动即可处理中文。
  • 企业级安全特性:提供了完善的安全管控能力,支持细粒度的权限控制,保障数据安全。
  • 内置管理 UI: 告别命令行操作,大多数功能可在 UI 完成。DSL 编写有语法高亮和自动补全。
  • 自主可控: 源码完全自主可控,掌握核心研发。全面国产 OS / CPU / 主机 / 存储 / 算法,适配兼容测试优化。

基本概念 #

Easysearch 是一个分布式的搜索引擎,底层基于 Lucene。为了方便理解,我们通常会将它的概念与我们熟悉的关系型数据库(如 MySQL)进行类比。

概念对应关系型数据库 (MySQL)说明
Index (索引)Table (表)数据的逻辑容器,存储具有相同结构的文档。
Document (文档)Row (行)存储的每一条具体数据。
Field (字段)Column (列)文档中的属性,如 name、age。
MappingSchema (表结构)定义字段类型(是数字还是字符串)。
DSLSQLEasysearch 两者都支持。

Node(节点)与 Cluster(集群) #

  • Node(节点):一台运行着 Easysearch 进程的服务器。
  • Cluster(集群):由一个或多个节点组成,它们协同工作,共同存储数据并处理搜索请求。

Easysearch 是一个分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个 Easysearch 实例。

Index(索引) #

Index 是含有相同属性的文档的集合。它对应数据库中的 Table(表)

  • 如果你要存用户数据,你会创建一个 user 索引。
  • 如果你要存商品数据,你会创建一个 product 索引。

之所以叫 Index 而不是 Table 是因为 Easysearch 默认会对其中的文档建议索引,查找数据的时候,直接查找该索引。

Document(文档) #

Document 是你可以索引的基本信息单元,对应数据库中的 Row(行)。Easysearch 使用 JSON 格式来表示一个文档。

一条 MySQL 里的数据行可能是这样:

nameagejob
‘张峰’32‘电路工程师’

而在 Easysearch 中,对应的 Document 是这样:

{
  "name": "张峰",
  "age": 32,
  "job": "电路工程师"
}

Field(字段) #

文档中的每一个 JSON Key,就是一个 Field,对应数据库中的 Column(列)。 你需要根据业务场景为字段定义类型:

  • text:会被分词,用于全文检索(如“华为手机”可以搜到“华为”)。
  • keyword:不分词,用于精确匹配和聚合(如“北京”只能完整匹配“北京”)。
  • date、long、double 等:标准数据类型。

安装与运行 (本地) #

下载 #

Easysearch 原生支持在 Linux 和 macOS 上运行,也可以通过 WSL 在 Windows 上运行。

获取 Easysearch 本地版本最简单的方法是运行以下 cURL 命令。它会自动检测你的操作系统是否支持,并下载对应的 Easysearch 2.0.2 二进制文件。默认脚本会将 Easysearch 文件下载到 /opt/easysearch,如果你想将其下载到其他路径,请指定 -d参数。可能需要 sudo,如果当前账户没有下载路径的写入权限。

curl -sSL http://get.infini.cloud | bash -s -- -p easysearch -v 2.0.2

运行安装命令,你会看到:

$ curl -sSL http://get.infini.cloud | bash -s -- -p easysearch -v 2.0.2 -d ~/easysearch

                                 @@@@@@@@@@@
                                @@@@@@@@@@@@
                                @@@@@@@@@@@@
                               @@@@@@@@@&@@@
                              #@@@@@@@@@@@@@
        @@@                   @@@@@@@@@@@@@
       &@@@@@@@              &@@@@@@@@@@@@@
       @&@@@@@@@&@           @@@&@@@@@@@&@
      @@@@@@@@@@@@@@@@      @@@@@@@@@@@@@@
      @@@@@@@@@@@@@@@@@@&   @@@@@@@@@@@@@
        %@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
            @@@@@@@@@@@@&@@@@@@@@@@@@@@@
    @@         ,@@@@@@@@@@@@@@@@@@@@@@@&
    @@@@@.         @@@@@&@@@@@@@@@@@@@@
   @@@@@@@@@@          @@@@@@@@@@@@@@@#
   @&@@@&@@@&@@@          &@&@@@&@@@&@
  @@@@@@@@@@@@@.              @@@@@@@*
  @@@@@@@@@@@@@                  %@@@
 @@@@@@@@@@@@@
/@@@@@@@&@@@@@
@@@@@@@@@@@@@
@@@@@@@@@@@@@
@@@@@@@@@@@@        Welcome to INFINI Labs!


Now attempting the installation...

Name: [easysearch], Version: [2.0.2-2499], Path: [/home/user/easysearch]
File: [https://release.infinilabs.com/easysearch/stable/easysearch-2.0.2-2499-linux-amd64.tar.gz]
######################################################################## 100.0%

Installation complete. [easysearch] is ready to use!


----------------------------------------------------------------
cd ~/easysearch && bin/initialize.sh && bin/easysearch
----------------------------------------------------------------


   __ _  __ ____ __ _  __ __
  / // |/ // __// // |/ // /
 / // || // _/ / // || // /
/_//_/|_//_/  /_//_/|_//_/

©INFINI.LTD, All Rights Reserved.

初始化 #

现在运行初始化脚本进行初始化工作,在初始化过程中,脚本会询问是否要安装插件,我们使用 -s参数来回答 yes:

$ cd ~/easysearch
$ ./bin/initialize.sh -s

你会看到如下的输出


                                 @@@@@@@@@@@
                                @@@@@@@@@@@@
                                @@@@@@@@@@@@
                               @@@@@@@@@&@@@
                              #@@@@@@@@@@@@@
        @@@                   @@@@@@@@@@@@@
       &@@@@@@@              &@@@@@@@@@@@@@
       @&@@@@@@@&@           @@@&@@@@@@@&@
      @@@@@@@@@@@@@@@@      @@@@@@@@@@@@@@
      @@@@@@@@@@@@@@@@@@&   @@@@@@@@@@@@@
        %@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
            @@@@@@@@@@@@&@@@@@@@@@@@@@@@
    @@         ,@@@@@@@@@@@@@@@@@@@@@@@&
    @@@@@.         @@@@@&@@@@@@@@@@@@@@
   @@@@@@@@@@          @@@@@@@@@@@@@@@#
   @&@@@&@@@&@@@          &@&@@@&@@@&@
  @@@@@@@@@@@@@.              @@@@@@@*
  @@@@@@@@@@@@@                  %@@@
 @@@@@@@@@@@@@
/@@@@@@@&@@@@@
@@@@@@@@@@@@@
@@@@@@@@@@@@@
@@@@@@@@@@@@        Welcome to INFINI Labs!


Now attempting the initializing...

######################################################################
#                          !!! RISK WARNING !!!                      #
######################################################################
This script is about to perform destructive operations:
  - It will DELETE and OVERWRITE any existing certificates.
  - It will RESET the admin password if the data directory is empty.

If this is not a fresh installation, all existing cluster nodes and clients
using the old certificates will lose connection.

Are you absolutely sure you want to proceed? [y/N]: y
Risk acknowledged. Proceeding with initialization...

--- Operation Logging (Optional) ---
For debugging purposes, you can choose to log the generated credentials
to a file. This is NOT RECOMMENDED for production environments.

Do you want to log operation to '/home/user/easysearch/logs/initialize.log'? [y/N]: y
INFO: Operation will be logged to: /home/user/easysearch/logs/initialize.log

INFO: EASYSEARCH_INITIAL_ADMIN_PASSWORD is not set. Generating a new strong random password
INFO: Using existing JAVA_HOME: /usr/lib/jvm/java-21-openjdk-21.0.5.0.11-1.fc39.x86_64 (Version: 21)

Certificate request self-signature ok
subject=C = IN, ST = FI, L = NI, O = ORG, OU = UNIT, CN = infini.cloud
Certificate request self-signature ok
subject=C = IN, ST = FI, L = NI, O = ORG, OU = UNIT, CN = admin.infini.cloud
                DNS:infini.cloud, DNS:*.infini.cloud
                DNS:infini.cloud, DNS:*.infini.cloud

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@     WARNING: all easysearch plugins will be installed      @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

Install easysearch plugins with online resources. [y/N]: y
INFO: Installing Easysearch plugins...
  - Successfully installed 'sql'
  - Successfully installed 'analysis-ik'
  - Successfully installed 'analysis-pinyin'
  - Successfully installed 'analysis-stconvert'
  - Successfully installed 'ingest-common'
  - Successfully installed 'ingest-geoip'
  - Successfully installed 'ingest-user-agent'
  - Successfully installed 'mapper-annotated-text'
  - Successfully installed 'mapper-murmur3'
  - Successfully installed 'mapper-size'
  - Successfully installed 'transport-nio'
  - Successfully installed 'knn'
  - Successfully installed 'ai'
  - Successfully installed 'ui'

✅ All 14 Easysearch plugins have been installed successfully.


##########################################################################
✅ Easysearch is ready to use!

   You can connect to the cluster using the following bootstrap credential via API:
   curl -ku  'admin:NRgm=Ra6Ig2pgQRw8+y#pnv!' https://localhost:9200

   Or visit the web based management console: https://localhost:9200/_ui/

🔑 IMPORTANT: Please save the password shown above in a secure location.
   └── NOTE: This initial password is only valid for the first startup.

##########################################################################


----------------------------------------------------------------
cd /home/user/easysearch && bin/easysearch
----------------------------------------------------------------


   __ _  __ ____ __ _  __ __
  / // |/ // __// // |/ // /
 / // || // _/ / // || // /
/_//_/|_//_/  /_//_/|_//_/

©INFINI.LTD, All Rights Reserved.

在脚本输出中,我们可以看到脚本为 admin 账户生成了一个随机密码 NRgm=Ra6Ig2pgQRw8+y#pnv!,我们需要保存下来以备后面使用。

启动 Easysearch server #

在一个终端中运行 easysearch

$ ./bin/easysearch

可以在另一个终端中运行 cURL 命令验证 Easysearch 是否成功启动:

$ curl -ku  'admin:NRgm=Ra6Ig2pgQRw8+y#pnv!' https://localhost:9200
{
  "name" : "fedora",
  "cluster_name" : "easysearch",
  "cluster_uuid" : "CWvvlsXZQW-_7h-uD77M-w",
  "version" : {
    "distribution" : "easysearch",
    "number" : "2.0.2",
    "distributor" : "INFINI Labs",
    "build_hash" : "f9f6be82d56cc71ad6b0f67b6da32a7898c4c23a",
    "build_date" : "2025-12-17T01:49:20.267870870Z",
    "build_snapshot" : false,
    "lucene_version" : "9.12.2",
    "minimum_wire_lucene_version" : "8.7.0",
    "minimum_lucene_index_compatibility_version" : "8.7.0"
  },
  "tagline" : "You Know, For Easy Search!"
}

快速上手 #

如果你用过原生 Elasticsearch,一定经历过对着 9200 端口返回的 JSON 字符串发呆的时刻——如果不额外部署 Kibana 或 Cerebro,你很难直观地了解集群到底在发生什么。

Easysearch 则贴心地内置了可视化管理界面(Dashboard)。启动服务后,你不仅拥有一个强大的搜索引擎,还获得了一个功能完备的控制台,我们可以在浏览器访问 https://127.0.0.1:9200/_ui

我在另一台机器上启动的 Easysearch,所以集群地址是 htps://192.168.3.119:9200,如果你在本机启动,那么集群地址就应该是 https://127.0.0.1:9200

输入用户名和密码即可进入。

这个界面为开发者提供了上帝视角:

  • 集群全景监控
    • 健康状态:大大的绿色 “green” 让你对系统状态一目了然。
    • 资源仪表盘:实时展示 CPU、内存、JVM 堆内存以及磁盘使用率。以前需要敲几行命令才能看到的指标,现在直接图形化呈现,性能瓶颈一眼便知。
    • 拓扑视图:右下角的拓扑图直观展示了节点分布,多节点集群管理不再抽象。
  • 开发者的神兵利器
    • 请特别留意左侧菜单中的 “开发工具” (Dev Tools)。对于开发者来说,这是最常用的功能。它提供了一个支持语法高亮和自动补全的 Web 编辑器,你可以在这里直接编写 DSL 进行查询调试,彻底告别在终端里手敲 cURL 命令的痛苦。
  • 核心资源管理
    • 你可以直接在界面上管理 索引、**分片 **和 安全管理,无需记忆复杂的运维 API。

创建索引 (Create Table) #

接下来的上手操作,我们将用到 UI 的开发工具,在其中编写 DSL。我们在左侧编写 DSL,使用 command (Windows 是 ctrl) + enter 键即可运行 DSL,结果将在右侧展示:

在关系型数据库中,你需要先定义表结构(Schema)。在 Easysearch 中,我们创建一个名为 my_first_index 的索引,并定义字段映射。将下面的代码块内容拷贝到开发工具中,无需指定集群地址/用户/密码,开发工具会帮我们处理掉这些细节:

PUT /my_first_index
{
  "mappings": {
    "properties": {
      "id": { "type": "long" },
      "title": { "type": "keyword" },
      "content": {
        "type": "text",
        "analyzer": "ik_max_word"
      },
      "create_time": { "type": "date" }
    }
  }
}

我们给 content 字段设置了 ik_max_word的 analyzer,以获得更好的中文支持。

写入数据 #

接下来,我们写入几条包含中文内容的测试数据。为了模拟真实场景,我们使用 _bulk API 一次性写入多行数据。

POST /my_first_index/_bulk
{"index":{"_id":"1"}}
{"id":1,"title":"Easysearch简介","content":"Easysearch 是一个基于 Elasticsearch 的衍生版本。","create_time":"2023-01-01"}
{"index":{"_id":"2"}}
{"id":2,"title":"功能特性","content":"它默认集成了中文分词插件和 SQL 支持。","create_time":"2023-01-02"}
{"index":{"_id":"3"}}
{"id":3,"title":"开发者体验","content":"开箱即用的体验让开发者告别复杂的配置。","create_time":"2023-01-03"}

返回的 JSON 中包含 "errors": false表示写入成功:

查询数据 #

现在数据已经就绪,我们可以开始检索了。这里我们将展示 Easysearch 的两种查询方式:SQL 查询(推荐)和 原生 DSL

使用 SQL 查询(像操作 MySQL 一样) #

POST /_sql?format=txt
{
  "query": "SELECT * FROM my_first_index WHERE MATCH_QUERY(content, '开箱即用') ORDER BY id DESC LIMIT 5"
}

我们使用了 MATCH_QUERY函数来进行全文搜索

使用 DSL 查询 #

为了证明中文分词真的在工作,我们尝试搜索“衍生版本”。如果是原生 ES(标准分词器),它会将“衍”、“生”拆开匹配,导致噪音;而 Easysearch 会精准匹配这个词组。

GET /my_first_index/_search
{
  "query": {
    "match": {
      "content": "衍生版本"
    }
  }
}

总结 #

至此,你已经掌握了 Easysearch 的基本用法。

回顾一下,Easysearch 并非要重新发明轮子,而是致力于让这个轮子在中文开发环境中滚动的更加顺滑。作为 Elasticsearch 7.10.2 的衍生版本,它完美继承了开源时代的遗产,同时补齐了原生 ES 在本地化易用性上的短板:

  • 对于运维:它是一行命令即可部署、内置安全与监控的稳定引擎,告别繁琐的插件配置和复杂的集群调优。
  • 对于开发:它是一个听得懂 SQL、看得懂中文、API 完全兼容的强大后端,让你可以专注于业务逻辑而非底层细节。

无论你是由于开源协议变更正在寻找 ES 的替代方案,还是从零开始构建一个新的搜索业务,Easysearch 都是目前国内开发者的最优解之一。

下一步做什么? #

你可以在 官方文档中深入了解更多进阶功能,或者直接加入社区,与数千名开发者一起探索搜索技术的边界。
Happy Searching!