使用netstat -lntp来看看有侦听在网络某端口的进程。当然,也可以使用 lsof。
Easysearch

Easysearch

第1期 | 2024 搜索客社区 Meetup 线上直播活动,主题:Easysearch 结合大模型实现 RAG

活动searchkit 发表了文章 • 0 个评论 • 294 次浏览 • 1 天前 • 来自相关话题

2024 搜索客社区 Meetup 首期线上活动正式启动,本次活动由 搜索客社区、极限科技(INFINI Labs)联合举办,诚邀广大搜索技术开发者和爱好者参加交流学习。

活动时间:2024 年 7 月 31 日 19:30-20:30 (周三)
活动形式:微信视频号(极限实验室)直播
报名方式:关注或扫码海报中的二维码进行预约

活动海报

活动简介

在这个人工智能飞速发展的时代,ChatGPT 和 GPT-4 的出现无疑为人类带来了前所未有的震撼。我们不禁思考:通用人工智能的奇点是否真的即将来临?而最前沿的 AI 技术与最实用的落地应用之间的距离,又该如何缩短?

为了深入探讨这些问题,我们特别邀请到了极限科技(INFINI Labs)高级解决方案架构师、《老杨玩搜索》栏目 B 站 UP 主——杨帆先生,为我们带来一场主题为 “Easysearch 结合大模型实现 RAG” 的精彩演讲。

嘉宾介绍

杨帆,拥有十余年金融行业服务工作经验,熟悉 Linux、数据库、网络等领域。目前主要从事 Easysearch、Elasticsearch 等搜索引擎的技术支持工作,服务国内私有化部署的客户。他的丰富经验和深刻见解,将为我们揭开 AI 技术与实际应用之间的神秘面纱。

演讲主题

《Easysearch 结合大模型实现 RAG》

主题摘要

在本次演讲中,杨帆将跟大家分享和探讨以下几个方面:

  1. LangChain 简介:LangChain 的作用是什么?它由哪些组件构成,优势是什么。
  2. RAG 的背景及其局限性:RAG 出现以前的我们是如何获取信息的,RAG 解决了什么问题?它就是最终的答案了吗?
  3. LangChain 下的 RAG 工作流:在 LangChain 的框架下,实现 RAG 的步骤是怎样的。
  4. RAG Demo:使用 ollama 部署本地模型,利用 LangChain 集成 Easysearch 和 LLM , 开发 QA 问答系统

活动亮点

  • 前沿技术分享: 深入了解当前 AI 领域的最新动态和发展趋势。
  • 实战经验交流: 学习如何在实际工作中应用这些先进技术。
  • 互动问答环节: 与演讲嘉宾直接对话,解答你的疑惑。

参与有奖

本次直播活动中设置了随机抽奖环节,奖品为 INFINI Labs 周边纪念品,包括 T 恤、鸭舌帽、咖啡杯、指甲刀套件等等(图片仅供参考,款式、颜色与尺码随机)。

抽奖礼品

活动交流

活动交流群二维码 7 天内(8 月 1 日前)有效,如过期请添加小助手微信拉群。活动最新消息也会在群内及时同步,欢迎大家参与,记得先预约,精彩内容不错过!

活动交流

讲师招募

讲师招募

搜索客社区 Meetup 讲师持续招募中...

这是一个由搜索客社区精心组织策划的线下线上技术交流活动,我们诚挚邀请各位技术大咖、行业精英踊跃提交演讲议题。Meetup 活动将聚焦 AI 与搜索领域的最新动态,以及数据实时搜索分析、向量检索、技术实践与案例分析、日志分析、安全等领域的深度探讨。详情参见:http://cfp.searchkit.cn 。我们热切期待您的精彩分享!

关于 搜索客(SearchKit)社区

搜索客社区由 Elasticsearch 中文社区进行全新的品牌升级,以新的 Slogan:“搜索人自己的社区” 为宣言。汇集搜索领域最新动态、精选干货文章、精华讨论、文档资料、翻译与版本发布等,为广大搜索领域从业者提供更为丰富便捷的学习和交流平台。社区官网:https://searchkit.cn

Easysearch 有奖征文活动推荐

黑神话悟空

无论你是 Easysearch 的老用户,还是第一次听说这个名字,只要你对 INFINI Labs 旗下的 Easysearch 产品感兴趣,或者是希望了解 Easysearch,都可以参加这次活动。

详情查看:Easysearch 征文活动

Easysearch 新特性:写入限流功能介绍

EasysearchINFINI Labs 小助手 发表了文章 • 0 个评论 • 1427 次浏览 • 2024-07-17 14:52 • 来自相关话题

背景

在 Easysearch 的各种使用场景中,高写入吞吐量的场景占了很大一部分,由此也带来了一些使用上的问题,很多用户由于使用经验不足,对集群的写入压测进行的不够充分,不能很好的规划集群的写入量。

导致经常发生以下问题:

  • 写入吞吐量过大对内存影响巨大,引发节点 OOM,节点掉线问题。
  • 对 CPU 和内存的占用严重影响了其他的查询业务的响应。
  • 以及磁盘 IO 负载增加,挤占集群的网络带宽等问题。

之前就有某金融保险类客户遇到了因业务端写入量突然猛增导致数据节点不停的 Full GC,进而掉入了不停的掉线,上线,又掉线的恶性循环中。当时只能建议用户增加一个类似“挡板”的服务,在数据进入到集群之前进行拦截,对客户端写入进行干预限流:

这样做虽然有效,但是也增加了整个系统的部署复杂性,提高了运维成本。

根据客户的实际场景,Easysearch 从 1.8.0 版本开始引入了节点和 Shard 级别的限流功能,不用依赖第三方就可以限制写入压力,并在 1.8.2 版本增加了索引级别的写入限流。 注意:所有写入限流都是针对各数据节点的 Primary Shard 写入进行限流的,算上副本的话吞吐量要乘以 2。

限流示意图:

下面是限流前后相同数据节点的吞吐量和 CPU 对比:

测试环境:

ip       name   http          port version role master
10.0.0.3 node-3 10.0.0.3:9209 9303 1.8.0   dimr -
10.0.0.3 node-4 10.0.0.3:9210 9304 1.8.0   im   -
10.0.0.3 node-2 10.0.0.3:9208 9302 1.8.0   dimr -
10.0.0.3 node-1 10.0.0.3:9207 9301 1.8.0   dimr *

测试索引配置:

PUT test_0
{
  "settings": {
    "number_of_replicas": 1,
    "number_of_shards": 3
  }
}

压测工具:采用极限科技的 INFINI Loadgen 压测,这款压测工具使用简单,可以方便对任何支持 Rest 接口的库进行压测。

压测命令:

 ./loadgen-linux-amd64 -d 180 -c 10 -config loadgen-easy-1.8.yml

压测 180 秒,10 个并发,每个 bulk 请求 5000 条。

节点级别限流

通过 INFINI Console 监控指标可以看到,限流之前的某个数据节点,CPU 占用 10%,每秒写入 40000 条左右:

在 Cluster Settings 里配置,启用节点级别限流,限制每个节点的每秒最大写入 10000 条,并在默认的 1 秒间隔内进行重试,超过默认间隔后直接拒绝。

PUT _cluster/settings
{
  "transient": {
    "cluster.throttle.node.write": true,
    "cluster.throttle.node.write.max_requests": 10000,
    "cluster.throttle.node.write.action": "retry"
  }
}

限流后,CPU 占用降低了约 50%,算上副本一共 20000 条每秒:

Shard 级别限流

设置每个分片最大写入条数为 2000 条每秒

PUT _cluster/settings
{
  "transient": {
    "cluster.throttle.shard.write": true,
    "cluster.throttle.shard.write.max_requests": 2000,
    "cluster.throttle.shard.write.action": "retry"
  }
}

集群级别的监控,同样是只针对主 Shard。

从 Console 的监控指标可以看出,索引 test_0 的 Primary indexing 维持在 6000 左右,正好是 3 个主分片限制的 2000 的写入之和。

再看下数据节点监控,Total Shards 表示主分片和副本分片的写入总和即 4000,单看主分片的话,正好是 2000.

索引级别限流

有时,集群中可能某个索引的写入吞吐过大而影响了其他业务,也可以针对特定的索引配置写入限制。 可以在索引的 Settings 里设置当前索引每秒写入最大条数为 6000:

PUT test_0
{
  "settings": {
    "number_of_replicas": 1,
    "number_of_shards": 3,
    "index.throttle.write.max_requests": 6000,
    "index.throttle.write.action": "retry",
    "index.throttle.write.enable": true
  }
}

下图索引的 Primary indexing 在 6000 左右,表示索引的所有主分片的写入速度限制在了 6000。

总结

通过本次测试对比,可以看出限流的好处:

  1. 有效控制写入压力: 写入限流功能能够有效限制每个节点和每个 Shard 的写入吞吐量,防止因写入量过大而导致系统资源被过度消耗的问题。

  2. 降低系统资源占用: 在限流前,某数据节点的 CPU 占用率约为 10%。限流后,CPU 占用率显著降低至约 5%,减少了约 50%。这表明在高并发写入场景下,写入限流功能显著降低了系统的 CPU 负载。

  3. 提高系统稳定性: 通过控制写入吞吐量,避免了频繁的 Full GC 和节点掉线问题,从而提升了系统的整体稳定性和可靠性。

  4. 保障查询业务性能: 写入限流功能减少了写入操作对 CPU 和内存的占用,确保其他查询业务的响应性能不受影响。

综上所述,写入限流功能在高并发写入场景下表现出色,不仅有效控制了写入压力,还显著降低了系统资源占用,从而提高了系统的稳定性和查询业务的性能。

关于 Easysearch 有奖征文活动

黑神话悟空

无论你是 Easysearch 的老用户,还是第一次听说这个名字,只要你对 INFINI Labs 旗下的 Easysearch 产品感兴趣,或者是希望了解 Easysearch,都可以参加这次活动。

详情查看:Easysearch 征文活动

作者:张磊

原文:https://infinilabs.cn/blog/2024/easysearch-new-feature-write-throttling-introduction/

【搜索客社区日报】第1859期 (2024-07-15)

社区日报searchkit 发表了文章 • 0 个评论 • 1391 次浏览 • 2024-07-17 14:50 • 来自相关话题

1. Easysearch 新特性:写入限流功能介绍 https://infinilabs.cn/blog/202 ... tion/ 2. 中文大模型基准测评2024年上半年报告 https://report.oschina.net/api ... o.pdf 3. ClickHouse 24.6 版本发布说明 https://mp.weixin.qq.com/s/JrAikqoUMjHHuaLEHZptew 4. 斯坦福年度《人工智能指数报告》的十条重要结论 https://cn.weforum.org/agenda/ ... t-cn/ 5. 面壁智能首席科学家刘知远:大模型的“摩尔定律”是模型知识密度持续增强  https://www.tsinghua.edu.cn/info/1182/112713.htm 编辑:Muse 更多资讯:http://news.searchkit.cn

【搜索客社区日报】第1858期 (2024-07-12)

社区日报Fred2000 发表了文章 • 0 个评论 • 2098 次浏览 • 2024-07-12 14:05 • 来自相关话题

1、中文大模型基准测评上半年报告:GPT-4o 排名第一、通义千问 “国服最强” https://www.oschina.net/news/301339 2、高级 RAG 检索策略之流程与模块化 https://mp.weixin.qq.com/s/WeAcAevUPemPKhQLhId3Vg 3、下一代 RAG 技术来了!微软正式开源 GraphRAG:大模型行业将迎来新的升级? https://www.infoq.cn/article/sqaUMyNg6B8OrCcwg4vo 4、电商场景下 ES 搜索引擎的稳定性治理实践 https://mp.weixin.qq.com/s/fAgAgWWYJbbfcGGx1BpLsw 5、玩转 Easysearch 语法 https://infinilabs.cn/blog/202 ... ntax/ 编辑:Fred  更多资讯:http://news.searchkit.cn
1、中文大模型基准测评上半年报告:GPT-4o 排名第一、通义千问 “国服最强” https://www.oschina.net/news/301339 2、高级 RAG 检索策略之流程与模块化 https://mp.weixin.qq.com/s/WeAcAevUPemPKhQLhId3Vg 3、下一代 RAG 技术来了!微软正式开源 GraphRAG:大模型行业将迎来新的升级? https://www.infoq.cn/article/sqaUMyNg6B8OrCcwg4vo 4、电商场景下 ES 搜索引擎的稳定性治理实践 https://mp.weixin.qq.com/s/fAgAgWWYJbbfcGGx1BpLsw 5、玩转 Easysearch 语法 https://infinilabs.cn/blog/202 ... ntax/ 编辑:Fred  更多资讯:http://news.searchkit.cn

玩转 Easysearch 语法

EasysearchINFINI Labs 小助手 发表了文章 • 0 个评论 • 2114 次浏览 • 2024-07-11 12:11 • 来自相关话题

什么是 Easysearch

Elasticsearch 是一个基于 Apache Lucene 的开源分布式搜索和分析引擎,它被广泛应用于全文搜索、结构化搜索和分析等多种场景中。作为 Elasticsearch 的国产化替代方案,Easysearch 不仅保持了与原生 Elasticsearch 的高度兼容性,还在功能、性能、稳定性和扩展性方面进行了全面提升。对于开发团队来说,从 Elasticsearch 切换到 Easysearch 不需要做任何业务代码的调整,确保了无缝衔接和平滑迁移。

Easysearch 是基于 Elasticsearch 7.10.2 开源版本二次开发,所以支持 Elasticsearch 原始的 Query DSL 语法,基本的 SQL 语法,并且兼容现有 Elasticsearch 的 SDK,使得应用无需修改代码即可进行迁移。其平滑的迁移特性,如基于网关的无缝跨版本迁移与升级,提供了随时安全回退的能力。

在之前的文章中,我们已经介绍了 Easysearch 的搭建可视化工具的使用,今天我们将探讨 Easysearch 集群的基本概念和常用的 API。

Easysearch 集群的核心概念

Easysearch 集群由以下几个核心概念构成:

  1. 节点(Node):集群中的单个服务器,负责存储数据并参与集群的索引和搜索功能。
  2. 集群(Cluster):由一个或多个节点组成,拥有唯一的集群名,协同完成数据索引和查询任务。
  3. 索引(Index):存储相关数据的容器,类似于关系数据库中的数据库,一个索引包含多个文档。
  4. 文档(Document):索引中的基本数据单位,相当于关系数据库中的行。
  5. 字段(Field):文档中的一个属性,相当于数据库中的列。
  6. 分片(Shard):为了提高性能和扩展性,索引可以被分割成多个分片,每个分片是索引的一个部分。
  7. 副本(Replica):分片的副本,用于提高数据的可靠性和在节点出现故障时的可用性。

通过多个 API,例如 _cluster/health_cluster/stats,用户可以轻松查看集群的健康状态和详细信息,这些信息对于维护和优化 Easysearch 集群至关重要。

无论是在性能的提升,还是在功能的兼容性方面,Easysearch 都为用户提供了一个强大的搜索引擎平台,让从 Elasticsearch 到 Easysearch 的迁移变得无缝且高效。掌握其核心概念和 API 的使用,将帮助开发者更好地利用这些工具来构建和优化他们的搜索解决方案。

查看集群信息

在 Easysearch 中,可以通过多个 API 来查看集群的各种信息,包括集群的健康状况、节点信息和索引状态。以下是一些常用的查看集群信息的 API 和示例:

查看集群健康状况

_cluster/health API 可以查看集群的健康状态,包括集群是否处于正常状态、节点数量、分片状态等。

GET /_cluster/health

示例响应:

{
  "cluster_name": "my_cluster",
  "status": "green",
  "timed_out": false,
  "number_of_nodes": 3,
  "number_of_data_nodes": 3,
  "active_primary_shards": 5,
  "active_shards": 10,
  "relocating_shards": 0,
  "initializing_shards": 0,
  "unassigned_shards": 0,
  "delayed_unassigned_shards": 0,
  "number_of_pending_tasks": 0,
  "number_of_in_flight_fetch": 0,
  "task_max_waiting_in_queue_millis": 0,
  "active_shards_percent_as_number": 100.0
}

查看集群状态

_cluster/stats API 可以查看集群的详细状态,包括索引、节点、分片等信息。

GET /_cluster/stats

示例响应:

{
  "cluster_name": "my_cluster",
  "status": "green",
  "indices": {
    "count": 10,
    "shards": {
      "total": 20,
      "primaries": 10,
      "replication": 1.0,
      "index": {
        "shards": {
          "min": 1,
          "max": 5,
          "avg": 2.0
        }
      }
    }
  },
  "nodes": {
    "count": {
      "total": 3,
      "data": 3,
      "coordinating_only": 0,
      "master": 1,
      "ingest": 2
    },
    "os": {
      "available_processors": 12,
      "allocated_processors": 12
    },
    "process": {
      "cpu": {
        "percent": 10
      },
      "open_file_descriptors": {
        "min": 100,
        "max": 300,
        "avg": 200
      }
    }
  }
}

查看节点信息

_nodes API 可以查看集群中节点的详细信息,包括节点角色、IP 地址、内存使用情况等。

GET /_nodes

示例响应:

{
  "cluster_name": "my_cluster",
  "nodes": {
    "node_id_1": {
      "name": "node_1",
      "transport_address": "192.168.1.1:9300",
      "host": "192.168.1.1",
      "ip": "192.168.1.1",
      "roles": ["master", "data", "ingest"],
      "os": {
        "available_processors": 4,
        "allocated_processors": 4
      },
      "process": {
        "cpu": {
          "percent": 10
        },
        "open_file_descriptors": 200
      }
    },
    "node_id_2": {
      "name": "node_2",
      "transport_address": "192.168.1.2:9300",
      "host": "192.168.1.2",
      "ip": "192.168.1.2",
      "roles": ["data"],
      "os": {
        "available_processors": 4,
        "allocated_processors": 4
      },
      "process": {
        "cpu": {
          "percent": 15
        },
        "open_file_descriptors": 150
      }
    }
  }
}

查看索引状态

_cat/indices API 可以查看集群中所有索引的状态,包括文档数、存储大小、分片数等信息。

GET /_cat/indices?v

示例响应:

health status index   uuid                   pri rep docs.count docs.deleted store.size pri.store.size
green  open   index_1 SxNUd84vRl6QH5P7g0T4Vg   1   1          0            0       230b           230b
green  open   index_2 NxEYib4yToCnA1PpQ8P4Xw   5   1        100            1      10mb           5mb

这些 API 可以帮助你全面了解 Easysearch 集群的状态和健康状况,从而更好地管理和维护集群。

增删改查操作

在 Easysearch 中,增删改查操作是管理数据和索引的基本功能。以下是如何使用这些操作的详细示例。

创建索引

创建一个新的索引,并指定分片和副本的数量:

PUT /my_index
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 2
  }
}

删除索引

删除一个不再需要的索引:

DELETE /my_index

添加文档

通过 POST 或 PUT 请求向索引中添加文档:

POST /my_index/_doc/1
{
  "name": "John Doe",
  "age": 30,
  "occupation": "Engineer"
}
PUT /my_index/_doc/1
{
  "name": "John Doe",
  "age": 30,
  "occupation": "Engineer"
}

POSTPUT 方法用于不同的操作,尽管它们都可以用于添加或更新文档,但它们的行为有所不同。

POST /my_index/_doc/1 方法用于创建或替换一个文档。如果指定的文档 ID 已经存在,POST 请求将更新整个文档(不会合并字段)。如果文档 ID 不存在,它将创建一个新的文档。


POST /my_index/_doc/1
{
  "name": "John Doe",
  "age": 30,
  "occupation": "Engineer"
}

PUT /my_index/_doc/1 方法通常用于创建一个新的文档,或者完全替换一个已存在的文档。与 POST 类似,如果指定的文档 ID 已经存在,PUT 请求将替换整个文档。

PUT /my_index/_doc/1
{
  "name": "John Doe",
  "age": 30,
  "occupation": "Engineer"
}

1.使用场景:

  • POST:更适合用于添加或部分更新文档,即使文档 ID 已经存在。
  • PUT:更适合用于创建或完全替换文档。

2.ID 自动生成:

  • POST 请求可以不提供文档 ID,此时 Easysearch 会自动生成一个文档 ID。
  • PUT 请求必须提供文档 ID,如果未提供,则会返回错误。

3.部分更新:

  • POST 请求可以用于部分更新(通过 _update API)。
  • PUT 请求用于完全替换文档,不支持部分更新。

如果文档 ID 已经存在,POSTPUT 都会覆盖整个文档,并且效果是一样的。但是,通常 POST 用于提交数据,而 PUT 用于上传和替换资源。

1.使用 POST 方法添加或更新文档:

POST /my_index/_doc/1
{
  "name": "John Doe",
  "age": 30,
  "occupation": "Engineer"
}

2.使用 PUT 方法添加或更新文档:

PUT /my_index/_doc/1
{
  "name": "John Doe",
  "age": 30,
  "occupation": "Engineer"
}

在这两个示例中,结果都是在索引 my_index 中创建或更新文档 ID 为 1 的文档。无论使用 POST 还是 PUT,如果文档 ID 已存在,都会覆盖原有的文档内容。

新建文档

使用 _create 方法新建文档,如果文档已经存在则返回错误:

PUT /my_index/_create/1
{
  "a": 1
}

如果尝试新建已存在的文档,将会出现如下错误:

{
  "error": {
    "root_cause": [
      {
        "type": "version_conflict_engine_exception",
        "reason": "[1]: version conflict, document already exists (current version [1])",
        "index_uuid": "1xWdHLTaTm6l6HbqACaIEA",
        "shard": "0",
        "index": "my_index"
      }
    ],
    "type": "version_conflict_engine_exception",
    "reason": "[1]: version conflict, document already exists (current version [1])",
    "index_uuid": "1xWdHLTaTm6l6HbqACaIEA",
    "shard": "0",
    "index": "my_index"
  },
  "status": 409
}

获取文档

通过 ID 获取文档的详细信息:

GET /my_index/_doc/1

更新文档

更新文档的特定字段,保留原有字段:

POST /my_index/_update/1
{
  "doc": {
    "age": 31
  }
}

删除文档

通过 ID 删除指定的文档:

DELETE /my_index/_doc/1

查询所有文档

查询索引中的所有文档:

GET /my_index/_search
{
  "query": {
    "match_all": {}
  }
}

这个是 《老杨玩搜索》中总结的图,可以作为“小抄”来记忆:

批量操作 (_bulk API)

_bulk API 用于在一次请求中执行多个索引、删除和更新操作,这对于批量处理大规模数据非常有用,可以显著提高性能和效率。以下是 _bulk API 的基本使用示例:

POST /my_index/_bulk
{ "index": { "_id": "1" } }
{ "name": "John Doe", "age": 30, "occupation": "Engineer" }
{ "index": { "_id": "2" } }
{ "name": "Jane Doe", "age": 25, "occupation": "Designer" }
{ "update": { "_id": "1" } }
{ "doc": { "age": 31 } }

_bulk API 的请求体由多个操作和文档组成。每个操作行包含一个动作描述行和一个可选的源文档行。动作描述行指明了操作的类型(例如,index、create、delete、update)以及操作的元数据。源文档行则包含了实际的数据。

每个操作之间需要用换行符分隔,并且请求体最后必须以换行符结尾。

POST /_bulk
{ "index": { "_index": "a", "_id": "1" } }
{ "name": "John Doe", "age": 30, "occupation": "Engineer" }
{ "index": { "_index": "b", "_id": "2" } }
{ "name": "Jane Doe", "age": 25, "occupation": "Designer" }
{ "update": { "_index": "a", "_id": "1" } }
{ "doc": { "age": 31 } }

分词器

在 Easysearch 中,分词器(Analyzer)用于将文本分解为词项(terms),是全文搜索和文本分析的基础。分词器通常由字符过滤器(Character Filters)、分词器(Tokenizer)和词项过滤器(Token Filters)组成。以下是关于分词器的详细介绍:

1.字符过滤器(Character Filters):在分词之前对文本进行预处理。例如,去除 HTML 标签,替换字符等。

2.分词器(Tokenizer):将文本分解为词项(tokens)。这是分词过程的核心。

3.词项过滤器(Token Filters):对词项进行处理,如小写化、去除停用词、词干提取等。

只有 text 字段支持全文检索,返回的结果根据相似度打分,我们一起看下

POST /index/_mapping
{
  "properties": {
    "content": {
      "type": "text",
      "analyzer": "ik_max_word",
      "search_analyzer": "ik_smart"
    }
  }
}

.POST /index/_mapping

  • 这个部分表示要向名为 index 的索引添加或更新映射设置。

2.“properties”

  • properties 定义了索引中文档的字段结构。在这个例子中,定义了一个名为 content 的字段。

3.“content”

  • 定义了名为 content 的字段。

4.“type”: “text”

type 字段指定 content 字段的数据类型为 texttext 类型适用于需要分词和全文搜索的字段。

5.“analyzer”: “ik_max_word”

analyzer 字段指定索引时使用的分词器为ik_max_wordik_max_word 是 IK 分词器中的一种,它会尽可能多地将文本分解为更多的词项。

6.“search_analyzer”: “ik_smart”

search_analyzer 字段指定搜索时使用的分词器为ik_smartik_smart 是 IK 分词器中的另一种,它会更智能地进行分词,以提高搜索的准确性。

当然,在设置这个 mapping 的时候可以使用同样的分词器,也可以使用不同的分词器。这里介绍下 IK 分词器:

  • IK 分词器是一种中文分词器,适用于中文文本的分词。IK 分词器有两种分词模式:ik_max_wordik_smart
    • ik_max_word:将文本尽可能多地切分成词项,适用于需要更高召回率的场景。
    • ik_smart:进行最智能的分词,适用于需要更高精度的搜索场景。

这个 DSL 的设置意味着,在向这个索引添加或更新文档时,content 字段的文本会使用ik_max_word 分词器进行分词处理,以确保文本被尽可能多地切分成词项。而在搜索时,content 字段的文本会使用ik_smart 分词器进行分词处理,以提高搜索的准确性和相关性。

以下是关于 standard,ik_smart,ik_max_word 这几个分词器的对比:

GET /_analyze
{
  "tokenizer": "standard",
  "text": "我,机器人"
}

GET /_analyze
{
  "tokenizer": "ik_smart",
  "text": "我,机器人"
}

GET /_analyze
{
  "tokenizer": "ik_max_word",
  "text": "我,机器人"
}

结果如下:

# GET /_analyze (standard)
{
  "tokens": [
    {
      "token": "我",
      "start_offset": 0,
      "end_offset": 1,
      "type": "<IDEOGRAPHIC>",
      "position": 0
    },
    {
      "token": "机",
      "start_offset": 2,
      "end_offset": 3,
      "type": "<IDEOGRAPHIC>",
      "position": 1
    },
    {
      "token": "器",
      "start_offset": 3,
      "end_offset": 4,
      "type": "<IDEOGRAPHIC>",
      "position": 2
    },
    {
      "token": "人",
      "start_offset": 4,
      "end_offset": 5,
      "type": "<IDEOGRAPHIC>",
      "position": 3
    }
  ]
}
# GET /_analyze(ik_smart)
{
  "tokens": [
    {
      "token": "我",
      "start_offset": 0,
      "end_offset": 1,
      "type": "CN_CHAR",
      "position": 0
    },
    {
      "token": "机器人",
      "start_offset": 2,
      "end_offset": 5,
      "type": "CN_WORD",
      "position": 1
    }
  ]
}
# GET /_analyze (ik_max_word)
{
  "tokens": [
    {
      "token": "我",
      "start_offset": 0,
      "end_offset": 1,
      "type": "CN_CHAR",
      "position": 0
    },
    {
      "token": "机器人",
      "start_offset": 2,
      "end_offset": 5,
      "type": "CN_WORD",
      "position": 1
    },
    {
      "token": "机器",
      "start_offset": 2,
      "end_offset": 4,
      "type": "CN_WORD",
      "position": 2
    },
    {
      "token": "人",
      "start_offset": 4,
      "end_offset": 5,
      "type": "CN_CHAR",
      "position": 3
    }
  ]
}

如果使用了不存在的分词器会出现这个错误。

{
  "error": {
    "root_cause": [
      {
        "type": "illegal_argument_exception",
        "reason": "failed to find global tokenizer under [simple]"
      }
    ],
    "type": "illegal_argument_exception",
    "reason": "failed to find global tokenizer under [simple]"
  },
  "status": 400
}

精确搜索/正则表达式搜索/通配符

在 Easysearch 中,精确搜索、正则表达式搜索和通配符搜索是三种不同的搜索方式,各有其应用场景和特点:

1.精确搜索 (Term Query)

  • 精确搜索用于查找与搜索词完全匹配的文档。
  • 不进行分词处理,通常用于关键字、ID、标签等字段的精确匹配。
  • 适用于结构化数据或不需要分词的字段(如数字、日期、布尔值等)。
{
  "query": {
    "term": {
      "status": "active"
    }
  }
}

2.正则表达式搜索 (Regexp Query)

  • 正则表达式搜索用于基于正则表达式模式匹配的文档搜索。
  • 支持复杂的字符串匹配模式,但性能可能较低,特别是当数据量较大时。
  • 适用于需要灵活且复杂匹配条件的搜索。
{
  "query": {
    "regexp": {
      "content": "Easysearch .*powerful"
    }
  }
}

3.通配符搜索 (Wildcard Query)

  • 通配符搜索用于通过通配符模式匹配文档。
  • 支持 ?(匹配单个字符)和 *(匹配零个或多个字符)。
  • 性能相对较差,因为通配符搜索可能需要扫描大量数据。
{
  "query": {
    "wildcard": {
      "username": "john*"
    }
  }
}
  • 精确搜索:用于需要绝对匹配特定词语或不需要分词的字段。例如,查找特定用户 ID 或状态。
  • 正则表达式搜索:用于需要复杂字符串模式匹配的场景,但要谨慎使用,避免性能问题。
  • 通配符搜索:用于简单模式匹配,但同样需要注意性能影响,尽量避免在大数据集上频繁使用。

接下来看这个例子,我们将使用批量导入数据,然后进行几种不同类型的查询,包括精确查询、通配符查询和正则表达式查询。

POST /users/_bulk
{ "index": { "_index": "users", "_id": 1 }}
{ "username": "john_doe", "status": "active", "email": "john.doe@example.com", "bio": "John loves Easysearch  and open-source technologies." }
{ "index": { "_index": "users", "_id": 2 }}
{ "username": "jane_doe", "status": "inactive", "email": "jane.doe@example.com", "bio": "Jane is a data scientist working with big data." }
{ "index": { "_index": "users", "_id": 3 }}
{ "username": "john_smith", "status": "active", "email": "john.smith@example.com", "bio": "John enjoys hiking and nature." }
{ "index": { "_index": "users", "_id": 4 }}
{ "username": "alice_jones", "status": "active", "email": "alice.jones@example.com", "bio": "Alice is a software engineer specialized in JavaScript." }
{ "index": { "_index": "users", "_id": 5 }}
{ "username": "bob_jones", "status": "inactive", "email": "bob.jones@example.com", "bio": "Bob is an AI enthusiast and machine learning expert." }

1.精确查询:查询状态为 “active” 的用户。

GET /users/_search
{
  "query": {
    "term": {
      "status": "active"
    }
  }
}

2.通配符查询:查询 bio 字段中包含 “John” 开头的词。

GET /users/_search
{
  "query": {
    "wildcard": {
      "bio": "John*"
    }
  }
}

3.正则表达式查询:查询用户名以 “john” 开头的用户

GET /users/_search
{
  "query": {
    "regexp": {
      "username": "john.*"
    }
  }
}

通过这些例子,你可以看到如何在 Easysearch 中使用批量导入数据,然后使用各种查询方法来检索特定条件的数据。这些查询方法可以帮助你高效地搜索和分析数据,以满足不同的业务需求。

这里同样是《老杨玩搜索》中总结的“小抄”来方便记忆:

多字段查询

在 Easysearch 中,多字段查询允许您在多个字段上同时执行搜索,以获取更精确的结果。最常用的多字段查询类型是 multi_match 查询。multi_match 查询是 match 查询的扩展,能够在多个字段中搜索指定的关键词。

multi_match 查询支持多种匹配模式,如 best_fieldsmost_fieldscross_fieldsphrasephrase_prefix。以下是各模式的简要介绍:

  • best_fields:默认模式,选择匹配度最高的字段。
  • most_fields:计算每个字段的匹配度,然后将匹配度相加。
  • cross_fields:将多个字段视为一个字段进行匹配,适用于分析文本被分散到多个字段的情况。
  • phrase:短语匹配,确保词项顺序与查询相同。
  • phrase_prefix:短语前缀匹配,允许词项的部分匹配。

我们先导入一些示例数据到一个索引 documents 中:

POST /documents/_bulk
{ "index": { "_id": 1 } }
{ "title": "Easysearch  Guide", "content": "This is an introductory guide to Easysearch ." }
{ "index": { "_id": 2 } }
{ "title": "Advanced Easysearch ", "content": "This guide covers advanced topics in Easysearch ." }
{ "index": { "_id": 3 } }
{ "title": "Easysearch  in Action", "content": "Practical guide to Easysearch  usage." }
{ "index": { "_id": 4 } }
{ "title": "Learning Easysearch ", "content": "Beginner's guide to learning Easysearch ." }

我们将使用 multi_match 查询在 titlecontent 字段中同时搜索关键词。

1.基本 multi_match 查询

POST /documents/_search
{
  "query": {
    "multi_match": {
      "query": "guide",
      "fields": ["title", "content"]
    }
  }
}

2.指定匹配模式为 best_fields

POST /documents/_search
{
  "query": {
    "multi_match": {
      "query": "guide",
      "fields": ["title", "content"],
      "type": "best_fields"
    }
  }
}

3.指定匹配模式为 most_fields

POST /documents/_search
{
  "query": {
    "multi_match": {
      "query": "guide",
      "fields": ["title", "content"],
      "type": "most_fields"
    }
  }
}

4.使用 cross_fields 模式

POST /documents/_search
{
  "query": {
    "multi_match": {
      "query": "Easysearch  guide",
      "fields": ["title", "content"],
      "type": "cross_fields"
    }
  }
}

5.短语匹配 (phrase)

POST /documents/_search
{
  "query": {
    "multi_match": {
      "query": "introductory guide",
      "fields": ["title", "content"],
      "type": "phrase"
    }
  }
}

6.短语前缀匹配 (phrase_prefix)

POST /documents/_search
{
  "query": {
    "multi_match": {
      "query": "introductory gui",
      "fields": ["title", "content"],
      "type": "phrase_prefix"
    }
  }
}
  • query:要搜索的关键词或短语。
  • fields:要搜索的字段列表,可以包含一个或多个字段。
  • type:指定匹配模式,默认为 best_fields。

使用 multi_match 查询,您可以在多个字段上同时执行搜索,获得更精确和全面的结果。通过指定不同的匹配模式,您可以调整查询行为以满足特定的搜索需求。无论是基本关键词匹配、短语匹配还是跨字段匹配,multi_match 查询都提供了强大的功能来处理复杂的搜索场景。

除此之外,还可以使用 boost 参数用于调整特定字段的权重,从而影响搜索结果的相关性评分。multi_match 查询支持为不同字段设置不同的 boost 值,以便在搜索结果中优先显示某些字段的匹配项。

布尔查询

布尔查询是 Easysearch 中非常强大且灵活的一种查询方式,它允许用户通过组合多个查询条件来实现复杂的搜索需求。布尔查询使用 bool 查询类型,可以包含以下几种子句:mustfiltermust_notshould。每种子句都有其特定的用途和语义。

1.must

  • 包含在 must 数组中的查询条件必须匹配,类似于逻辑上的 AND 操作。
  • 如果有多个条件,所有条件都必须满足,文档才会被包含在结果集中。

2.filter

  • 包含在 filter 数组中的查询条件必须匹配,但它不会影响评分。
  • filter 子句通常用于对性能要求较高的过滤操作,因为它不计算相关性评分。

3.must_not

  • 包含在 must_not 数组中的查询条件必须不匹配,类似于逻辑上的 NOT 操作。
  • 如果有任何一个条件匹配,文档就会被排除在结果集之外。

4.should

  • 包含在 should 数组中的查询条件至少匹配一个。
  • 如果布尔查询中没有 must 子句,则至少要匹配一个 should 子句。
  • should 子句在计算相关性评分时也有影响。

5.minimum_should_match

  • 指定 should 子句中至少需要满足的条件数量。

首先,我们需要创建一个名为 books 的索引,并定义它的映射(mappings)。映射用于指定每个字段的数据类型。在这个例子中,类别书名字段都被定义为 keyword 类型,这是因为我们需要进行精确匹配查询。

PUT /books
{
  "mappings": {
    "properties": {
      "类别": { "type": "keyword" },
      "书名": { "type": "keyword" }
    }
  }
}

接下来,我们使用批量操作(bulk API)将一些示例数据导入到 books 索引中。这些数据包括不同类别的书籍。

POST /books/_bulk
{ "index": { "_id": 1 } }
{ "类别": "文学", "书名": "我的阿勒泰" }
{ "index": { "_id": 2 } }
{ "类别": "文学", "书名": "平凡的世界" }
{ "index": { "_id": 3 } }
{ "类别": "科学", "书名": "时间简史" }
{ "index": { "_id": 4 } }
{ "类别": "文学", "书名": "百年孤独" }
{ "index": { "_id": 5 } }
{ "类别": "文学", "书名": "红楼梦" }

现在,我们使用布尔查询来搜索类别为“文学”并且书名为“我的阿勒泰”的文档。这里使用的是 must子句,表示查询结果必须满足所有条件。

POST /books/_search
{
  "query": {
    "bool": {
      "must": [
        { "term": { "类别": "文学" } },
        { "term": { "书名": "我的阿勒泰" } }
      ]
    }
  }
}

我们还可以使用 filter 子句来执行相同的查询。filter 子句用于过滤文档,且不会影响文档的相关性评分。这在不需要计算相关性评分时可以提高查询性能。

POST /books/_search
{
  "query": {
    "bool": {
      "filter": [
        { "term": { "类别": "文学" } },
        { "term": { "书名": "我的阿勒泰" } }
      ]
    }
  }
}

当我们执行上述查询时,期望返回的结果是 books 索引中类别为“文学”且书名为“我的阿勒泰”的文档。无论是使用 must 还是 filter 子句,结果应该都是:

{
  "hits": {
    "total": {
      "value": 1,
      "relation": "eq"
    },
    "hits": [
      {
        "_index": "books",
        "_id": "1",
        "_source": {
          "类别": "文学",
          "书名": "我的阿勒泰"
        }
      }
    ]
  }
}

POST /_search
{
  "query": {
    "bool": {
      "must": [
        { "term": { "user.id": "kimchy" } }
      ],
      "filter": [
        { "term": { "tags": "production" } }
      ],
      "must_not": [
        {
          "range": {
            "age": { "gte": 10, "lte": 20 }
          }
        }
      ],
      "should": [
        { "term": { "tags": "env1" } },
        { "term": { "tags": "deployed" } }
      ],
      "minimum_should_match": 1,
      "boost": 1.0
    }
  }
}
  • must 子句:必须匹配的条件,文档必须包含 user.idkimchy
  • filter 子句:过滤条件,文档必须包含 tagsproduction ,但不会影响评分。
  • must_not子句:不匹配的条件,文档的 age 字段不能在 10 到 20 之间。
  • should 子句:可选匹配条件,至少需要匹配一个 should 子句中的条件。这里要求 tags 字段匹配 env1deployed
  • minimum_should_match:至少需要匹配一个 should 子句中的条件。
  • boost:提升查询的整体评分。

为了展示这个 DSL ,我们需要创建一个索引并导入一些数据。假设我们要在 Easysearch 中创建一个索引 users ,并插入一些测试数据。

创建索引

PUT /users
{
  "mappings": {
    "properties": {
      "user.id": { "type": "keyword" },
      "tags": { "type": "keyword" },
      "age": { "type": "integer" }
    }
  }
}

批量导入数据

POST /users/_bulk
{ "index": { "_id": 1 } }
{ "user.id": "kimchy", "tags": ["production", "env1"], "age": 25 }
{ "index": { "_id": 2 } }
{ "user.id": "kimchy", "tags": ["production"], "age": 15 }
{ "index": { "_id": 3 } }
{ "user.id": "kimchy", "tags": ["deployed"], "age": 30 }
{ "index": { "_id": 4 } }
{ "user.id": "kimchy", "tags": ["test"], "age": 35 }
{ "index": { "_id": 5 } }
{ "user.id": "other", "tags": ["production"], "age": 25 }

接下来执行布尔查询:

POST /users/_search
{
  "query": {
    "bool": {
      "must": [
        { "term": { "user.id": "kimchy" } }
      ],
      "filter": [
        { "term": { "tags": "production" } }
      ],
      "must_not": [
        {
          "range": {
            "age": { "gte": 10, "lte": 20 }
          }
        }
      ],
      "should": [
        { "term": { "tags": "env1" } },
        { "term": { "tags": "deployed" } }
      ],
      "minimum_should_match": 1,
      "boost": 1.0
    }
  }
}

根据以上查询,预期返回的结果应该符合以下条件:

  1. user.id必须是 kimchy(由 must 子句决定)。
  2. tags 必须包含 production (由 filter 子句决定)。
  3. age 字段不在 10 到 20 之间(由 must_not 子句决定)。
  4. tags字段中至少包含 env1deployed 中的一个(由 should 子句和 minimum_should_match 参数决定)。
{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 1,
      "relation": "eq"
    },
    "max_score": 1.3769134,
    "hits": [
      {
        "_index": "users",
        "_type": "_doc",
        "_id": "1",
        "_score": 1.3769134,
        "_source": {
          "user.id": "kimchy",
          "tags": ["production", "env1"],
          "age": 25
        }
      }
    ]
  }
}

SQL 搜索

Easysearch 直接支持 SQL 查询,无需额外安装插件,同时兼容 Elasticsearch 的 SQL 调用方式,还可以直接编写原生 SQL 查询。

以下是一些测试 SQL 语句的示例:

SELECT * FROM my_index;

SELECT * FROM my_index LIMIT 2;

SELECT * FROM my_index ORDER BY name;

SELECT name AS full_name, age FROM my_index WHERE age > 25;

SELECT name AS full_name, age FROM my_index WHERE age = 25;

SELECT * FROM my_index WHERE age IS NULL;

SELECT DISTINCT age FROM my_index;

SELECT MIN(age), MAX(age), AVG(age) FROM my_index;

SELECT age, COUNT(*) AS CNT FROM my_index GROUP BY age;

使用 Easysearch 执行 SQL 查询

Easysearch 提供了对直接使用 SQL 查询的支持。以下是如何在 Easysearch 中通过 POST 请求使用 _sql 端点进行查询的示例:

执行 SQL 查询非常简单,只需通过 POST 请求发送 SQL 查询即可。以下是一个示例:

POST /_sql
{
  "query": "SELECT name AS full_name, age FROM my_index WHERE age > 25"
}

你也可以规定返回 JSON 格式:

POST /_sql?format=json
{
  "query": "SELECT name AS full_name, age FROM my_index WHERE age > 25"
}

和 Elasticsearch 一样,Easysearch 允许你通过 POST 请求直接在集群上运行 SQL 查询,并返回查询结果。以下是一些常见的 SQL 查询示例及其对应的 POST 请求:

1.查询所有文档

POST /_sql
{
  "query": "SELECT * FROM my_index"
}

2.限制返回文档数

POST /_sql
{
  "query": "SELECT * FROM my_index LIMIT 2"
}

3.按字段排序

POST /_sql
{
  "query": "SELECT * FROM my_index ORDER BY name"
}

4.筛选条件查询

POST /_sql
{
  "query": "SELECT name AS full_name, age FROM my_index WHERE age > 25"
}

5.精确值查询

POST /_sql
{
  "query": "SELECT name AS full_name, age FROM my_index WHERE age = 25"
}

6.查询空值

POST /_sql
{
  "query": "SELECT * FROM my_index WHERE age IS NULL"
}

7.查询唯一值

POST /_sql
{
  "query": "SELECT DISTINCT age FROM my_index"
}

8.聚合函数查询

POST /_sql
{
  "query": "SELECT MIN(age), MAX(age), AVG(age) FROM my_index"
}

9.分组统计

POST /_sql
{
  "query": "SELECT age, COUNT(*) AS CNT FROM my_index GROUP BY age"
}

多表操作的 SQL 语句

以下是多表操作的 SQL 语句及其解释:

1.子查询

SELECT * FROM `table1` t1 WHERE t1.id IN (SELECT id FROM `table2`)

这个查询从 table1 中选择所有字段的记录,其中这些记录的 idtable2 表中也存在。

2.内连接

SELECT * FROM `table1` t1 JOIN `table2` t2 ON t1.id = t2.id

这个查询进行内连接,从 table1table2 中选择所有字段的记录,前提是 table1table2id 相等。

3.左连接

SELECT * FROM `table1` t1 LEFT JOIN `table2` t2 ON t1.id = t2.id

这个查询进行左连接,从 table1table2 中选择所有字段的记录,即使 table2 中没有匹配的记录,也会返回 table1 中的所有记录,未匹配到的部分会用 NULL 填充。

4.右连接

SELECT * FROM `table1` t1 RIGHT JOIN `table2` t2 ON t1.id = t2.id

这个查询进行右连接,从 table1table2 中选择所有字段的记录,即使 table1 中没有匹配的记录,也会返回 table2 中的所有记录,未匹配到的部分会用 NULL 填充。

假设我们有两个索引 table1table2,对应于 SQL 中的两个表。

创建索引 table1

PUT /`table1`
{
  "mappings": {
    "properties": {
      "id": { "type": "integer" },
      "name": { "type": "text" }
    }
  }
}

创建索引 table2

PUT /`table2`
{
  "mappings": {
    "properties": {
      "id": { "type": "integer" },
      "value": { "type": "text" }
    }
  }
}

导入数据到 table1

POST /`table1`/_bulk
{ "index": { "_id": 1 } }
{ "id": 1, "name": "Alice" }
{ "index": { "_id": 2 } }
{ "id": 2, "name": "Bob" }
{ "index": { "_id": 3 } }
{ "id": 3, "name": "Charlie" }
{ "index": { "_id": 4 } }
{ "id": 4, "name": "David" }

导入数据到 table2

POST /`table2`/_bulk
{ "index": { "_id": 1 } }
{ "id": 1, "value": "Value1" }
{ "index": { "_id": 2 } }
{ "id": 2, "value": "Value2" }
{ "index": { "_id": 5 } }
{ "id": 5, "value": "Value5" }
{ "index": { "_id": 6 } }
{ "id": 6, "value": "Value6" }

导入数据后,可以使用 SQL 来执行这些查询:

1.子查询:

POST /_sql
{
  "query": "SELECT * FROM `table1` WHERE id IN (SELECT id FROM `table2`)"
}

2.内连接:

POST /_sql
{
  "query": "SELECT * FROM `table1` t1 JOIN `table2` t2 ON t1.id = t2.id"
}

3.左连接:

POST /_sql
{
  "query": "SELECT * FROM `table1` t1 LEFT JOIN `table2` t2 ON t1.id = t2.id"
}

4.右连接:

POST /_sql
{
  "query": "SELECT * FROM `table1` t1 RIGHT JOIN `table2` t2 ON t1.id = t2.id"
}

效果如下:

SQL 全文检索

matchmatch_phrase 是 Easysearch 中用于全文搜索的查询类型,它们在处理文本匹配方面有不同的用途:

1.match 查询:

  • match 查询用于对文档进行全文搜索。
  • 它将搜索关键词进行分词,并对这些分词后的词项进行搜索。
  • 适用于查询单个或多个字段,可以进行布尔操作(如 “AND”, “OR”)。
  • 例如,搜索 “Easysearch is powerful” 会被分词为 "Easysearch ", “is”, “powerful” 三个词,然后对这三个词进行搜索,文档中包含这些词的都会被认为是匹配的。
{
  "query": {
    "match": {
      "content": "Easysearch  is powerful"
    }
  }
}

2.match_phrase 查询:

  • match_phrase 查询用于短语搜索。
  • 它要求搜索的短语必须在文档中出现且词的顺序相同,词之间的间隔也必须与查询中的短语相同。
  • 适用于需要精确匹配短语的场景。
  • 例如,搜索 “Easysearch is powerful” 时,只有包含这个确切短语的文档才会被认为是匹配的。
{
  "query": {
    "match_phrase": {
      "content": "Easysearch  is powerful"
    }
  }
}

总结来说,match 更灵活,用于一般的关键词搜索,而 match_phrase 则用于需要精确匹配短语的搜索。

SQL 全文检索示例

我们先造一些数据,然后使用 SQL 来进行全文检索。

批量导入数据:

POST /table3/_bulk
{ "index": { "_id": 1 } }
{ "id": 1, "test": "The quick brown fox jumps over the lazy dog" }
{ "index": { "_id": 2 } }
{ "id": 2, "test": "Foxes are wild animals" }
{ "index": { "_id": 3 } }
{ "id": 3, "test": "Jump high to catch the ball" }
{ "index": { "_id": 4 } }
{ "id": 4, "test": "Some animals can jump very high" }
{ "index": { "_id": 5 } }
{ "id": 5, "test": "The lazy dog sleeps all day" }
{ "index": { "_id": 6 } }
{ "id": 6, "test": "The foxes jump all day" }

执行全文检索的 SQL 查询:

SELECT * FROM table3;

SELECT * FROM table3 WHERE match(test, 'jump');

SELECT * FROM table3 WHERE match_phrase(test, 'foxes jump');

总结

随着数据量的不断增加,高效的数据搜索和分析变得尤为重要。Elasticsearch 以其强大的全文搜索能力和灵活的数据处理能力成为行业标准。Easysearch 作为 Elasticsearch 的优化版本,不仅继承了其强大的功能,还在性能和安全性上做了进一步的提升,为企业提供了一个高效、稳定且易于迁移的搜索引擎解决方案。通过深入了解这些技术和实践其应用,开发者和企业能够更好地利用这些工具来应对现代数据挑战,推动业务的持续发展和创新。

关于 Easysearch 有奖征文活动

黑神话悟空

无论你是 Easysearch 的老用户,还是第一次听说这个名字,只要你对 INFINI Labs 旗下的 Easysearch 产品感兴趣,或者是希望了解 Easysearch,都可以参加这次活动。

详情查看:Easysearch 征文活动

作者:韩旭,亚马逊云技术支持,亚马逊云科技技领云博主,目前专注于云计算开发和大数据领域。

原文:https://infinilabs.cn/blog/2024/mastering-easysearch-syntax/

Easysearch 数据可视化和管理平台:INFINI Console 使用介绍

EasysearchINFINI Labs 小助手 发表了文章 • 0 个评论 • 2084 次浏览 • 2024-07-10 16:26 • 来自相关话题

上次在《INFINI Easysearch 尝鲜 Hands on》中,我们部署了两个节点的 Easysearch,并设置了 Console 进行集群监控。今天,我们将介绍 INFINI Console 的使用。

Dashboard

INFINI Console 是一个功能强大的数据管理和分析平台,其仪表盘页面提供了直观简洁的界面,使用户能够快速了解系统状态并进行管理操作。本文将详细介绍仪表盘页面的各项功能。

仪表盘顶部显示系统的实时告警、通知和待办事项的数量,当前数据显示:

  • 告警:0 条
  • 通知:0 条
  • 待办:0 条

在仪表盘的中心区域,用户可以看到几项关键的系统概览信息:

  • 集群数量:当前有 3 个集群正在运行。
  • 节点数量:系统中有 16 个节点。
  • 主机数量:共有 3 台主机。
  • 已用存储:系统已使用存储空间为 2.0GB。

仪表盘页面还提供了几个常用操作的快速入口,方便用户迅速访问常用功能:

  • 集群注册:用户可以通过此入口快速注册新的集群。
  • 数据探索:用户可以访问数据探索工具,对系统中的数据进行分析和查询。
  • 告警管理:提供对告警信息的管理功能,用户可以查看和处理告警。
  • 安全管理:安全管理入口帮助用户维护系统的安全设置和策略。

仪表盘右侧显示了集群的动态信息,包括最近的操作日志。例如:

  • 2024-07-03 22:43:43,index medcl 在 cluster infiniLabs 中的状态更新。
  • 2024-07-03 22:06:43,index medcl 在 cluster infiniLabs 中被创建。

集群管理页面

集群管理页面主要分为几个部分:顶部的功能选项卡、中部的集群列表、以及右侧的筛选和排序选项。

页面顶部的功能选项卡包括以下几项:

  • Clusters (集群):显示当前系统中的所有集群。
  • Nodes (节点):显示集群中的节点详细信息。
  • Indices (索引):显示集群中的索引信息。
  • Hosts (主机):显示系统中的主机信息。

集群列表展示了每个集群的详细信息,包括:

  • 集群名称:每个集群的名称,如 “infinilabs”、“mycluster”、“INFINI_SYSTEM (JeanGrey)”。
  • 集群健康状态:以颜色条的形式显示最近 14 天的集群健康状态(绿色表示健康,黄色表示有警告)。
  • 节点数量:集群中包含的节点数量。
  • 索引数量:集群中的索引数量。
  • 分片数量:集群中的分片数量。
  • 文档数量:集群中存储的文档数量。
  • 磁盘使用率:集群的磁盘使用情况。
  • JVM 堆内存使用率:集群的 JVM 堆内存使用情况。
  • 索引速率:当前集群的索引速率(每秒索引数)。
  • 搜索速率:当前集群的搜索速率(每秒搜索数)。

页面右侧提供了丰富的筛选和排序选项,可以根据以下条件筛选和排序集群:

  • 健康状态 (Health Status):根据集群的健康状态筛选,如绿色(健康)和黄色(警告)。
  • 分布 (Distribution):根据集群的分布类型筛选,如 “easysearch” 和 “elasticsearch”。
  • 版本 (Version):根据集群使用的软件版本筛选,如 Easysearch 1.8.2 和 Elasticsearch 7.10.2。
  • 区域 (Region):根据集群所在的区域筛选,如 “china” 和 “default”。
  • 标签 (Tags):根据自定义标签进行筛选。

接下来分别介绍节点、索引和主机层面的信息,这些监控指标与集群层面大同小异。

节点监控

索引监控

主机监控

包括了常规的 CPU、内存、磁盘、网络的监控。

监控指标页面

监控报表页面提供了对集群运行状况的详细监控和分析功能。用户可以选择最近 15 分钟、1 小时、24 小时等不同时间范围查看数据,并手动点击刷新按钮更新数据,以获取最新的监控信息。

概览信息

显示当前集群的基本状态,包括:

  • 集群名称:如 “infinilabs”。
  • 在线时长:如 “3 天”。
  • 集群版本:如 “1.8.2”。
  • 健康状态:如 “green”。
  • 节点数:如 “2”。
  • 索引数:如 “38”。
  • 主/总分片:如 “38/76”。
  • 未分配分片:如 “0”。
  • 文档数:如 “656,803”。
  • 存储空间:如 “1007.2MB/385.4GB”。
  • JVM 内存:如 “1023.0MB/2.0GB”。

监控报表页面还提供了多个性能指标的图表,包括:

索引吞吐 (doc/s)

  • Total Indexing:总索引吞吐量。
  • Primary Indexing:主分片的索引吞吐量。

查询吞吐 (query/s)

  • Total Query:总查询吞吐量。

索引延迟 (ms)

  • Indexing Latency:索引延迟时间。
  • Delete Latency:删除操作的延迟时间。

查询延迟 (ms)

  • Query Latency:查询延迟时间。
  • Fetch Latency:获取操作的延迟时间。
  • Scroll Latency:滚动操作的延迟时间。

点击“Advance”可以查看更多监控指标:

节点级别性能监控

包括 CPU、负载、JVM 内存、剩余使用空间及磁盘空间、集群启动时间和索引读写情况。

索引级别监控

包括集群内索引的数量、状态、主分片和副本分片数量、文档条数和占用空间。

集群动态页面

提供集群中各类事件和活动的详细记录和监控功能。

别名管理

别名管理页面提供了对索引别名的管理功能,使用户可以方便地管理和配置 Elasticsearch/EasySearch 的索引别名。

创建别名

可以通过 DSL 创建别名。例如,创建一个名为 my_index_alias 的别名指向 my_index

POST /_aliases
{
  "actions": [
    {
      "add": {
        "index": "my_index",
        "alias": "my_index_alias"
      }
    }
  ]
}

删除别名

删除一个别名同样可以通过 REST API 实现:

POST /_aliases
{
  "actions": [
    {
      "remove": {
        "index": "my_index",
        "alias": "my_index_alias"
      }
    }
  ]
}

索引轮换

索引轮换是一种常用的索引管理策略,特别适用于日志和时间序列数据的场景。通过索引轮换,用户可以在索引达到一定条件(如大小或文档数量)时,创建一个新的索引来继续存储数据,而旧的索引可以继续用于查询。

  1. 设置写别名:创建一个指向当前写入索引的别名,例如 current_write_index。
  2. 定义索引轮换条件:可以基于索引的大小、文档数量或时间来定义轮换条件。
  3. 索引并更新写别名指向这个新索引。

创建初始索引并设置写别名:

PUT /my_index-000001
{
  "aliases": {
    "current_write_index": {}
  }
}

使用 /_rollover API 定义轮换条件并执行轮换:

POST /current_write_index/_rollover
{
  "conditions": {
    "max_age": "7d",
    "max_docs": 1000000
  },
  "settings": {
    "number_of_shards": 1
  },
  "aliases": {
    "current_write_index": {}
  }
}

通过这种方式,查询操作可以透明地访问所有历史数据,而写操作总是指向最新的索引。

在 INFINI Console 中提供了可视化创建索引及别名的方式。页面右上角提供了新建按钮,用户可以通过点击该按钮创建新的索引别名,填写别名名称、关联索引、索引路由、搜索路由和过滤查询等配置。

平台监控

展示了多个关键指标的监控图表,包括:

  • 健康状态 (Health):显示系统当前的健康状态。如果没有数据,则显示“暂无数据”。
  • 引擎分布 (Engines):展示系统中不同搜索引擎的分布情况,例如 EasySearch 和 Elasticsearch 的比例。图表显示当前 EasySearch 占 67%,Elasticsearch 占 33%。
  • 提供商 (Providers):显示系统中使用的云服务提供商信息。在示例中,所有资源都托管在 AWS 上。
  • JDK 版本 (JDK):显示系统中使用的 JDK 版本信息。在示例中,所有节点都使用 JDK 版本 11.0.20。
  • 磁盘使用情况 (Disk Utilization) - Top 10:显示磁盘使用率最高的前 10 个节点。在示例中,easysearch-node1 和 easysearch-node2 的磁盘使用率均为 4%。
  • JVM 使用情况 (JVM Utilization) - Top 10:展示 JVM 使用率最高的前 10 个节点。在示例中,infinilabs 集群的 easysearch-node1 和 easysearch-node2 节点的 JVM 使用情况有详细的时间序列数据,显示了不同时间点的使用率变化。

我们还能够看到更多指标:

数据探索

在数据探索里,可以根据时间、字段等条件对索引或者视图下的数据进行搜索查询和分析,类似 Kibana 的 Discover。

这里可以看到集群的警报,目前集群运行良好,没有任何警报。

内部会预设一些警报规则,如下:

点进去一个请求,比如磁盘的警告,可以针对不同的使用量设置不同的警告级别和通知。

这里针对警报设置警报,可以看到现在支持很多平台,Discord、飞书、邮件、微信、Slack 以及钉钉。

点击进去可以查看,对于社交软件而言,其实是使用 Webhook 进行通知,除此之外也支持配置邮件服务器和自定义的 Webhook 进行通知。

开发工具

Console 的开发工具相当于 Kibana DevTool 的升级版,使用上基本没有大的区别,除了支持 DSL 之外,还支持多集群 Tab 切换、常用命令快速 Load、SQL 查询等。

集群连接凭证管理

可以看到连接这三个集群的凭证管理,目前都是有效的。

后台用户授权

可以添加用户以及修改 Console 管理界面的密码。目前设置了 admin 账号。

审计日志

追踪对集群的操作,捕获查看集群监控信息以及集群索引的操作。

结论

INFINI Console 的仪表盘页面集成了系统的关键信息和快捷操作入口,使用户可以高效地管理和监控系统。通过详细的概览信息、实时的告警通知、快速的功能入口和动态日志,用户能够对系统的运行状态一目了然,并快速响应各种管理需求。这个设计不仅提升了用户的工作效率,还确保了系统的安全和稳定运行。

INFINI Console 的集群管理页面提供了对系统集群的全面监控和管理功能。通过详细的集群信息展示、便捷的功能选项卡切换以及丰富的筛选和排序功能,用户可以高效地管理和监控系统中的集群状态。这不仅提升了运维效率,还确保了系统的稳定运行和高效管理。

INFINI Console 的节点管理页面提供了对集群节点的全面监控和管理功能。通过详细的节点信息展示、便捷的功能选项卡切换以及丰富的筛选和搜索功能,用户可以高效地管理和监控系统中的节点状态,从而提升运维效率,确保系统的稳定运行和高效管理。

INFINI Console 的监控报表页面提供了对集群运行状况的全面监控和分析功能。通过详细的概览信息和多个性能指标图表,用户可以高效地监控和管理集群的运行状态。这不仅提升了系统运维效率,还确保了集群的稳定运行和高效管理。

通过这些功能,INFINI Console 为用户提供了全面的系统管理工具,帮助他们高效地应对各种运维挑战,确保系统的高效、安全、稳定运行。

关于 Easysearch 有奖征文活动

黑神话悟空

无论你是 Easysearch 的老用户,还是第一次听说这个名字,只要你对 INFINI Labs 旗下的 Easysearch 产品感兴趣,或者是希望了解 Easysearch,都可以参加这次活动。

详情查看:Easysearch 征文活动

作者:韩旭,亚马逊云技术支持,亚马逊云科技技领云博主,目前专注于云计算开发和大数据领域。

原文:https://blog.csdn.net/weixin_38781498/article/details/140077785

INFINI Easysearch 尝鲜 Hands on

EasysearchINFINI Labs 小助手 发表了文章 • 0 个评论 • 1971 次浏览 • 2024-07-10 14:43 • 来自相关话题

INFINI Easysearch 是一个分布式的近实时搜索与分析引擎,核心引擎基于开源的 Apache Lucene。Easysearch 的目标是提供一个自主可控的轻量级的 Elasticsearch 可替代版本,并继续完善和支持更多的企业级功能。与 Elasticsearch 相比,Easysearch 更关注在搜索业务场景的优化和继续保持其产品的简洁与易用性。

Easysearch 支持原生 Elasticsearch 的 DSL 查询语法,确保原业务代码无需调整即可无缝迁移。同时,极限科技还支持 SQL 查询,为熟悉 SQL 的开发人员提供更加便捷的数据分析方式。此外,Easysearch 兼容 Elasticsearch 的 SDK 和现有索引存储格式,支持冷热架构和索引生命周期管理,确保用户能够轻松实现数据的无缝衔接。

安装

安装脚本

无论是 Linux 还是 Mac 都是这个一键脚本

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

同时也提供了二进制的安装包:

如果不想整理 JAVA 环境问题,还可以使用这个 https://release.infinilabs.com/easysearch/stable/bundle/

docker 部署

官方提供了 Docker Compose 样例,包括三个服务:

  • easysearch-node1
  • easysearch-node2
  • console

以下是详细说明:

版本控制:

  • version: '3' 表示使用 Docker Compose 文件的第 3 版格式。

服务定义:

  • easysearch-node1 和 easysearch-node2:

    • 这两个服务使用相同的 Docker 镜像 infinilabs/easysearch:latest 来组成双节点的集群。
    • 容器运行时使用用户和组 ID 602:602。
    • 设置了 ES_JAVA_OPTS 环境变量以配置 Java 虚拟机的内存。
    • ulimits 选项配置了内存锁定和文件描述符的限制,以提升性能。
    • 容器内的配置、数据和日志目录通过卷映射到主机目录中,以便于数据持久化。
    • 服务暴露特定端口,使外部能够访问容器中的服务。
    • 两个节点均加入名为 esnet 的自定义网络中。
  • console:

    • 该服务使用镜像 infinilabs/console:1.26.0-1552(该镜像没有 latest,需要手动把 latest 更改位特定的版本号)。
    • 同样通过卷将数据和日志目录映射到主机。
    • 暴露 9000 端口用于 Web 界面访问。
    • 使用 links 功能链接到 easysearch-node1 和 easysearch-node2,简化容器之间的通信。
    • 设置了时区环境变量 TZ 为 Asia/Shanghai。

网络配置:

  • esnet 网络使用 bridge 驱动,提供一个隔离的网络环境,配置了特定的子网 172.24.0.0/16,以确保服务之间的网络通信。
version: '3'
  services:
    easysearch-node1:
      user: "602:602"
      image: infinilabs/easysearch:latest
      container_name: easysearch-node1
      hostname: easysearch-node1
      environment:
        - "ES_JAVA_OPTS=-Xms1g -Xmx1g"
      ulimits:
        memlock:
          soft: -1
          hard: -1
        nofile:
          soft: 65536
          hard: 65536
      volumes:
        - $PWD/ezs1/config:/app/easysearch/config
        - $PWD/ezs1/data:/app/easysearch/data
        - $PWD/ezs1/logs:/app/easysearch/logs
      ports:
        - 9201:9200
        - 9301:9300
      networks:
        - esnet
    easysearch-node2:
      user: "602:602"
      image: infinilabs/easysearch:latest
      container_name: easysearch-node2
      hostname: easysearch-node2
      environment:
        - "ES_JAVA_OPTS=-Xms1g -Xmx1g"
      ulimits:
        memlock:
          soft: -1
          hard: -1
        nofile:
          soft: 65536
          hard: 65536
      volumes:
        - $PWD/ezs2/config:/app/easysearch/config
        - $PWD/ezs2/data:/app/easysearch/data
        - $PWD/ezs2/logs:/app/easysearch/logs
      ports:
        - 9202:9200
        - 9302:9300
      networks:
        - esnet
    console:
      image: infinilabs/console:1.26.0-1552
      container_name: console
      hostname: console
      volumes:
        - $PWD/console/data:/data
        - $PWD/console/log:/log
      networks:
        - esnet
      ports:
        - 9000:9000
      links:
        - easysearch-node1:es1
        - easysearch-node2:es2
      environment:
        - TZ=Asia/Shanghai

  networks:
    esnet:
      driver: bridge
      ipam:
        config:
          - subnet: 172.24.0.0/16

尽管在这里官方提供了详细的命令,完全可以使用这个 docker-compose up 来进行替代。其他的脚本解释如下:

init.sh

#!/bin/bash

# 获取当前脚本所在目录的绝对路径

CUR_DIR=$(cd $(dirname $0); pwd)

# 创建必要的目录结构

mkdir -p $CUR_DIR/console/{data,log}
mkdir -p $CUR_DIR/{ezs1,ezs2}/{data,logs}

# 设置目录的拥有者和权限

chown -R 1000:1000 $CUR_DIR/console
chown -R 602:602 $CUR_DIR/{ezs1,ezs2}
chmod -R 0600 $CUR_DIR/{ezs1,ezs2}/config

# 设置 config 目录的子目录权限

find $CUR_DIR/{ezs1,ezs2}/config -type d -print0 | xargs -0 chmod 750

reset.sh

#!/bin/bash

# 获取当前脚本所在目录的绝对路径

CUR_DIR=$(cd $(dirname $0); pwd)

# 定义确认函数
function confirm() {
  display_str=$1
  default_ans=$2
  if [[ $default_ans == 'y/N' ]]; then
     must_match='[yY]'
  else
     must_match='[nN]'
  fi
  read -p"${display_str} [${default_ans}]:" ans
  [[ $ans == $must_match ]]
}

# 提示用户确认删除所有数据
confirm "RISK WARN: Delete all data!!!" 'y/N' && echo || exit

# 删除 console、ezs1 和 ezs2 的数据和日志文件
rm -rvf $CUR_DIR/console/{data,log}/*
rm -rvf $CUR_DIR/{ezs1,ezs2}/{data,logs}/*

start.sh

#!/bin/bash

# 使用 Docker Compose 启动 ezs2 项目中的服务
docker-compose -p ezs2 up

stop.sh

#!/bin/bash

# 使用 Docker Compose 关闭并移除 ezs2 项目中的所有服务

docker-compose -p ezs2 down

在我的电脑中,可以看到成功启动的容器。

https://infinilabs.cn/docs/latest/easysearch/getting-started/install/docker-compose/

Console 连接

设置集群连接参数,比如域名端口,用户名密码。

初始化,这里会新建索引,写一些 sample 数据。

设置后台管理的密码,后期使用这个登录控制台。

检查配置,完成集群关联。

这个是后台管理界面,除了用户名密码之外,也支持单点登录:

跨引擎、跨版本、跨集群 独一份!

使用自带的面板进行查看节点数量:

同时也支持 REST 风格的 API 来进行查询。

接下来使用 Console 连接 Amazon 的 OpenSearch:

同样是输入集群的 URL,用户名和密码。

然后可以拿到集群的信息,比如地址,版本号,集群状态,节点数量。

最后看到连接成功的信息。

我们可以在集群管理中看到 Easysearch 的集群和我们刚刚添加的 OpenSearch 集群。

是否开源?目前还没有开放源代码。

关于 Easysearch 有奖征文活动

黑神话悟空

无论你是 Easysearch 的老用户,还是第一次听说这个名字,只要你对 INFINI Labs 旗下的 Easysearch 产品感兴趣,或者是希望了解 Easysearch,都可以参加这次活动。

详情查看:Easysearch 征文活动

作者:韩旭,亚马逊云技术支持,亚马逊云科技技领云博主,目前专注于云计算开发和大数据领域。

原文:https://blog.csdn.net/weixin_38781498/article/details/140077785

【搜索客社区日报】第1854期 (2024-07-08)

社区日报searchkit 发表了文章 • 0 个评论 • 1988 次浏览 • 2024-07-08 20:33 • 来自相关话题

1. Easysearch 数据可视化和管理平台:INFINI Console 使用介绍 | 征文系列 https://mp.weixin.qq.com/s/4JuN2xFLv8nrtbBiRG3-kw 2. 认识新的 Google AI 助手 Gemini https://www.sqlservercentral.c ... emini 3. 理解和实施 Medprompt https://towardsdatascience.com ... 77c91 4. 人工智能中的性别偏见简介 https://thegradient.pub/gender-bias-in-ai/ 5. GraphRAG:用于复杂数据发现的新工具现已在 GitHub 上发布 https://www.microsoft.com/en-u ... thub/ 编辑:Muse  更多资讯:http://news.searchkit.cn

【搜索客社区日报】第1853期 (2024-07-05)

社区日报Fred2000 发表了文章 • 0 个评论 • 1805 次浏览 • 2024-07-05 09:26 • 来自相关话题

Gitee 两大指标超越 GitHub,携手中国开源共绘新篇章 https://mp.weixin.qq.com/s/J92AOb9HGQDb4FqqJUPGhQ 前沿重器[51] | 聊聊搜索系统4:query理解 https://mp.weixin.qq.com/s/R4njGbiz_yT0wqN4by0uDg Elasticsearch 是什么?工作原理是怎么样的? https://mp.weixin.qq.com/s/UXzFg6LbHCifeObiLsXAMA INFINI Easysearch 尝鲜 Hands on https://mp.weixin.qq.com/s/OLdD3KkgXK5Q4e2RDzMD8Q 编辑:Fred  更多资讯:http://news.searchkit.cn
Gitee 两大指标超越 GitHub,携手中国开源共绘新篇章 https://mp.weixin.qq.com/s/J92AOb9HGQDb4FqqJUPGhQ 前沿重器[51] | 聊聊搜索系统4:query理解 https://mp.weixin.qq.com/s/R4njGbiz_yT0wqN4by0uDg Elasticsearch 是什么?工作原理是怎么样的? https://mp.weixin.qq.com/s/UXzFg6LbHCifeObiLsXAMA INFINI Easysearch 尝鲜 Hands on https://mp.weixin.qq.com/s/OLdD3KkgXK5Q4e2RDzMD8Q 编辑:Fred  更多资讯:http://news.searchkit.cn

搜索型数据库的技术发展历程与趋势前瞻

资讯动态INFINI Labs 小助手 发表了文章 • 0 个评论 • 1926 次浏览 • 2024-06-26 13:13 • 来自相关话题

概述

随着数字科技的飞速发展和信息量的爆炸性增长,搜索引擎已成为我们获取信息的首选途径之一,典型的代表厂商如 Google。然而,随着用户需求的不断演变,传统的搜索技术已经无法满足人们对信息的实时性、个性化和多样性的需求。

在企业内部,这种需求更加显著。随着企业数字化转型的持续深化,非结构化数据正日益成为各类组织数据增长的主要来源,也是数据体系中至关重要的组成部分,蕴含着巨大的价值。如何高效地存储和利用非结构化数据的重要性也日益凸显。企业需要更高效地管理和检索内部的海量数据,以支持业务决策和运营需求。

据 IDC 数据预计,到 2025 年,80%的数据将是非结构化数据;而根据 Gartner 的数据显示,从 2019 年到 2024 年,非结构化数据容量预计将增加两倍。然而,目前非结构化数据面临着表现形式多样、管理复杂性高、价值挖掘难度大等诸多挑战。传统的数据库系统往往无法满足企业对实时性和多样性的搜索需求,为了解决这些挑战,以自动分词、倒排索引、相关度计算、向量检索引擎等技术为核心构建的搜索型数据库应运而生。这些数据库自上世纪 90 年代诞生以来不断发展演进,正在成为数据库领域中不可或缺的一个重要分支。

什么是搜索型数据库?

搜索型数据库早期又称全文数据库,或者企业搜索引擎,是一种专门用于存储和管理大规模文本数据,并支持高效的文本搜索和信息检索的数据库系统,不过随着技术不断发展和应用场景日益丰富,目前搜索型数据库不仅仅可以处理长文本数据,也可以处理常见的数值、日期等结构化数据,IP、地理位置信息、图片、音视频等非结构化数据,搜索型数据库的应用范畴不断拓展,正在由支撑业务系统检索加速、IT 运维可观测性、聚合查询分析等向多场景、多模态数据搜索方向发展。

典型的搜索数据库一般具有以下特点:

  1. 灵活的索引能力:搜索数据库能够处理多种类型的数据,包括文本、图像、音频、视频等非结构化数据。它们采用自动分词、倒排索引等技术,能够高效地处理不同格式和类型的数据,提供灵活的搜索和检索功能。
  2. 高效的查询性能:搜索数据库具有高效的查询处理能力,能够快速索引和检索大规模的数据。借助优化的索引结构和查询算法,搜索数据库能够在短时间内准确地返回与查询相关的结果,提高用户的搜索效率,常用于解决关系型数据库的高并发检索需求。
  3. 支持复杂的搜索功能:搜索数据库提供多样化的搜索功能,包括全文检索、模糊搜索、精确搜索、范围搜索、向量搜索、地理信息检索等。用户可以根据不同的需求和场景,灵活地选择和组合不同的搜索功能,以获取符合期望的搜索结果。
  4. 高性能和可扩展性:搜索数据库具有高性能和可扩展性的特点,能够处理大规模数据和高并发访问。它们采用分布式架构和并行计算技术,实现了水平扩展,能够满足不断增长的数据量和用户访问量的需求。

综上所述,搜索数据库具有处理非结构化数据、实时搜索和更新、多样化的搜索功能、个性化推荐和智能搜索、高性能和可扩展性、全面的搜索结果展示等特点,是处理大规模数据和提供高效搜索服务的重要工具。

搜索型数据库的应用场景

搜索型数据库在各行各业都有广泛的应用,以下是一些典型的应用场景:

  1. 零售和电商:在零售和电商行业,搜索型数据库被广泛应用于产品搜索和推荐系统中。通过搜索功能,顾客可以轻松查找所需商品,而个性化推荐系统则可以根据用户的搜索历史和行为习惯推荐相关的产品,提高购物体验和交易转化率。
  2. 医疗保健:在医疗保健行业,搜索型数据库被用于医学文献检索、疾病诊断和药物搜索等方面。医生和研究人员可以利用搜索功能找到相关的医学文献和研究成果,帮助诊断疾病和制定治疗方案。
  3. 金融服务:在金融服务行业,搜索型数据库被用于金融数据检索、市场分析和投资决策等方面。投资者可以通过搜索功能查找相关的金融数据和市场资讯,帮助他们做出更加准确的投资决策。
  4. 制造业:在制造业中,搜索型数据库被用于生产过程监控、质量控制和故障诊断等方面。工程师可以利用搜索功能查找相关的生产数据和技术资料,帮助他们解决生产中的问题和挑战。
  5. 媒体和娱乐:在媒体和娱乐行业,搜索型数据库被用于内容检索、版权管理和用户推荐等方面。用户可以通过搜索功能查找感兴趣的新闻、音乐和视频等内容,而个性化推荐系统则可以根据用户的搜索历史和偏好推荐相关的内容。
  6. 教育和培训:在教育和培训行业,搜索型数据库被用于学习资源检索、课程管理和学习分析等方面。学生和教师可以利用搜索功能查找相关的学习资源和课程内容,而学习分析系统则可以分析学生的搜索行为和学习表现,为教学提供参考和支持。
  7. IT 运维可观测性:通过搜索型数据库,可以实时监控系统的运行状况、性能指标和日志数据,帮助运维团队及时发现和解决系统故障、性能问题和异常情况,确保系统的稳定运行。
  8. 安全监测和威胁检测:利用搜索型数据库对系统的安全日志进行审计和监控,监测用户的访问行为和系统操作,及时发现异常行为和安全事件。同时,搜索型数据库还可以与威胁情报数据集成,对内部日志数据进行关联分析,快速识别并应对各种安全威胁和攻击行为,保障系统和数据的安全。

综上所述,搜索型数据库在各行各业都发挥着重要作用,数据规模从 GB 到 PB 不等,体现在生活中的方方面面,为用户提供了高效、准确和个性化的信息搜索和检索服务,推动了各行业的发展和进步。随着搜索技术的不断创新和发展,搜索型数据库在各行业中的应用将会越来越广泛,并持续为用户带来更加便捷和智能的搜索体验。

搜索型数据库的发展历程

搜索型数据库的发展历程可以概括如下四个阶段:

  1. 起步阶段(1990 年代):搜索数据库的雏形开始于上世纪 90 年代,当时以全文检索为主要技术手段,最初用于文档检索和网络搜索。典型代表包括 AltaVista、Excite 等。
  2. 技术突破(2000 年代):随着互联网的快速发展,搜索数据库开始应用于更多领域,如电子商务、社交网络等。Lucene、Sphinx 等开源搜索引擎的出现推动了搜索技术的进步。
  3. 商业化发展(2010 年代):搜索数据库进入商业化阶段,以 Elasticsearch 等为代表的商业搜索引擎崭露头角。企业开始大规模应用搜索数据库来管理和检索大量数据。
  4. 智能化转型(2020 年代):随着人工智能技术的发展,搜索数据库逐渐向智能化转型,开始引入机器学习、自然语言处理等技术,提供个性化推荐和智能搜索服务。同时,搜索数据库也在更多领域得到应用,如医疗保健、金融服务等。

    综上所述,搜索数据库经历了从起步阶段到技术突破、商业化发展再到智能化转型的发展历程,表明了其在信息检索领域的重要性和不断演进的趋势,不并断推动着搜索技术的进步和应用范围的扩展。随着人工智能技术的不断成熟,搜索数据库将会在智能化、个性化等方面取得更大的进步,为用户提供更加优质的搜索体验。

搜索型数据库的发展情况

搜索型数据库市场上已经有不少成熟的产品和厂商,但是总的来说,搜索型数据库的界限范围有点模糊,当然其他数据库也有同样的问题,有很多数据库既是文档数据库,又是多模态数据库,还是向量数据库等等,而常见的搜索型数据库主要诞生于:

  • 由搜索引擎内核库发展而来的搜索数据库,如 Elasticsearch
  • 由其他数据库扩展而来的搜索数据库,如 Postgres Full-Text Search
  • 从零开始整体设计的搜索数据库:如 INFINI Pizza

通过流行的 DB-Engines 的搜索引擎排行榜,可以初探国外主流的搜索型数据库的流行趋势,如下图:

可以看到 Elastic 公司的 Elasticsearch 还是依旧保持强悍,自从 Elasticsearch 十多年前掀翻了 Splunk 的桌子,硬生生的在日志领域杀出一条新路,随后大杀四方,碾压整个搜索行业,霸榜至今。Elastic 商业化增长稳健,2023 年收入超过 10 亿美金。

OpenSearch 是由 AWS 发起的 Elasticsearch 开源分支,起因是由于 Elastic 针对云厂商采取的协议变更为 Elastic+SSPL,OpenSearch 基于 Apache 2.0 协议的 Elasticsearch 7.10 版本衍生而来,目前也具备了一定的用户基础。

Splunk 是一款用于搜索、监控和分析大规模机器生成的数据的软件平台,主要用于日志和安全分析领域,属于商业闭源产品。2023 年中被思科(Cisco) 以 230 亿美元现金收购,瞬间刷爆朋友圈。另外有意思的是,前四名除了 Splunk,底层都是 Lucene 内核。

MarkLogic 成立于 2001 年,自我定位是一个 NoSQL 多模态数据库厂商,也是商业闭源软件,生态成熟但是系统过于复杂,学习曲线较陡, 2023 年初被 Progress Software 以 3.55 亿美元收购算是一个比较好的结局。

当然了,除了榜上的这些产品,还有很多优秀的挑战者正摩拳擦掌,跃跃欲试。如下面的这些项目: vespa、Rockset、Doris,Clickhouse、quickwit、Pinot、SingleStore、qdrant、milvus、algolia、meilisearch、typesense、Manticore Search 等等。这些项目不一定都是自己定位是搜索型数据库,有侧重在 AI 领域的,有侧重在实时分析领域的等等,可谓各有千秋,不过都具备一定的搜索和分析能力,不出意外,基本上每家都要号称吊打 Elasticsearch 一番。

国内搜索型数据库的发展情况

搜索型数据库已经成为企业事实上的重要基础设施,而国内搜索型数据库的发展近些年也是开始得到重视,2023 年初,由中国信通院云计算与大数据研究所牵头,依托中国通信标准化协会大数据技术标准推进委员会,联合拓尔思、极限科技、星环科技等 30 余家企业编制的《搜索型数据库技术要求》正式出炉,该标准已成为行业内搜索型数据库技术选型和产品开发的风向标,极限科技的 INFINI Easysearch 率先通过了该标准

墨天轮社区也开辟了搜索型数据库的排行榜,共有 6 家企业的产品上榜:

国内搜索型数据库的市场还在起步阶段,厂商和可选的产品也还比较少,不过随着市场的成熟,相信未来将迎来一波高速的发展。

搜索型数据库的趋势前瞻

技术在演变,场景在演变,数据也在演变,搜索数据库领域的发展也呈现出多个显著的趋势,这些趋势将进一步推动搜索技术的演进和应用范围的扩展。笔者观测到的主要的发展趋势包括以下方向供参考:

1. 趋势一:实时搜索与分析

  • 实时搜索是搜索数据库领域的一个重要发展趋势,业务应用都在朝实时方向演进,用户对信息的即时性需求不断增加,要求搜索结果能够及时反映最新的数据和内容。

  • 实时搜索技术通过实时索引和实时更新机制,能够实现快速的数据检索和更新,提供与时俱进的搜索结果,满足用户对信息的即时性需求。

  • 目前以 Lucene 为内核的搜索型数据库基本上都只能做到 NRT(近实时)搜索,并且频繁更新带来的挑战和资源的浪费比较高,如果能做到更高效的实时性,可以大大提升用户的搜索体验和实时决策能力。

2. 趋势二:多模态混合搜索

  • 多模态搜索是指在搜索过程中同时考虑多种信息形式,如文本、图像、视频等,以提高搜索结果的准确性和全面性。

  • 这种技术能够通过分析和理解多种信息形式之间的关联性,为用户提供更加全面、丰富的搜索结果,适用于需要综合不同媒体形式的搜索场景。

  • 现实世界的数据越来越复杂化,非结构化数据的利用的场景也越来越多,多模态可以为业务提供更加灵活的分析和探索能力,混合搜索的能力非常具有吸引力。

3. 趋势三:AI 智能语义搜索

  • 大模型、AI 智能搜索技术的探索可谓是一日千里,通过利用人工智能技术来实现搜索过程中的智能化、语义化和个性化,结合自然语言处理、机器学习等技术分析用户意图,提供更加智能、个性化的搜索服务。

  • 随着大模型的兴起,搜索数据库开始采用像 RAG(Retriever-Reader for Generative Question Answering)这样的大型预训练模型来提升搜索的效果。RAG 模型结合了检索器和阅读器的功能,能够实现更加准确和全面的搜索结果,为用户提供更加智能和个性化的搜索服务。

  • 搜索型数据库可谓是 AI 落地最好的是试验田,Elasticsearch 通过拥抱 AI 和大模型,目前股价又重回巅峰,可喜可贺。

4. 趋势四:云原生、存算分离、Serverless

  • 随着云计算技术的发展,搜索数据库正逐渐向云原生架构转变。云原生搜索数据库利用容器化、微服务架构等技术,实现了更高的灵活性、可扩展性和容错性,为企业提供了更加稳定和高效的搜索服务,并且成本更低,更加弹性。

  • 存算分离是搜索数据库发展的另一重要趋势。通过将存储与计算分离,搜索数据库可以更好地适应数据存储和计算需求的变化,提高系统的性能和效率。存算分离技术使得搜索数据库能够实现更高的并发访问和更快的数据处理速度,为用户提供更加流畅和稳定的搜索体验。

  • Serverless 提供开箱即用的体验,成本更低,使用更加灵活,也是目前很多搜索服务提供商正在积极探索的方向。

5. 趋势五:增强现实搜索

  • 随着增强现实技术的发展,尤其是 Apple 发布的头戴式 Vision Pro,一部革命性的空间运算设备,将数位内容无缝融入实体世界,而搜索技术也将逐渐与增强现实相结合,为用户提供更加直观和沉浸式的搜索体验。增强现实搜索能够将搜索结果与现实世界相结合,结合 AI 技术为用户提供更加个性化和便捷的搜索服务,这是一个全新的领域,也意味着巨大的机会。

6. 趋势六:现代硬件的高效利用

  • 现代硬件及软件运行环境已发生翻天覆地的变化, 片上计算,边缘计算,FPGA,DPU,GPU,一台设备几百核上 TB 内存已经成为现实,可运行之上的软件却还是停留在几十年前的架构。 如 Elasticsearch 其核心 Lucene(及类似实现) 是在 1997 建立的,距今已有 27 年了,虽然也在与时俱进,但是部分架构和设计理念已不具备先进性。

  • 在现代的硬件上采用更先进的算法,更新的数据结构、更新的设计理论,利用最新的 CPU 指令集,向量化,批处理,充分发挥多核、大内存和 SSD 的优势,从而达到更高的效率,更低的成本,去解决之前不可能实现的问题,大有可为,也是下一代引擎需要关注的方向。

随着各类数据库功能的边界越来越模糊,应用场景高度交叉重叠,市场竞争也变得白热化,不过笔者认为垂直领域的搜索型数据库机会还是很大,而想做大而全的数据库产品已经没有太多的市场生存空间,一定要在垂直领域有特别专注的地方,我们 INFINI Labs 正在基于 Rust 研发的下一代搜索引擎 INFINI Pizza,就侧重于面向终端用户场景,解决海量数据更新情况下,同时满足高并发和低延迟的核心业务实时检索需求。

总结

综上所述,搜索数据库领域正处于快速发展的阶段。随着互联网数据量的不断增长和用户需求的不断变化,搜索数据库技术将不断创新和进步,以满足用户对信息获取的更加即时、个性化和多样化的需求。未来,随着人工智能技术的进一步发展和应用,搜索数据库将会变得更加智能化、普及化和多样化,为用户提供更加高效、准确和个性化的搜索服务,推动互联网信息的更加便捷获取和利用。

关于极限科技(INFINI Labs)

INFINI Labs

极限科技,全称极限数据(北京)科技有限公司,是一家专注于实时搜索与数据分析的软件公司。旗下品牌极限实验室(INFINI Labs)致力于打造极致易用的数据探索与分析体验。

极限科技是一支年轻的团队,采用天然分布式的方式来进行远程协作,员工分布在全球各地,希望通过努力成为中国乃至全球企业大数据实时搜索分析产品的首选,为中国技术品牌输出添砖加瓦。

官网:https://infinilabs.cn

联系我们

原文:https://infinilabs.cn/blog/2024/the-technological-development-and-future-trends-of-search-oriented-databases/

【搜索客社区日报】第1843期 (2024-06-21)

社区日报Fred2000 发表了文章 • 0 个评论 • 1762 次浏览 • 2024-06-22 23:57 • 来自相关话题

1、一文带你搞清楚AI领域的高频术语!RAG、Agent、知识库、向量数据库、知识图谱、Prompt...都是在讲啥? https://mp.weixin.qq.com/s/HjvPTPdkBvqJrpomDvZjRg 2、Elasticsearch 的基数统计在大数据量下有什么办法能做到 100% 准确度吗? https://mp.weixin.qq.com/s/iVqIKAwFFKEOkw5bL3QfGA 3、How AI Will Change the World of Search https://opster.com/blogs/how-a ... arch/ 4、INFINI Labs 推出开源项目与教育机构免费许可证计划,可申请 Easysearch 等产品企业版。 https://infinilabs.cn/community/ 编辑:Fred  更多资讯:http://news.searchkit.cn
1、一文带你搞清楚AI领域的高频术语!RAG、Agent、知识库、向量数据库、知识图谱、Prompt...都是在讲啥? https://mp.weixin.qq.com/s/HjvPTPdkBvqJrpomDvZjRg 2、Elasticsearch 的基数统计在大数据量下有什么办法能做到 100% 准确度吗? https://mp.weixin.qq.com/s/iVqIKAwFFKEOkw5bL3QfGA 3、How AI Will Change the World of Search https://opster.com/blogs/how-a ... arch/ 4、INFINI Labs 推出开源项目与教育机构免费许可证计划,可申请 Easysearch 等产品企业版。 https://infinilabs.cn/community/ 编辑:Fred  更多资讯:http://news.searchkit.cn

INFINI Labs 助力开源与教育:免费许可证计划全面升级

开源项目INFINI Labs 小助手 发表了文章 • 0 个评论 • 2040 次浏览 • 2024-06-19 17:21 • 来自相关话题

免费许可证计划

在数字化浪潮席卷全球的今天,INFINI Labs 深刻认识到开源项目和教育机构在技术创新与人才培养中的核心作用。因此,我们郑重推出全新升级的免费许可证计划,旨在全球范围内为开源社区和教育界提供有力支持,共同推动软件生态的繁荣与进步。

一、产品实力与荣誉

1.INFINI Pizza:实时搜索的新纪元

INFINI Pizza

  • 第十三届“数据技术嘉年华”(DTC2024)上,INFINI Labs 发布了划时代的搜索引擎——INFINI Pizza,标志着搜索型数据库迈入实时搜索的新纪元。
  • INFINI Pizza 凭借先进的设计理念与架构,以及独有的专利技术,实现了对海量数据的无限伸缩,提供高效、准确的实时数据搜索能力

2.行业标杆案例

  • INFINI Labs 荣获中国信通院大数据“星河”标杆案例,其中移动云搜索数据库案例更是荣选为数据库标杆案例。
  • 该案例基于移动云 Easysearch 数据库,通过创新的多集群协同模式,实现了数据高性能存取,展现出极高的经济价值与社会价值。

3.国家发明专利认可

  • INFINI Labs 的多项自主研发技术获得国家发明专利授权,这些成果彰显了公司在大数据领域的技术实力与创新精神。

二、品牌与行业地位

  • INFINI Labs 作为搜索型数据库产品领域的领军企业,积极参与行业标准的制定与推动。

  • 其核心产品 INFINI Easysearch 荣获信通院首批可信搜索型数据库产品证书,再次印证了公司在行业中的领先地位。

三、产品介绍

Products

  1. INFINI Easysearch:作为 Elasticsearch 的国产化替代方案,提供高度兼容性与卓越性能,满足企业级需求。

  2. INFINI Console:轻量级多集群、跨版本搜索基础设施统一管控平台,助力企业高效管理搜索集群。

  3. INFINI Gateway:专为 Elasticsearch 打造的高性能应用网关,提供丰富的功能特性与卓越性能。

  4. INFINI Loadgen:支持多种搜索引擎的轻量级压测工具,为企业提供强大的数据加载与测试能力。

  5. INFINI Pizza:引领实时搜索时代的新星,为企业提供高效、准确的实时数据搜索解决方案。

四、免费许可证计划

1.教育机构学术许可证

  • 面向全球公立或私立学校、职业学校、大学等教育机构,提供非商业用途的软件使用许可。

  • 有效期一年,符合条件的教育机构可继续申请。

2.开源项目许可证

  • 面向非商业开源项目开发者,要求项目拥有活跃社区并在其官网添加 INFINI Labs 的链接。

  • 许可证免费,有效期一年,符合条件的项目可继续申请。

五、申请方式

符合条件的开源项目和教育机构可通过访问 INFINI Labs 官方网站,轻松提交申请,我们将尽快审核并回复。

申请链接:https://infinilabs.cn/community

六、结语

INFINI Labs 以全新升级的免费许可证计划为契机,与全球开源社区和教育界携手合作,共同推动软件生态的创新与发展。让我们共同迎接更加美好的未来!

七、关于极限科技(INFINI Labs)

INFINI Labs

极限科技,全称极限数据(北京)科技有限公司,是一家专注于实时搜索与数据分析的软件公司。旗下品牌极限实验室(INFINI Labs)致力于打造极致易用的数据探索与分析体验。

极限科技是一支年轻的团队,采用天然分布式的方式来进行远程协作,员工分布在全球各地,希望通过努力成为中国乃至全球企业大数据实时搜索分析产品的首选,为中国技术品牌输出添砖加瓦。

官网:https://www.infinilabs.cn

联系我们

原文:https://infinilabs.cn/blog/2024/infini-labs-for-open-source-education-the-free-license-program-upgrades/

INFINI Labs 产品更新 | Easysearch 1.8.2 发布优化 CCR 性能

Easysearchliaosy 发表了文章 • 0 个评论 • 2191 次浏览 • 2024-06-09 12:52 • 来自相关话题

release

INFINI Labs 产品又更新啦~,包括 Easysearch v1.8.2、Gateway、Console、Agent、Loadgen v1.26.0。本次各产品更新了很多亮点功能,如 Easysearch 优化 CCR 同步性能;Gateway 增加了 HTTP 请求动态域名路由功能,移除了安全相关的 Filter,进一步提升 Gateway 稳定性;Console 修复了多个已知问题,如当文档数过亿时单位换算错误,修复了因采集延迟导致指标图表显示异常,修复了多行查询中包含 SQL 查询异常等问题。欢迎大家下载体验。

以下是本次更新的详细说明。

INFINI Easysearch v1.8.2

INFINI Easysearch 是一个分布式的近实时搜索与分析引擎,核心引擎基于开源的 Apache Lucene。Easysearch 的目标是提供一个轻量级的 Elasticsearch 可替代版本,并继续完善和支持更多的企业级功能。

Easysearch 本次更新如下:

Bug fix

  • 修复 source_reuse 与 object 字段为 enable: false 时的冲突

Improvements

  • 升级部分依赖包版本,Commons-collections to 3.2.2, Snakeyaml to 2.0
  • 优化 CCR 同步性能及调整 CCR 全局配置参数
  • 优化插件配置命名,去除"plugins."
  • 优化配置文件目录获取命名

INFINI Console v1.26.0

INFINI Console 是一款非常轻量级的多集群、跨版本的搜索基础设施统一管控平台。通过对流行的搜索引擎基础设施进行跨版本、多集群的集中纳管, 企业可以快速方便的统一管理企业内部的不同版本的多套搜索集群。

Console 在线体验: http://demo.infini.cloud (用户名/密码:readonly/readonly)。

Console 本次更新如下:

Bug fix

  • 修复监控数据布局
  • 修复命令存储权限
  • 修复多行请求包含 SQL 语法
  • 修复文档数过亿时换算错误
  • 修复导入低版本 v1.6.0 告警规则缺少字段问题
  • 修复当 buck_size 小于 60 秒时,因指标采集延迟导致指标显示异常问题

INFINI Gateway v1.26.0

INFINI Gateway 是一个面向搜索场景的高性能数据网关,所有请求都经过网关处理后再转发到后端的搜索业务集群。基于 INFINI Gateway 可以实现索引级别的限速限流、常见查询的缓存加速、查询请求的审计、查询结果的动态修改等等。

Gateway 本次更新如下:

Improvements

  • feat: add wildcard_domain filter
  • chore: remove security filter and translog_viewer

INFINI Framework

INFINI Framework 是 INFINI Labs 各产品依赖的内部核心公共代码库。

Framework 本次更新如下:

Improvements

  • feat: support dynamic app setting
  • feat: add cluster settings query args
  • feat: add gateway config
  • feat: add http interceptor
  • feat: return host info in info api
  • feat: add util to convert string to float
  • feat: use common app setting api to instead of auth setting api
  • feat: crontab task support multi crontab expression
  • fix: skip submit empty bulk requests
  • feat: support ccr api
  • fix: get latest offset should compare segment first
  • fix: wrong use of zstd with vfs
  • fix: prevent close closed channel
  • fix: panic on error while saving keystore

期待反馈

欢迎下载体验使用,如果您在使用过程中遇到如何疑问或者问题,欢迎前往 INFINI Labs Github(https://github.com/infinilabs) 中的对应项目中提交 Feature Request 或提交 Bug。

您还可以通过邮件联系我们:hello@infini.ltd

或者拨打我们的热线电话:(+86) 400-139-9200

欢迎加入 Discord 聊天室:https://discord.gg/4tKTMkkvVX

也欢迎大家微信扫码添加小助手(INFINI-Labs),加入用户群一起讨论交流。

联系我们

关于极限科技(INFINI Labs)

INFINI Labs

极限科技,全称极限数据(北京)科技有限公司,是一家专注于实时搜索与数据分析的软件公司。旗下品牌极限实验室(INFINI Labs)致力于打造极致易用的数据探索与分析体验。

极限科技是一支年轻的团队,采用天然分布式的方式来进行远程协作,员工分布在全球各地,希望通过努力成为中国乃至全球企业大数据实时搜索分析产品的首选,为中国技术品牌输出添砖加瓦。

官网:https://www.infinilabs.cn

从 Redis 开源协议变更到 ES 国产化:一次技术自主的机遇

EasysearchMuses 发表了文章 • 0 个评论 • 4460 次浏览 • 2024-04-11 16:05 • 来自相关话题

引言

近日,Redis Labs 宣布其主导的开源项目 Redis 将采用双重源代码可用许可证(RSALv2)和服务器端公共许可证(SSPLv1)。这一重大决策标志着 Redis 从传统的 BSD 许可证向更加严格的控制权转变,同时也引发了广泛的社区和行业讨论。这不仅是一个关于许可证变更的故事,更是关于开源社区如何响应,以及这一变化如何激发对国产技术探索和发展的深刻思考。Redis,作为最受欢迎的开源键值存储数据库之一,其开源协议的变更反映了开源软件在商业化道路上的挑战和压力。Redis Labs 的 CEO Rowan Trollope 指出,这一变化旨在防止云服务提供商免费使用 Redis 代码,同时促进 Redis 社区的可持续发展和创新。

Redis 协议变更的深远影响

Redis 决定放弃 BSD 协议,转而采用双重源代码可用许可证(RSALv2 和 SSPLv1),标志着开源界的一个重要转折点。这一变化不仅影响了 Redis 本身,更引发了社区成员和技术行业的激烈讨论,许多人担心这将限制 Redis 的开源精神和广泛应用。然而,也有声音认为,这为其他开源项目,如 KeyDB、Dragonfly 和 Garnet 等,提供了发展的机遇,尤其是在提供与 Redis 兼容的替代解决方案方面。尽管 Redis 的这一变更在技术和法律上引发了争议,它也激发了开源社区对于如何在维护开源精神和寻求商业可持续性之间找到平衡的探索。此外,Redis 团队对于保持客户端库的开源许可和继续支持开源社区版的承诺,展示了一种尝试在新的许可模式下保持开放性和可接入性的方法。由于 Redis 的广泛应用,其协议变更对云服务商、Linux 发行版,甚至整个开源软件生态都产生了不小的冲击。一方面,云服务提供商需要重新评估其服务模型;另一方面,一些 Linux 发行版可能需要考虑将 Redis 从其软件仓库中移除。

ES 国产化的契机

Redis 开源协议的变更同时也让人们重新审视其他关键技术,特别是 Elasticsearch(ES)的依赖和发展。ES 作为一个强大的搜索和数据分析引擎,在全球范围内被广泛使用。随着对开源项目商业化模式的重新考量,中国开发者和企业开始寻求国产化的 ES 替代品,旨在减少对外部技术的依赖,同时推动国内技术生态的多元化和自主创新。但是国产化的探索并非没有挑战。从技术兼容性、性能优化到社区生态建设,每一步都需要深思熟虑和持续的努力。然而,Redis 的许可证变更为国内技术自主提供了一个独特的视角,鼓励开发者、企业乃至政府机构更加积极地参与到开源技术的本土化和创新中来。Redis 开源协议的变更引发的讨论和行动,凸显了开源社区对于自身未来发展方向的深刻反思。这一变革不仅关乎一个项目的许可模式转变,更触及到开源项目如何在保持开放和自由的同时,寻找到可持续发展的道路。此外,它也促使更多的开源项目和企业思考如何在全球化的技术生态中保持竞争力和影响力。

Easysearch:国产化的新选择

针对这一需求,极限科技 隆重推出了 Easysearch 搜索引擎软件,旨在提供一个与 Elasticsearch 兼容的国产化解决方案。Easysearch 不仅支持原生 Elasticsearch 的 DSL 查询语法,还提供了诸多企业级功能的增强,如更高的性能、稳定性和扩展性,以及更加丰富的安全管理和数据压缩功能。这表明,国产化技术的发展不仅是为了替代,更是在原有基础上进行创新和优化。ES 国产化解决方案 Easysearch 的推出,是响应国家对信创、自主可控战略布局的具体行动。通过提供兼容性强、功能丰富且稳定的国产技术替代品,不仅有助于减少对外部技术的依赖,也为国内技术生态的繁荣和创新贡献力量。这一过程中,既涵盖了对现有技术的深入理解和应用,也包含了对新技术、新方法的探索和实践。

结语

Redis 开源协议的变更和 Elasticsearch 国产化解决方案的兴起,共同反映了当前技术世界中开源与商业、国际与国产之间复杂而微妙的关系。这一趋势不仅仅是技术领域的变化,更是全球化背景下,各国在技术自主、安全与发展方面所做出的战略性调整。随着更多开源项目和技术面临类似的挑战,我们或许可以预见,技术自主和开源创新将成为推动未来技术发展的两大关键力量。

参考

关于极限科技(INFINI Labs)

关于极限科技

极限科技,全称极限数据(北京)科技有限公司,是一家专注于实时搜索与数据分析的软件公司。旗下品牌极限实验室(INFINI Labs)致力于打造极致易用的数据探索与分析体验。

极限科技是一支年轻的团队,采用天然分布式的方式来进行远程协作,员工分布在全球各地,希望通过努力成为中国乃至全球企业大数据实时搜索分析产品的首选,为中国技术品牌输出添砖加瓦。

官网:https://www.infinilabs.com

探索搜索引擎的新时代:Windows 安装 Easysearch 完全指南

EasysearchMuses 发表了文章 • 0 个评论 • 1489 次浏览 • 2024-03-19 21:07 • 来自相关话题

相信最近大家都已经听过Easysearch的名头,成功拿下了墨天轮搜索型数据库的榜首!什么?您不知道?那我再给您介绍下: INFINI Easysearch 是一个分布式的近实时搜索与分析引擎,核心引擎基于开源的 Apache Lucene。Easysearch 的目标是提供一个轻量级的 Elasticsearch 可替代版本,并继续完善和支持更多的企业级功能。与 Elasticsearch 相比,Easysearch 更关注在搜索业务场景的优化和继续保持其产品的简洁与易用性。 相信看完了上面您已经对使用Easysearch有了想法,不要想,行动!我将带领您在windows环境中使用Easysearch,有几种安装方法可供选择!

方法一:使用Docker

对于已在Windows系统上安装了Docker的用户来说,通过Docker安装Easysearch是最直接高效的方法。接下来我将介绍Docker部署Easysearch的方法,如果没有安装Docker请跳过!

Docker 环境下使用 Easysearch

在使用 Docker 运行 Easysearch 之前,请确保已进行系统调优并安装好Docker服务,且Docker服务正常运行。

最快方式:启动临时的docker容器,可以从前台查看到admin的初始密码

```bash
docker run --name easysearch -p 9200:9200 dockerproxy.com/infinilabs/easysearch:latest

个性配置

从宿主机挂载数据目录及日志目录,并配置jvm内存为512m。

  1. 在宿主机上创建目录

    bashCopy code
    sudo mkdir -p /data/easysearch/{data,logs}
  2. 修改目录权限

    bashCopy code
    # 容器内es用户的uid为602,通过调整宿主机的目录权限,确保在容器内部es用户有权限读写挂载的数据卷
    sudo chown -R 602.602 /data/easysearch
  3. 后台运行容器

    bashCopy code
    docker run -d --restart always -p 9200:9200 \
              -e ES_JAVA_OPTS="-Xms512m -Xmx512m" \
              -v /data/easysearch/data:/app/easysearch/data \
              -v /data/easysearch/logs:/app/easysearch/logs \
              --name easysearch --hostname easysearch \
              dockerproxy.com/infinilabs/easysearch:latest
  4. 查看初始密码

    bashCopy code
    # 由于以上容器是后台启动,需要通过日志找出admin的初始密码
    docker logs easysearch 2>/dev/null | grep -w Usage

    容器启停

  5. 启动容器

    bashCopy code
    docker start easysearch
  6. 停止容器

    bashCopy code
    docker stop easysearch

    后续验证工作,请继续查看安装指南。

    方法二:不使用HTTPS安装Easysearch

    在某些情况下,您可能需要或者偏好不通过HTTPS方式进行安装。这种方法需要您手动下载并设置Easysearch及其依赖。

    步骤1:下载并安装Easysearch

    首先,手动下载 Easysearch 并将其解压到您希望的安装目录。

    步骤2:下载并安装JDK

  7. 手动下载JDK安装包。
  8. 将JDK解压到Easysearch安装目录下。
  9. 将解压出来的JDK目录重命名为jdk

    步骤3:修改Easysearch配置

    鉴于Windows默认不包含openssl,生成证书可能较为困难。您可以通过修改config/easysearch.yml文件来绕过证书验证:

    security.enabled: false

    方法三:通过git-for-windows安装

    对于喜欢使用命令行的用户,可以通过安装git-for-windows,利用bash环境来执行安装命令。

    步骤1:安装Easysearch

    通过以下在线脚本命令安装Easysearch:

    bashCopy code
    curl -sSL http://get.infini.cloud | bash -s -- -p easysearch -d /d/opt/easysearch

    步骤2:下载并安装JDK

  10. 使用curl命令将JDK下载到指定目录:

    bashCopy code
    curl -# https://release.infinilabs.com/easysearch/jdk/zulu17.42.19-ca-jdk17.0.7-win_x64.zip -o /d/opt/jdk.zip
  11. 解压JDK文件,并将解压后的目录重命名为jdk
    bashCopy code
    cd /d/opt/easysearch && unzip -q /d/opt/jdk.zip
    mv zulu* jdk

    步骤3:设置JAVA_HOME环境变量

    配置JAVA_HOME环境变量,以确保Easysearch能正确找到JDK。

    bashCopy code
    export JAVA_HOME=/d/opt/easysearch/jdk

    步骤4:初始化证书、密码和插件

    执行以下命令,初始化所需的配置:

    bashCopy code
    bin/initialize.sh

    步骤5:运行Easysearch

    最后,使用以下命令启动Easysearch:

    bashCopy code
    bin/easysearch.bat

    通过以上任一方法,您都应该能够成功在Windows系统上安装并运行Easysearch。请选择最适合您的需求和环境的安装方法。 请根据Easysearch和JDK的最新版本,适时更新上述命令和下载链接。接下来,请继续完成验证工作。

    验证工作

    为了保证Easysearch数据安全,初始化脚本会为admin用户生成随机的密码,如果使用Docker运行Easysearch或执行初始化脚本时同意记录初始密码到日志文件,则可在Docker日志文件或logs/initialize.log中找到admin用户对应的初始化密码。 由于初始脚本会自动覆盖集群上次使用的证书及内置的admin用户密码,请勿多次运行!如果您忘记了初始密码,可以通过内置的证书来进行密码重置。

    bashCopy code
    # 根据初始化脚本生成的随机密码访问 Easysearch 的 REST API
    curl -ku admin:xxx https://localhost:9200

    也可以在浏览器中输入网址 https://localhost:9200/,即可验证Easysearch是否完成启动。推荐使用INFINI Console来进行集群管理,功能更加强大和方便。 注:各类客户端及周边工具,如 Logstash、Filebeat 请使用7.10.2 oss版本来连接Easysearch。并打开config/easysearch.yml中的配置项elasticsearch.api_compatibility: true

如果你已经按照上面的步骤完成了安装,那么接下来请尽情的使用Easysearch吧!如果在安装过程中出现了问题的请私聊我!对了,希望在其他环境中部署Easysearch的也可以查询我们的安装指南,上面有详细的安装步骤!祝你好运!

【 INFINI Workshop 北京站】1月18日一起动手实验玩转 Easysearch

活动liaosy 发表了文章 • 0 个评论 • 2048 次浏览 • 2023-12-15 16:22 • 来自相关话题

与 INFINI Labs 的技术专家面对面,第一时间了解极限实验室的发布最新产品和功能特性,通过动手实战,快速掌握最前沿的搜索技术,并用于实际项目中。欢迎大家扫描海报二维码免费报名参加。

活动时间:2024-01-18 13:30~17:30

活动地点:北京市海淀区 Wework 辉煌时代大厦 3 楼 3E 会议室

分享议题

  • Easysearch 总体介绍及搭建实战
  • 基于 INFINI Console 实现跨版本、跨引擎统一管控
  • Elasticsearch -> Easysearch 在线迁移实操

参会提示

  • 请务必自备电脑(Windows 系统环境请提前安装好 Linux 虚拟机)
  • 请提前在 INFINI Labs 官网下载对应平台最新安装包(INFINI Easysearch、INFINI Gateway、INFINI Console)
  • 下载地址:https://www.infinilabs.com/download
  • 如有任何疑问可添加 INFINI Labs 小助手(微信号: INFINI-Labs)进行联系

20231214-095304-qrcode.jpeg

【INFINI Workshop 上海站】7 月 27 日一起动手实验玩转 Easysearch

资讯动态liaosy 发表了文章 • 1 个评论 • 1968 次浏览 • 2023-07-07 16:30 • 来自相关话题

【 INFINI Workshop 上海站】7 月 27 日下午 和 INFINI Labs 的技术专家面对面,第一时间了解极限实验室的发布最新产品和功能特性,通过动手实战,快速掌握最前沿的搜索技术,并用于实际项目中。欢迎大家免费报名参加。 活动时间:2023-07-27 13:30~17:30 活动地点:上海静安区武宁南路1号 WeWork 越商大厦 3 楼 3A 会议室 (注意:活动地址已更新,已报名小伙伴无需重新报名。) ​ 分享议题 • Easysearch 总体介绍及搭建实战 • 基于 INFINI Console 实现跨版本、跨引擎统一管控 • Elasticsearch -> Easysearch 在线迁移实操 参会提示请务必自备电脑(Windows 系统环境请提前安装好 Linux 虚拟机) • 请提前在 INFINI Labs 官网下载对应平台最新安装包(INFINI Easysearch、INFINI Gateway、INFINI Console) • 下载地址:https://www.infinilabs.com/download 名额有限,对 ES 国产化感兴趣的朋友们速度报名(扫描海报中的二维码或者点击 链接 即可免费报名)。   如有任何疑问可添加 INFINI Labs 小助手(微信号: INFINI-Labs)进行联系。
飞书20230719-130323.png

第1期 | 2024 搜索客社区 Meetup 线上直播活动,主题:Easysearch 结合大模型实现 RAG

活动searchkit 发表了文章 • 0 个评论 • 294 次浏览 • 1 天前 • 来自相关话题

2024 搜索客社区 Meetup 首期线上活动正式启动,本次活动由 搜索客社区、极限科技(INFINI Labs)联合举办,诚邀广大搜索技术开发者和爱好者参加交流学习。

活动时间:2024 年 7 月 31 日 19:30-20:30 (周三)
活动形式:微信视频号(极限实验室)直播
报名方式:关注或扫码海报中的二维码进行预约

活动海报

活动简介

在这个人工智能飞速发展的时代,ChatGPT 和 GPT-4 的出现无疑为人类带来了前所未有的震撼。我们不禁思考:通用人工智能的奇点是否真的即将来临?而最前沿的 AI 技术与最实用的落地应用之间的距离,又该如何缩短?

为了深入探讨这些问题,我们特别邀请到了极限科技(INFINI Labs)高级解决方案架构师、《老杨玩搜索》栏目 B 站 UP 主——杨帆先生,为我们带来一场主题为 “Easysearch 结合大模型实现 RAG” 的精彩演讲。

嘉宾介绍

杨帆,拥有十余年金融行业服务工作经验,熟悉 Linux、数据库、网络等领域。目前主要从事 Easysearch、Elasticsearch 等搜索引擎的技术支持工作,服务国内私有化部署的客户。他的丰富经验和深刻见解,将为我们揭开 AI 技术与实际应用之间的神秘面纱。

演讲主题

《Easysearch 结合大模型实现 RAG》

主题摘要

在本次演讲中,杨帆将跟大家分享和探讨以下几个方面:

  1. LangChain 简介:LangChain 的作用是什么?它由哪些组件构成,优势是什么。
  2. RAG 的背景及其局限性:RAG 出现以前的我们是如何获取信息的,RAG 解决了什么问题?它就是最终的答案了吗?
  3. LangChain 下的 RAG 工作流:在 LangChain 的框架下,实现 RAG 的步骤是怎样的。
  4. RAG Demo:使用 ollama 部署本地模型,利用 LangChain 集成 Easysearch 和 LLM , 开发 QA 问答系统

活动亮点

  • 前沿技术分享: 深入了解当前 AI 领域的最新动态和发展趋势。
  • 实战经验交流: 学习如何在实际工作中应用这些先进技术。
  • 互动问答环节: 与演讲嘉宾直接对话,解答你的疑惑。

参与有奖

本次直播活动中设置了随机抽奖环节,奖品为 INFINI Labs 周边纪念品,包括 T 恤、鸭舌帽、咖啡杯、指甲刀套件等等(图片仅供参考,款式、颜色与尺码随机)。

抽奖礼品

活动交流

活动交流群二维码 7 天内(8 月 1 日前)有效,如过期请添加小助手微信拉群。活动最新消息也会在群内及时同步,欢迎大家参与,记得先预约,精彩内容不错过!

活动交流

讲师招募

讲师招募

搜索客社区 Meetup 讲师持续招募中...

这是一个由搜索客社区精心组织策划的线下线上技术交流活动,我们诚挚邀请各位技术大咖、行业精英踊跃提交演讲议题。Meetup 活动将聚焦 AI 与搜索领域的最新动态,以及数据实时搜索分析、向量检索、技术实践与案例分析、日志分析、安全等领域的深度探讨。详情参见:http://cfp.searchkit.cn 。我们热切期待您的精彩分享!

关于 搜索客(SearchKit)社区

搜索客社区由 Elasticsearch 中文社区进行全新的品牌升级,以新的 Slogan:“搜索人自己的社区” 为宣言。汇集搜索领域最新动态、精选干货文章、精华讨论、文档资料、翻译与版本发布等,为广大搜索领域从业者提供更为丰富便捷的学习和交流平台。社区官网:https://searchkit.cn

Easysearch 有奖征文活动推荐

黑神话悟空

无论你是 Easysearch 的老用户,还是第一次听说这个名字,只要你对 INFINI Labs 旗下的 Easysearch 产品感兴趣,或者是希望了解 Easysearch,都可以参加这次活动。

详情查看:Easysearch 征文活动

Easysearch 新特性:写入限流功能介绍

EasysearchINFINI Labs 小助手 发表了文章 • 0 个评论 • 1427 次浏览 • 2024-07-17 14:52 • 来自相关话题

背景

在 Easysearch 的各种使用场景中,高写入吞吐量的场景占了很大一部分,由此也带来了一些使用上的问题,很多用户由于使用经验不足,对集群的写入压测进行的不够充分,不能很好的规划集群的写入量。

导致经常发生以下问题:

  • 写入吞吐量过大对内存影响巨大,引发节点 OOM,节点掉线问题。
  • 对 CPU 和内存的占用严重影响了其他的查询业务的响应。
  • 以及磁盘 IO 负载增加,挤占集群的网络带宽等问题。

之前就有某金融保险类客户遇到了因业务端写入量突然猛增导致数据节点不停的 Full GC,进而掉入了不停的掉线,上线,又掉线的恶性循环中。当时只能建议用户增加一个类似“挡板”的服务,在数据进入到集群之前进行拦截,对客户端写入进行干预限流:

这样做虽然有效,但是也增加了整个系统的部署复杂性,提高了运维成本。

根据客户的实际场景,Easysearch 从 1.8.0 版本开始引入了节点和 Shard 级别的限流功能,不用依赖第三方就可以限制写入压力,并在 1.8.2 版本增加了索引级别的写入限流。 注意:所有写入限流都是针对各数据节点的 Primary Shard 写入进行限流的,算上副本的话吞吐量要乘以 2。

限流示意图:

下面是限流前后相同数据节点的吞吐量和 CPU 对比:

测试环境:

ip       name   http          port version role master
10.0.0.3 node-3 10.0.0.3:9209 9303 1.8.0   dimr -
10.0.0.3 node-4 10.0.0.3:9210 9304 1.8.0   im   -
10.0.0.3 node-2 10.0.0.3:9208 9302 1.8.0   dimr -
10.0.0.3 node-1 10.0.0.3:9207 9301 1.8.0   dimr *

测试索引配置:

PUT test_0
{
  "settings": {
    "number_of_replicas": 1,
    "number_of_shards": 3
  }
}

压测工具:采用极限科技的 INFINI Loadgen 压测,这款压测工具使用简单,可以方便对任何支持 Rest 接口的库进行压测。

压测命令:

 ./loadgen-linux-amd64 -d 180 -c 10 -config loadgen-easy-1.8.yml

压测 180 秒,10 个并发,每个 bulk 请求 5000 条。

节点级别限流

通过 INFINI Console 监控指标可以看到,限流之前的某个数据节点,CPU 占用 10%,每秒写入 40000 条左右:

在 Cluster Settings 里配置,启用节点级别限流,限制每个节点的每秒最大写入 10000 条,并在默认的 1 秒间隔内进行重试,超过默认间隔后直接拒绝。

PUT _cluster/settings
{
  "transient": {
    "cluster.throttle.node.write": true,
    "cluster.throttle.node.write.max_requests": 10000,
    "cluster.throttle.node.write.action": "retry"
  }
}

限流后,CPU 占用降低了约 50%,算上副本一共 20000 条每秒:

Shard 级别限流

设置每个分片最大写入条数为 2000 条每秒

PUT _cluster/settings
{
  "transient": {
    "cluster.throttle.shard.write": true,
    "cluster.throttle.shard.write.max_requests": 2000,
    "cluster.throttle.shard.write.action": "retry"
  }
}

集群级别的监控,同样是只针对主 Shard。

从 Console 的监控指标可以看出,索引 test_0 的 Primary indexing 维持在 6000 左右,正好是 3 个主分片限制的 2000 的写入之和。

再看下数据节点监控,Total Shards 表示主分片和副本分片的写入总和即 4000,单看主分片的话,正好是 2000.

索引级别限流

有时,集群中可能某个索引的写入吞吐过大而影响了其他业务,也可以针对特定的索引配置写入限制。 可以在索引的 Settings 里设置当前索引每秒写入最大条数为 6000:

PUT test_0
{
  "settings": {
    "number_of_replicas": 1,
    "number_of_shards": 3,
    "index.throttle.write.max_requests": 6000,
    "index.throttle.write.action": "retry",
    "index.throttle.write.enable": true
  }
}

下图索引的 Primary indexing 在 6000 左右,表示索引的所有主分片的写入速度限制在了 6000。

总结

通过本次测试对比,可以看出限流的好处:

  1. 有效控制写入压力: 写入限流功能能够有效限制每个节点和每个 Shard 的写入吞吐量,防止因写入量过大而导致系统资源被过度消耗的问题。

  2. 降低系统资源占用: 在限流前,某数据节点的 CPU 占用率约为 10%。限流后,CPU 占用率显著降低至约 5%,减少了约 50%。这表明在高并发写入场景下,写入限流功能显著降低了系统的 CPU 负载。

  3. 提高系统稳定性: 通过控制写入吞吐量,避免了频繁的 Full GC 和节点掉线问题,从而提升了系统的整体稳定性和可靠性。

  4. 保障查询业务性能: 写入限流功能减少了写入操作对 CPU 和内存的占用,确保其他查询业务的响应性能不受影响。

综上所述,写入限流功能在高并发写入场景下表现出色,不仅有效控制了写入压力,还显著降低了系统资源占用,从而提高了系统的稳定性和查询业务的性能。

关于 Easysearch 有奖征文活动

黑神话悟空

无论你是 Easysearch 的老用户,还是第一次听说这个名字,只要你对 INFINI Labs 旗下的 Easysearch 产品感兴趣,或者是希望了解 Easysearch,都可以参加这次活动。

详情查看:Easysearch 征文活动

作者:张磊

原文:https://infinilabs.cn/blog/2024/easysearch-new-feature-write-throttling-introduction/

【搜索客社区日报】第1859期 (2024-07-15)

社区日报searchkit 发表了文章 • 0 个评论 • 1391 次浏览 • 2024-07-17 14:50 • 来自相关话题

1. Easysearch 新特性:写入限流功能介绍 https://infinilabs.cn/blog/202 ... tion/ 2. 中文大模型基准测评2024年上半年报告 https://report.oschina.net/api ... o.pdf 3. ClickHouse 24.6 版本发布说明 https://mp.weixin.qq.com/s/JrAikqoUMjHHuaLEHZptew 4. 斯坦福年度《人工智能指数报告》的十条重要结论 https://cn.weforum.org/agenda/ ... t-cn/ 5. 面壁智能首席科学家刘知远:大模型的“摩尔定律”是模型知识密度持续增强  https://www.tsinghua.edu.cn/info/1182/112713.htm 编辑:Muse 更多资讯:http://news.searchkit.cn

【搜索客社区日报】第1858期 (2024-07-12)

社区日报Fred2000 发表了文章 • 0 个评论 • 2098 次浏览 • 2024-07-12 14:05 • 来自相关话题

1、中文大模型基准测评上半年报告:GPT-4o 排名第一、通义千问 “国服最强” https://www.oschina.net/news/301339 2、高级 RAG 检索策略之流程与模块化 https://mp.weixin.qq.com/s/WeAcAevUPemPKhQLhId3Vg 3、下一代 RAG 技术来了!微软正式开源 GraphRAG:大模型行业将迎来新的升级? https://www.infoq.cn/article/sqaUMyNg6B8OrCcwg4vo 4、电商场景下 ES 搜索引擎的稳定性治理实践 https://mp.weixin.qq.com/s/fAgAgWWYJbbfcGGx1BpLsw 5、玩转 Easysearch 语法 https://infinilabs.cn/blog/202 ... ntax/ 编辑:Fred  更多资讯:http://news.searchkit.cn
1、中文大模型基准测评上半年报告:GPT-4o 排名第一、通义千问 “国服最强” https://www.oschina.net/news/301339 2、高级 RAG 检索策略之流程与模块化 https://mp.weixin.qq.com/s/WeAcAevUPemPKhQLhId3Vg 3、下一代 RAG 技术来了!微软正式开源 GraphRAG:大模型行业将迎来新的升级? https://www.infoq.cn/article/sqaUMyNg6B8OrCcwg4vo 4、电商场景下 ES 搜索引擎的稳定性治理实践 https://mp.weixin.qq.com/s/fAgAgWWYJbbfcGGx1BpLsw 5、玩转 Easysearch 语法 https://infinilabs.cn/blog/202 ... ntax/ 编辑:Fred  更多资讯:http://news.searchkit.cn

玩转 Easysearch 语法

EasysearchINFINI Labs 小助手 发表了文章 • 0 个评论 • 2114 次浏览 • 2024-07-11 12:11 • 来自相关话题

什么是 Easysearch

Elasticsearch 是一个基于 Apache Lucene 的开源分布式搜索和分析引擎,它被广泛应用于全文搜索、结构化搜索和分析等多种场景中。作为 Elasticsearch 的国产化替代方案,Easysearch 不仅保持了与原生 Elasticsearch 的高度兼容性,还在功能、性能、稳定性和扩展性方面进行了全面提升。对于开发团队来说,从 Elasticsearch 切换到 Easysearch 不需要做任何业务代码的调整,确保了无缝衔接和平滑迁移。

Easysearch 是基于 Elasticsearch 7.10.2 开源版本二次开发,所以支持 Elasticsearch 原始的 Query DSL 语法,基本的 SQL 语法,并且兼容现有 Elasticsearch 的 SDK,使得应用无需修改代码即可进行迁移。其平滑的迁移特性,如基于网关的无缝跨版本迁移与升级,提供了随时安全回退的能力。

在之前的文章中,我们已经介绍了 Easysearch 的搭建可视化工具的使用,今天我们将探讨 Easysearch 集群的基本概念和常用的 API。

Easysearch 集群的核心概念

Easysearch 集群由以下几个核心概念构成:

  1. 节点(Node):集群中的单个服务器,负责存储数据并参与集群的索引和搜索功能。
  2. 集群(Cluster):由一个或多个节点组成,拥有唯一的集群名,协同完成数据索引和查询任务。
  3. 索引(Index):存储相关数据的容器,类似于关系数据库中的数据库,一个索引包含多个文档。
  4. 文档(Document):索引中的基本数据单位,相当于关系数据库中的行。
  5. 字段(Field):文档中的一个属性,相当于数据库中的列。
  6. 分片(Shard):为了提高性能和扩展性,索引可以被分割成多个分片,每个分片是索引的一个部分。
  7. 副本(Replica):分片的副本,用于提高数据的可靠性和在节点出现故障时的可用性。

通过多个 API,例如 _cluster/health_cluster/stats,用户可以轻松查看集群的健康状态和详细信息,这些信息对于维护和优化 Easysearch 集群至关重要。

无论是在性能的提升,还是在功能的兼容性方面,Easysearch 都为用户提供了一个强大的搜索引擎平台,让从 Elasticsearch 到 Easysearch 的迁移变得无缝且高效。掌握其核心概念和 API 的使用,将帮助开发者更好地利用这些工具来构建和优化他们的搜索解决方案。

查看集群信息

在 Easysearch 中,可以通过多个 API 来查看集群的各种信息,包括集群的健康状况、节点信息和索引状态。以下是一些常用的查看集群信息的 API 和示例:

查看集群健康状况

_cluster/health API 可以查看集群的健康状态,包括集群是否处于正常状态、节点数量、分片状态等。

GET /_cluster/health

示例响应:

{
  "cluster_name": "my_cluster",
  "status": "green",
  "timed_out": false,
  "number_of_nodes": 3,
  "number_of_data_nodes": 3,
  "active_primary_shards": 5,
  "active_shards": 10,
  "relocating_shards": 0,
  "initializing_shards": 0,
  "unassigned_shards": 0,
  "delayed_unassigned_shards": 0,
  "number_of_pending_tasks": 0,
  "number_of_in_flight_fetch": 0,
  "task_max_waiting_in_queue_millis": 0,
  "active_shards_percent_as_number": 100.0
}

查看集群状态

_cluster/stats API 可以查看集群的详细状态,包括索引、节点、分片等信息。

GET /_cluster/stats

示例响应:

{
  "cluster_name": "my_cluster",
  "status": "green",
  "indices": {
    "count": 10,
    "shards": {
      "total": 20,
      "primaries": 10,
      "replication": 1.0,
      "index": {
        "shards": {
          "min": 1,
          "max": 5,
          "avg": 2.0
        }
      }
    }
  },
  "nodes": {
    "count": {
      "total": 3,
      "data": 3,
      "coordinating_only": 0,
      "master": 1,
      "ingest": 2
    },
    "os": {
      "available_processors": 12,
      "allocated_processors": 12
    },
    "process": {
      "cpu": {
        "percent": 10
      },
      "open_file_descriptors": {
        "min": 100,
        "max": 300,
        "avg": 200
      }
    }
  }
}

查看节点信息

_nodes API 可以查看集群中节点的详细信息,包括节点角色、IP 地址、内存使用情况等。

GET /_nodes

示例响应:

{
  "cluster_name": "my_cluster",
  "nodes": {
    "node_id_1": {
      "name": "node_1",
      "transport_address": "192.168.1.1:9300",
      "host": "192.168.1.1",
      "ip": "192.168.1.1",
      "roles": ["master", "data", "ingest"],
      "os": {
        "available_processors": 4,
        "allocated_processors": 4
      },
      "process": {
        "cpu": {
          "percent": 10
        },
        "open_file_descriptors": 200
      }
    },
    "node_id_2": {
      "name": "node_2",
      "transport_address": "192.168.1.2:9300",
      "host": "192.168.1.2",
      "ip": "192.168.1.2",
      "roles": ["data"],
      "os": {
        "available_processors": 4,
        "allocated_processors": 4
      },
      "process": {
        "cpu": {
          "percent": 15
        },
        "open_file_descriptors": 150
      }
    }
  }
}

查看索引状态

_cat/indices API 可以查看集群中所有索引的状态,包括文档数、存储大小、分片数等信息。

GET /_cat/indices?v

示例响应:

health status index   uuid                   pri rep docs.count docs.deleted store.size pri.store.size
green  open   index_1 SxNUd84vRl6QH5P7g0T4Vg   1   1          0            0       230b           230b
green  open   index_2 NxEYib4yToCnA1PpQ8P4Xw   5   1        100            1      10mb           5mb

这些 API 可以帮助你全面了解 Easysearch 集群的状态和健康状况,从而更好地管理和维护集群。

增删改查操作

在 Easysearch 中,增删改查操作是管理数据和索引的基本功能。以下是如何使用这些操作的详细示例。

创建索引

创建一个新的索引,并指定分片和副本的数量:

PUT /my_index
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 2
  }
}

删除索引

删除一个不再需要的索引:

DELETE /my_index

添加文档

通过 POST 或 PUT 请求向索引中添加文档:

POST /my_index/_doc/1
{
  "name": "John Doe",
  "age": 30,
  "occupation": "Engineer"
}
PUT /my_index/_doc/1
{
  "name": "John Doe",
  "age": 30,
  "occupation": "Engineer"
}

POSTPUT 方法用于不同的操作,尽管它们都可以用于添加或更新文档,但它们的行为有所不同。

POST /my_index/_doc/1 方法用于创建或替换一个文档。如果指定的文档 ID 已经存在,POST 请求将更新整个文档(不会合并字段)。如果文档 ID 不存在,它将创建一个新的文档。


POST /my_index/_doc/1
{
  "name": "John Doe",
  "age": 30,
  "occupation": "Engineer"
}

PUT /my_index/_doc/1 方法通常用于创建一个新的文档,或者完全替换一个已存在的文档。与 POST 类似,如果指定的文档 ID 已经存在,PUT 请求将替换整个文档。

PUT /my_index/_doc/1
{
  "name": "John Doe",
  "age": 30,
  "occupation": "Engineer"
}

1.使用场景:

  • POST:更适合用于添加或部分更新文档,即使文档 ID 已经存在。
  • PUT:更适合用于创建或完全替换文档。

2.ID 自动生成:

  • POST 请求可以不提供文档 ID,此时 Easysearch 会自动生成一个文档 ID。
  • PUT 请求必须提供文档 ID,如果未提供,则会返回错误。

3.部分更新:

  • POST 请求可以用于部分更新(通过 _update API)。
  • PUT 请求用于完全替换文档,不支持部分更新。

如果文档 ID 已经存在,POSTPUT 都会覆盖整个文档,并且效果是一样的。但是,通常 POST 用于提交数据,而 PUT 用于上传和替换资源。

1.使用 POST 方法添加或更新文档:

POST /my_index/_doc/1
{
  "name": "John Doe",
  "age": 30,
  "occupation": "Engineer"
}

2.使用 PUT 方法添加或更新文档:

PUT /my_index/_doc/1
{
  "name": "John Doe",
  "age": 30,
  "occupation": "Engineer"
}

在这两个示例中,结果都是在索引 my_index 中创建或更新文档 ID 为 1 的文档。无论使用 POST 还是 PUT,如果文档 ID 已存在,都会覆盖原有的文档内容。

新建文档

使用 _create 方法新建文档,如果文档已经存在则返回错误:

PUT /my_index/_create/1
{
  "a": 1
}

如果尝试新建已存在的文档,将会出现如下错误:

{
  "error": {
    "root_cause": [
      {
        "type": "version_conflict_engine_exception",
        "reason": "[1]: version conflict, document already exists (current version [1])",
        "index_uuid": "1xWdHLTaTm6l6HbqACaIEA",
        "shard": "0",
        "index": "my_index"
      }
    ],
    "type": "version_conflict_engine_exception",
    "reason": "[1]: version conflict, document already exists (current version [1])",
    "index_uuid": "1xWdHLTaTm6l6HbqACaIEA",
    "shard": "0",
    "index": "my_index"
  },
  "status": 409
}

获取文档

通过 ID 获取文档的详细信息:

GET /my_index/_doc/1

更新文档

更新文档的特定字段,保留原有字段:

POST /my_index/_update/1
{
  "doc": {
    "age": 31
  }
}

删除文档

通过 ID 删除指定的文档:

DELETE /my_index/_doc/1

查询所有文档

查询索引中的所有文档:

GET /my_index/_search
{
  "query": {
    "match_all": {}
  }
}

这个是 《老杨玩搜索》中总结的图,可以作为“小抄”来记忆:

批量操作 (_bulk API)

_bulk API 用于在一次请求中执行多个索引、删除和更新操作,这对于批量处理大规模数据非常有用,可以显著提高性能和效率。以下是 _bulk API 的基本使用示例:

POST /my_index/_bulk
{ "index": { "_id": "1" } }
{ "name": "John Doe", "age": 30, "occupation": "Engineer" }
{ "index": { "_id": "2" } }
{ "name": "Jane Doe", "age": 25, "occupation": "Designer" }
{ "update": { "_id": "1" } }
{ "doc": { "age": 31 } }

_bulk API 的请求体由多个操作和文档组成。每个操作行包含一个动作描述行和一个可选的源文档行。动作描述行指明了操作的类型(例如,index、create、delete、update)以及操作的元数据。源文档行则包含了实际的数据。

每个操作之间需要用换行符分隔,并且请求体最后必须以换行符结尾。

POST /_bulk
{ "index": { "_index": "a", "_id": "1" } }
{ "name": "John Doe", "age": 30, "occupation": "Engineer" }
{ "index": { "_index": "b", "_id": "2" } }
{ "name": "Jane Doe", "age": 25, "occupation": "Designer" }
{ "update": { "_index": "a", "_id": "1" } }
{ "doc": { "age": 31 } }

分词器

在 Easysearch 中,分词器(Analyzer)用于将文本分解为词项(terms),是全文搜索和文本分析的基础。分词器通常由字符过滤器(Character Filters)、分词器(Tokenizer)和词项过滤器(Token Filters)组成。以下是关于分词器的详细介绍:

1.字符过滤器(Character Filters):在分词之前对文本进行预处理。例如,去除 HTML 标签,替换字符等。

2.分词器(Tokenizer):将文本分解为词项(tokens)。这是分词过程的核心。

3.词项过滤器(Token Filters):对词项进行处理,如小写化、去除停用词、词干提取等。

只有 text 字段支持全文检索,返回的结果根据相似度打分,我们一起看下

POST /index/_mapping
{
  "properties": {
    "content": {
      "type": "text",
      "analyzer": "ik_max_word",
      "search_analyzer": "ik_smart"
    }
  }
}

.POST /index/_mapping

  • 这个部分表示要向名为 index 的索引添加或更新映射设置。

2.“properties”

  • properties 定义了索引中文档的字段结构。在这个例子中,定义了一个名为 content 的字段。

3.“content”

  • 定义了名为 content 的字段。

4.“type”: “text”

type 字段指定 content 字段的数据类型为 texttext 类型适用于需要分词和全文搜索的字段。

5.“analyzer”: “ik_max_word”

analyzer 字段指定索引时使用的分词器为ik_max_wordik_max_word 是 IK 分词器中的一种,它会尽可能多地将文本分解为更多的词项。

6.“search_analyzer”: “ik_smart”

search_analyzer 字段指定搜索时使用的分词器为ik_smartik_smart 是 IK 分词器中的另一种,它会更智能地进行分词,以提高搜索的准确性。

当然,在设置这个 mapping 的时候可以使用同样的分词器,也可以使用不同的分词器。这里介绍下 IK 分词器:

  • IK 分词器是一种中文分词器,适用于中文文本的分词。IK 分词器有两种分词模式:ik_max_wordik_smart
    • ik_max_word:将文本尽可能多地切分成词项,适用于需要更高召回率的场景。
    • ik_smart:进行最智能的分词,适用于需要更高精度的搜索场景。

这个 DSL 的设置意味着,在向这个索引添加或更新文档时,content 字段的文本会使用ik_max_word 分词器进行分词处理,以确保文本被尽可能多地切分成词项。而在搜索时,content 字段的文本会使用ik_smart 分词器进行分词处理,以提高搜索的准确性和相关性。

以下是关于 standard,ik_smart,ik_max_word 这几个分词器的对比:

GET /_analyze
{
  "tokenizer": "standard",
  "text": "我,机器人"
}

GET /_analyze
{
  "tokenizer": "ik_smart",
  "text": "我,机器人"
}

GET /_analyze
{
  "tokenizer": "ik_max_word",
  "text": "我,机器人"
}

结果如下:

# GET /_analyze (standard)
{
  "tokens": [
    {
      "token": "我",
      "start_offset": 0,
      "end_offset": 1,
      "type": "<IDEOGRAPHIC>",
      "position": 0
    },
    {
      "token": "机",
      "start_offset": 2,
      "end_offset": 3,
      "type": "<IDEOGRAPHIC>",
      "position": 1
    },
    {
      "token": "器",
      "start_offset": 3,
      "end_offset": 4,
      "type": "<IDEOGRAPHIC>",
      "position": 2
    },
    {
      "token": "人",
      "start_offset": 4,
      "end_offset": 5,
      "type": "<IDEOGRAPHIC>",
      "position": 3
    }
  ]
}
# GET /_analyze(ik_smart)
{
  "tokens": [
    {
      "token": "我",
      "start_offset": 0,
      "end_offset": 1,
      "type": "CN_CHAR",
      "position": 0
    },
    {
      "token": "机器人",
      "start_offset": 2,
      "end_offset": 5,
      "type": "CN_WORD",
      "position": 1
    }
  ]
}
# GET /_analyze (ik_max_word)
{
  "tokens": [
    {
      "token": "我",
      "start_offset": 0,
      "end_offset": 1,
      "type": "CN_CHAR",
      "position": 0
    },
    {
      "token": "机器人",
      "start_offset": 2,
      "end_offset": 5,
      "type": "CN_WORD",
      "position": 1
    },
    {
      "token": "机器",
      "start_offset": 2,
      "end_offset": 4,
      "type": "CN_WORD",
      "position": 2
    },
    {
      "token": "人",
      "start_offset": 4,
      "end_offset": 5,
      "type": "CN_CHAR",
      "position": 3
    }
  ]
}

如果使用了不存在的分词器会出现这个错误。

{
  "error": {
    "root_cause": [
      {
        "type": "illegal_argument_exception",
        "reason": "failed to find global tokenizer under [simple]"
      }
    ],
    "type": "illegal_argument_exception",
    "reason": "failed to find global tokenizer under [simple]"
  },
  "status": 400
}

精确搜索/正则表达式搜索/通配符

在 Easysearch 中,精确搜索、正则表达式搜索和通配符搜索是三种不同的搜索方式,各有其应用场景和特点:

1.精确搜索 (Term Query)

  • 精确搜索用于查找与搜索词完全匹配的文档。
  • 不进行分词处理,通常用于关键字、ID、标签等字段的精确匹配。
  • 适用于结构化数据或不需要分词的字段(如数字、日期、布尔值等)。
{
  "query": {
    "term": {
      "status": "active"
    }
  }
}

2.正则表达式搜索 (Regexp Query)

  • 正则表达式搜索用于基于正则表达式模式匹配的文档搜索。
  • 支持复杂的字符串匹配模式,但性能可能较低,特别是当数据量较大时。
  • 适用于需要灵活且复杂匹配条件的搜索。
{
  "query": {
    "regexp": {
      "content": "Easysearch .*powerful"
    }
  }
}

3.通配符搜索 (Wildcard Query)

  • 通配符搜索用于通过通配符模式匹配文档。
  • 支持 ?(匹配单个字符)和 *(匹配零个或多个字符)。
  • 性能相对较差,因为通配符搜索可能需要扫描大量数据。
{
  "query": {
    "wildcard": {
      "username": "john*"
    }
  }
}
  • 精确搜索:用于需要绝对匹配特定词语或不需要分词的字段。例如,查找特定用户 ID 或状态。
  • 正则表达式搜索:用于需要复杂字符串模式匹配的场景,但要谨慎使用,避免性能问题。
  • 通配符搜索:用于简单模式匹配,但同样需要注意性能影响,尽量避免在大数据集上频繁使用。

接下来看这个例子,我们将使用批量导入数据,然后进行几种不同类型的查询,包括精确查询、通配符查询和正则表达式查询。

POST /users/_bulk
{ "index": { "_index": "users", "_id": 1 }}
{ "username": "john_doe", "status": "active", "email": "john.doe@example.com", "bio": "John loves Easysearch  and open-source technologies." }
{ "index": { "_index": "users", "_id": 2 }}
{ "username": "jane_doe", "status": "inactive", "email": "jane.doe@example.com", "bio": "Jane is a data scientist working with big data." }
{ "index": { "_index": "users", "_id": 3 }}
{ "username": "john_smith", "status": "active", "email": "john.smith@example.com", "bio": "John enjoys hiking and nature." }
{ "index": { "_index": "users", "_id": 4 }}
{ "username": "alice_jones", "status": "active", "email": "alice.jones@example.com", "bio": "Alice is a software engineer specialized in JavaScript." }
{ "index": { "_index": "users", "_id": 5 }}
{ "username": "bob_jones", "status": "inactive", "email": "bob.jones@example.com", "bio": "Bob is an AI enthusiast and machine learning expert." }

1.精确查询:查询状态为 “active” 的用户。

GET /users/_search
{
  "query": {
    "term": {
      "status": "active"
    }
  }
}

2.通配符查询:查询 bio 字段中包含 “John” 开头的词。

GET /users/_search
{
  "query": {
    "wildcard": {
      "bio": "John*"
    }
  }
}

3.正则表达式查询:查询用户名以 “john” 开头的用户

GET /users/_search
{
  "query": {
    "regexp": {
      "username": "john.*"
    }
  }
}

通过这些例子,你可以看到如何在 Easysearch 中使用批量导入数据,然后使用各种查询方法来检索特定条件的数据。这些查询方法可以帮助你高效地搜索和分析数据,以满足不同的业务需求。

这里同样是《老杨玩搜索》中总结的“小抄”来方便记忆:

多字段查询

在 Easysearch 中,多字段查询允许您在多个字段上同时执行搜索,以获取更精确的结果。最常用的多字段查询类型是 multi_match 查询。multi_match 查询是 match 查询的扩展,能够在多个字段中搜索指定的关键词。

multi_match 查询支持多种匹配模式,如 best_fieldsmost_fieldscross_fieldsphrasephrase_prefix。以下是各模式的简要介绍:

  • best_fields:默认模式,选择匹配度最高的字段。
  • most_fields:计算每个字段的匹配度,然后将匹配度相加。
  • cross_fields:将多个字段视为一个字段进行匹配,适用于分析文本被分散到多个字段的情况。
  • phrase:短语匹配,确保词项顺序与查询相同。
  • phrase_prefix:短语前缀匹配,允许词项的部分匹配。

我们先导入一些示例数据到一个索引 documents 中:

POST /documents/_bulk
{ "index": { "_id": 1 } }
{ "title": "Easysearch  Guide", "content": "This is an introductory guide to Easysearch ." }
{ "index": { "_id": 2 } }
{ "title": "Advanced Easysearch ", "content": "This guide covers advanced topics in Easysearch ." }
{ "index": { "_id": 3 } }
{ "title": "Easysearch  in Action", "content": "Practical guide to Easysearch  usage." }
{ "index": { "_id": 4 } }
{ "title": "Learning Easysearch ", "content": "Beginner's guide to learning Easysearch ." }

我们将使用 multi_match 查询在 titlecontent 字段中同时搜索关键词。

1.基本 multi_match 查询

POST /documents/_search
{
  "query": {
    "multi_match": {
      "query": "guide",
      "fields": ["title", "content"]
    }
  }
}

2.指定匹配模式为 best_fields

POST /documents/_search
{
  "query": {
    "multi_match": {
      "query": "guide",
      "fields": ["title", "content"],
      "type": "best_fields"
    }
  }
}

3.指定匹配模式为 most_fields

POST /documents/_search
{
  "query": {
    "multi_match": {
      "query": "guide",
      "fields": ["title", "content"],
      "type": "most_fields"
    }
  }
}

4.使用 cross_fields 模式

POST /documents/_search
{
  "query": {
    "multi_match": {
      "query": "Easysearch  guide",
      "fields": ["title", "content"],
      "type": "cross_fields"
    }
  }
}

5.短语匹配 (phrase)

POST /documents/_search
{
  "query": {
    "multi_match": {
      "query": "introductory guide",
      "fields": ["title", "content"],
      "type": "phrase"
    }
  }
}

6.短语前缀匹配 (phrase_prefix)

POST /documents/_search
{
  "query": {
    "multi_match": {
      "query": "introductory gui",
      "fields": ["title", "content"],
      "type": "phrase_prefix"
    }
  }
}
  • query:要搜索的关键词或短语。
  • fields:要搜索的字段列表,可以包含一个或多个字段。
  • type:指定匹配模式,默认为 best_fields。

使用 multi_match 查询,您可以在多个字段上同时执行搜索,获得更精确和全面的结果。通过指定不同的匹配模式,您可以调整查询行为以满足特定的搜索需求。无论是基本关键词匹配、短语匹配还是跨字段匹配,multi_match 查询都提供了强大的功能来处理复杂的搜索场景。

除此之外,还可以使用 boost 参数用于调整特定字段的权重,从而影响搜索结果的相关性评分。multi_match 查询支持为不同字段设置不同的 boost 值,以便在搜索结果中优先显示某些字段的匹配项。

布尔查询

布尔查询是 Easysearch 中非常强大且灵活的一种查询方式,它允许用户通过组合多个查询条件来实现复杂的搜索需求。布尔查询使用 bool 查询类型,可以包含以下几种子句:mustfiltermust_notshould。每种子句都有其特定的用途和语义。

1.must

  • 包含在 must 数组中的查询条件必须匹配,类似于逻辑上的 AND 操作。
  • 如果有多个条件,所有条件都必须满足,文档才会被包含在结果集中。

2.filter

  • 包含在 filter 数组中的查询条件必须匹配,但它不会影响评分。
  • filter 子句通常用于对性能要求较高的过滤操作,因为它不计算相关性评分。

3.must_not

  • 包含在 must_not 数组中的查询条件必须不匹配,类似于逻辑上的 NOT 操作。
  • 如果有任何一个条件匹配,文档就会被排除在结果集之外。

4.should

  • 包含在 should 数组中的查询条件至少匹配一个。
  • 如果布尔查询中没有 must 子句,则至少要匹配一个 should 子句。
  • should 子句在计算相关性评分时也有影响。

5.minimum_should_match

  • 指定 should 子句中至少需要满足的条件数量。

首先,我们需要创建一个名为 books 的索引,并定义它的映射(mappings)。映射用于指定每个字段的数据类型。在这个例子中,类别书名字段都被定义为 keyword 类型,这是因为我们需要进行精确匹配查询。

PUT /books
{
  "mappings": {
    "properties": {
      "类别": { "type": "keyword" },
      "书名": { "type": "keyword" }
    }
  }
}

接下来,我们使用批量操作(bulk API)将一些示例数据导入到 books 索引中。这些数据包括不同类别的书籍。

POST /books/_bulk
{ "index": { "_id": 1 } }
{ "类别": "文学", "书名": "我的阿勒泰" }
{ "index": { "_id": 2 } }
{ "类别": "文学", "书名": "平凡的世界" }
{ "index": { "_id": 3 } }
{ "类别": "科学", "书名": "时间简史" }
{ "index": { "_id": 4 } }
{ "类别": "文学", "书名": "百年孤独" }
{ "index": { "_id": 5 } }
{ "类别": "文学", "书名": "红楼梦" }

现在,我们使用布尔查询来搜索类别为“文学”并且书名为“我的阿勒泰”的文档。这里使用的是 must子句,表示查询结果必须满足所有条件。

POST /books/_search
{
  "query": {
    "bool": {
      "must": [
        { "term": { "类别": "文学" } },
        { "term": { "书名": "我的阿勒泰" } }
      ]
    }
  }
}

我们还可以使用 filter 子句来执行相同的查询。filter 子句用于过滤文档,且不会影响文档的相关性评分。这在不需要计算相关性评分时可以提高查询性能。

POST /books/_search
{
  "query": {
    "bool": {
      "filter": [
        { "term": { "类别": "文学" } },
        { "term": { "书名": "我的阿勒泰" } }
      ]
    }
  }
}

当我们执行上述查询时,期望返回的结果是 books 索引中类别为“文学”且书名为“我的阿勒泰”的文档。无论是使用 must 还是 filter 子句,结果应该都是:

{
  "hits": {
    "total": {
      "value": 1,
      "relation": "eq"
    },
    "hits": [
      {
        "_index": "books",
        "_id": "1",
        "_source": {
          "类别": "文学",
          "书名": "我的阿勒泰"
        }
      }
    ]
  }
}

POST /_search
{
  "query": {
    "bool": {
      "must": [
        { "term": { "user.id": "kimchy" } }
      ],
      "filter": [
        { "term": { "tags": "production" } }
      ],
      "must_not": [
        {
          "range": {
            "age": { "gte": 10, "lte": 20 }
          }
        }
      ],
      "should": [
        { "term": { "tags": "env1" } },
        { "term": { "tags": "deployed" } }
      ],
      "minimum_should_match": 1,
      "boost": 1.0
    }
  }
}
  • must 子句:必须匹配的条件,文档必须包含 user.idkimchy
  • filter 子句:过滤条件,文档必须包含 tagsproduction ,但不会影响评分。
  • must_not子句:不匹配的条件,文档的 age 字段不能在 10 到 20 之间。
  • should 子句:可选匹配条件,至少需要匹配一个 should 子句中的条件。这里要求 tags 字段匹配 env1deployed
  • minimum_should_match:至少需要匹配一个 should 子句中的条件。
  • boost:提升查询的整体评分。

为了展示这个 DSL ,我们需要创建一个索引并导入一些数据。假设我们要在 Easysearch 中创建一个索引 users ,并插入一些测试数据。

创建索引

PUT /users
{
  "mappings": {
    "properties": {
      "user.id": { "type": "keyword" },
      "tags": { "type": "keyword" },
      "age": { "type": "integer" }
    }
  }
}

批量导入数据

POST /users/_bulk
{ "index": { "_id": 1 } }
{ "user.id": "kimchy", "tags": ["production", "env1"], "age": 25 }
{ "index": { "_id": 2 } }
{ "user.id": "kimchy", "tags": ["production"], "age": 15 }
{ "index": { "_id": 3 } }
{ "user.id": "kimchy", "tags": ["deployed"], "age": 30 }
{ "index": { "_id": 4 } }
{ "user.id": "kimchy", "tags": ["test"], "age": 35 }
{ "index": { "_id": 5 } }
{ "user.id": "other", "tags": ["production"], "age": 25 }

接下来执行布尔查询:

POST /users/_search
{
  "query": {
    "bool": {
      "must": [
        { "term": { "user.id": "kimchy" } }
      ],
      "filter": [
        { "term": { "tags": "production" } }
      ],
      "must_not": [
        {
          "range": {
            "age": { "gte": 10, "lte": 20 }
          }
        }
      ],
      "should": [
        { "term": { "tags": "env1" } },
        { "term": { "tags": "deployed" } }
      ],
      "minimum_should_match": 1,
      "boost": 1.0
    }
  }
}

根据以上查询,预期返回的结果应该符合以下条件:

  1. user.id必须是 kimchy(由 must 子句决定)。
  2. tags 必须包含 production (由 filter 子句决定)。
  3. age 字段不在 10 到 20 之间(由 must_not 子句决定)。
  4. tags字段中至少包含 env1deployed 中的一个(由 should 子句和 minimum_should_match 参数决定)。
{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 1,
      "relation": "eq"
    },
    "max_score": 1.3769134,
    "hits": [
      {
        "_index": "users",
        "_type": "_doc",
        "_id": "1",
        "_score": 1.3769134,
        "_source": {
          "user.id": "kimchy",
          "tags": ["production", "env1"],
          "age": 25
        }
      }
    ]
  }
}

SQL 搜索

Easysearch 直接支持 SQL 查询,无需额外安装插件,同时兼容 Elasticsearch 的 SQL 调用方式,还可以直接编写原生 SQL 查询。

以下是一些测试 SQL 语句的示例:

SELECT * FROM my_index;

SELECT * FROM my_index LIMIT 2;

SELECT * FROM my_index ORDER BY name;

SELECT name AS full_name, age FROM my_index WHERE age > 25;

SELECT name AS full_name, age FROM my_index WHERE age = 25;

SELECT * FROM my_index WHERE age IS NULL;

SELECT DISTINCT age FROM my_index;

SELECT MIN(age), MAX(age), AVG(age) FROM my_index;

SELECT age, COUNT(*) AS CNT FROM my_index GROUP BY age;

使用 Easysearch 执行 SQL 查询

Easysearch 提供了对直接使用 SQL 查询的支持。以下是如何在 Easysearch 中通过 POST 请求使用 _sql 端点进行查询的示例:

执行 SQL 查询非常简单,只需通过 POST 请求发送 SQL 查询即可。以下是一个示例:

POST /_sql
{
  "query": "SELECT name AS full_name, age FROM my_index WHERE age > 25"
}

你也可以规定返回 JSON 格式:

POST /_sql?format=json
{
  "query": "SELECT name AS full_name, age FROM my_index WHERE age > 25"
}

和 Elasticsearch 一样,Easysearch 允许你通过 POST 请求直接在集群上运行 SQL 查询,并返回查询结果。以下是一些常见的 SQL 查询示例及其对应的 POST 请求:

1.查询所有文档

POST /_sql
{
  "query": "SELECT * FROM my_index"
}

2.限制返回文档数

POST /_sql
{
  "query": "SELECT * FROM my_index LIMIT 2"
}

3.按字段排序

POST /_sql
{
  "query": "SELECT * FROM my_index ORDER BY name"
}

4.筛选条件查询

POST /_sql
{
  "query": "SELECT name AS full_name, age FROM my_index WHERE age > 25"
}

5.精确值查询

POST /_sql
{
  "query": "SELECT name AS full_name, age FROM my_index WHERE age = 25"
}

6.查询空值

POST /_sql
{
  "query": "SELECT * FROM my_index WHERE age IS NULL"
}

7.查询唯一值

POST /_sql
{
  "query": "SELECT DISTINCT age FROM my_index"
}

8.聚合函数查询

POST /_sql
{
  "query": "SELECT MIN(age), MAX(age), AVG(age) FROM my_index"
}

9.分组统计

POST /_sql
{
  "query": "SELECT age, COUNT(*) AS CNT FROM my_index GROUP BY age"
}

多表操作的 SQL 语句

以下是多表操作的 SQL 语句及其解释:

1.子查询

SELECT * FROM `table1` t1 WHERE t1.id IN (SELECT id FROM `table2`)

这个查询从 table1 中选择所有字段的记录,其中这些记录的 idtable2 表中也存在。

2.内连接

SELECT * FROM `table1` t1 JOIN `table2` t2 ON t1.id = t2.id

这个查询进行内连接,从 table1table2 中选择所有字段的记录,前提是 table1table2id 相等。

3.左连接

SELECT * FROM `table1` t1 LEFT JOIN `table2` t2 ON t1.id = t2.id

这个查询进行左连接,从 table1table2 中选择所有字段的记录,即使 table2 中没有匹配的记录,也会返回 table1 中的所有记录,未匹配到的部分会用 NULL 填充。

4.右连接

SELECT * FROM `table1` t1 RIGHT JOIN `table2` t2 ON t1.id = t2.id

这个查询进行右连接,从 table1table2 中选择所有字段的记录,即使 table1 中没有匹配的记录,也会返回 table2 中的所有记录,未匹配到的部分会用 NULL 填充。

假设我们有两个索引 table1table2,对应于 SQL 中的两个表。

创建索引 table1

PUT /`table1`
{
  "mappings": {
    "properties": {
      "id": { "type": "integer" },
      "name": { "type": "text" }
    }
  }
}

创建索引 table2

PUT /`table2`
{
  "mappings": {
    "properties": {
      "id": { "type": "integer" },
      "value": { "type": "text" }
    }
  }
}

导入数据到 table1

POST /`table1`/_bulk
{ "index": { "_id": 1 } }
{ "id": 1, "name": "Alice" }
{ "index": { "_id": 2 } }
{ "id": 2, "name": "Bob" }
{ "index": { "_id": 3 } }
{ "id": 3, "name": "Charlie" }
{ "index": { "_id": 4 } }
{ "id": 4, "name": "David" }

导入数据到 table2

POST /`table2`/_bulk
{ "index": { "_id": 1 } }
{ "id": 1, "value": "Value1" }
{ "index": { "_id": 2 } }
{ "id": 2, "value": "Value2" }
{ "index": { "_id": 5 } }
{ "id": 5, "value": "Value5" }
{ "index": { "_id": 6 } }
{ "id": 6, "value": "Value6" }

导入数据后,可以使用 SQL 来执行这些查询:

1.子查询:

POST /_sql
{
  "query": "SELECT * FROM `table1` WHERE id IN (SELECT id FROM `table2`)"
}

2.内连接:

POST /_sql
{
  "query": "SELECT * FROM `table1` t1 JOIN `table2` t2 ON t1.id = t2.id"
}

3.左连接:

POST /_sql
{
  "query": "SELECT * FROM `table1` t1 LEFT JOIN `table2` t2 ON t1.id = t2.id"
}

4.右连接:

POST /_sql
{
  "query": "SELECT * FROM `table1` t1 RIGHT JOIN `table2` t2 ON t1.id = t2.id"
}

效果如下:

SQL 全文检索

matchmatch_phrase 是 Easysearch 中用于全文搜索的查询类型,它们在处理文本匹配方面有不同的用途:

1.match 查询:

  • match 查询用于对文档进行全文搜索。
  • 它将搜索关键词进行分词,并对这些分词后的词项进行搜索。
  • 适用于查询单个或多个字段,可以进行布尔操作(如 “AND”, “OR”)。
  • 例如,搜索 “Easysearch is powerful” 会被分词为 "Easysearch ", “is”, “powerful” 三个词,然后对这三个词进行搜索,文档中包含这些词的都会被认为是匹配的。
{
  "query": {
    "match": {
      "content": "Easysearch  is powerful"
    }
  }
}

2.match_phrase 查询:

  • match_phrase 查询用于短语搜索。
  • 它要求搜索的短语必须在文档中出现且词的顺序相同,词之间的间隔也必须与查询中的短语相同。
  • 适用于需要精确匹配短语的场景。
  • 例如,搜索 “Easysearch is powerful” 时,只有包含这个确切短语的文档才会被认为是匹配的。
{
  "query": {
    "match_phrase": {
      "content": "Easysearch  is powerful"
    }
  }
}

总结来说,match 更灵活,用于一般的关键词搜索,而 match_phrase 则用于需要精确匹配短语的搜索。

SQL 全文检索示例

我们先造一些数据,然后使用 SQL 来进行全文检索。

批量导入数据:

POST /table3/_bulk
{ "index": { "_id": 1 } }
{ "id": 1, "test": "The quick brown fox jumps over the lazy dog" }
{ "index": { "_id": 2 } }
{ "id": 2, "test": "Foxes are wild animals" }
{ "index": { "_id": 3 } }
{ "id": 3, "test": "Jump high to catch the ball" }
{ "index": { "_id": 4 } }
{ "id": 4, "test": "Some animals can jump very high" }
{ "index": { "_id": 5 } }
{ "id": 5, "test": "The lazy dog sleeps all day" }
{ "index": { "_id": 6 } }
{ "id": 6, "test": "The foxes jump all day" }

执行全文检索的 SQL 查询:

SELECT * FROM table3;

SELECT * FROM table3 WHERE match(test, 'jump');

SELECT * FROM table3 WHERE match_phrase(test, 'foxes jump');

总结

随着数据量的不断增加,高效的数据搜索和分析变得尤为重要。Elasticsearch 以其强大的全文搜索能力和灵活的数据处理能力成为行业标准。Easysearch 作为 Elasticsearch 的优化版本,不仅继承了其强大的功能,还在性能和安全性上做了进一步的提升,为企业提供了一个高效、稳定且易于迁移的搜索引擎解决方案。通过深入了解这些技术和实践其应用,开发者和企业能够更好地利用这些工具来应对现代数据挑战,推动业务的持续发展和创新。

关于 Easysearch 有奖征文活动

黑神话悟空

无论你是 Easysearch 的老用户,还是第一次听说这个名字,只要你对 INFINI Labs 旗下的 Easysearch 产品感兴趣,或者是希望了解 Easysearch,都可以参加这次活动。

详情查看:Easysearch 征文活动

作者:韩旭,亚马逊云技术支持,亚马逊云科技技领云博主,目前专注于云计算开发和大数据领域。

原文:https://infinilabs.cn/blog/2024/mastering-easysearch-syntax/

Easysearch 数据可视化和管理平台:INFINI Console 使用介绍

EasysearchINFINI Labs 小助手 发表了文章 • 0 个评论 • 2084 次浏览 • 2024-07-10 16:26 • 来自相关话题

上次在《INFINI Easysearch 尝鲜 Hands on》中,我们部署了两个节点的 Easysearch,并设置了 Console 进行集群监控。今天,我们将介绍 INFINI Console 的使用。

Dashboard

INFINI Console 是一个功能强大的数据管理和分析平台,其仪表盘页面提供了直观简洁的界面,使用户能够快速了解系统状态并进行管理操作。本文将详细介绍仪表盘页面的各项功能。

仪表盘顶部显示系统的实时告警、通知和待办事项的数量,当前数据显示:

  • 告警:0 条
  • 通知:0 条
  • 待办:0 条

在仪表盘的中心区域,用户可以看到几项关键的系统概览信息:

  • 集群数量:当前有 3 个集群正在运行。
  • 节点数量:系统中有 16 个节点。
  • 主机数量:共有 3 台主机。
  • 已用存储:系统已使用存储空间为 2.0GB。

仪表盘页面还提供了几个常用操作的快速入口,方便用户迅速访问常用功能:

  • 集群注册:用户可以通过此入口快速注册新的集群。
  • 数据探索:用户可以访问数据探索工具,对系统中的数据进行分析和查询。
  • 告警管理:提供对告警信息的管理功能,用户可以查看和处理告警。
  • 安全管理:安全管理入口帮助用户维护系统的安全设置和策略。

仪表盘右侧显示了集群的动态信息,包括最近的操作日志。例如:

  • 2024-07-03 22:43:43,index medcl 在 cluster infiniLabs 中的状态更新。
  • 2024-07-03 22:06:43,index medcl 在 cluster infiniLabs 中被创建。

集群管理页面

集群管理页面主要分为几个部分:顶部的功能选项卡、中部的集群列表、以及右侧的筛选和排序选项。

页面顶部的功能选项卡包括以下几项:

  • Clusters (集群):显示当前系统中的所有集群。
  • Nodes (节点):显示集群中的节点详细信息。
  • Indices (索引):显示集群中的索引信息。
  • Hosts (主机):显示系统中的主机信息。

集群列表展示了每个集群的详细信息,包括:

  • 集群名称:每个集群的名称,如 “infinilabs”、“mycluster”、“INFINI_SYSTEM (JeanGrey)”。
  • 集群健康状态:以颜色条的形式显示最近 14 天的集群健康状态(绿色表示健康,黄色表示有警告)。
  • 节点数量:集群中包含的节点数量。
  • 索引数量:集群中的索引数量。
  • 分片数量:集群中的分片数量。
  • 文档数量:集群中存储的文档数量。
  • 磁盘使用率:集群的磁盘使用情况。
  • JVM 堆内存使用率:集群的 JVM 堆内存使用情况。
  • 索引速率:当前集群的索引速率(每秒索引数)。
  • 搜索速率:当前集群的搜索速率(每秒搜索数)。

页面右侧提供了丰富的筛选和排序选项,可以根据以下条件筛选和排序集群:

  • 健康状态 (Health Status):根据集群的健康状态筛选,如绿色(健康)和黄色(警告)。
  • 分布 (Distribution):根据集群的分布类型筛选,如 “easysearch” 和 “elasticsearch”。
  • 版本 (Version):根据集群使用的软件版本筛选,如 Easysearch 1.8.2 和 Elasticsearch 7.10.2。
  • 区域 (Region):根据集群所在的区域筛选,如 “china” 和 “default”。
  • 标签 (Tags):根据自定义标签进行筛选。

接下来分别介绍节点、索引和主机层面的信息,这些监控指标与集群层面大同小异。

节点监控

索引监控

主机监控

包括了常规的 CPU、内存、磁盘、网络的监控。

监控指标页面

监控报表页面提供了对集群运行状况的详细监控和分析功能。用户可以选择最近 15 分钟、1 小时、24 小时等不同时间范围查看数据,并手动点击刷新按钮更新数据,以获取最新的监控信息。

概览信息

显示当前集群的基本状态,包括:

  • 集群名称:如 “infinilabs”。
  • 在线时长:如 “3 天”。
  • 集群版本:如 “1.8.2”。
  • 健康状态:如 “green”。
  • 节点数:如 “2”。
  • 索引数:如 “38”。
  • 主/总分片:如 “38/76”。
  • 未分配分片:如 “0”。
  • 文档数:如 “656,803”。
  • 存储空间:如 “1007.2MB/385.4GB”。
  • JVM 内存:如 “1023.0MB/2.0GB”。

监控报表页面还提供了多个性能指标的图表,包括:

索引吞吐 (doc/s)

  • Total Indexing:总索引吞吐量。
  • Primary Indexing:主分片的索引吞吐量。

查询吞吐 (query/s)

  • Total Query:总查询吞吐量。

索引延迟 (ms)

  • Indexing Latency:索引延迟时间。
  • Delete Latency:删除操作的延迟时间。

查询延迟 (ms)

  • Query Latency:查询延迟时间。
  • Fetch Latency:获取操作的延迟时间。
  • Scroll Latency:滚动操作的延迟时间。

点击“Advance”可以查看更多监控指标:

节点级别性能监控

包括 CPU、负载、JVM 内存、剩余使用空间及磁盘空间、集群启动时间和索引读写情况。

索引级别监控

包括集群内索引的数量、状态、主分片和副本分片数量、文档条数和占用空间。

集群动态页面

提供集群中各类事件和活动的详细记录和监控功能。

别名管理

别名管理页面提供了对索引别名的管理功能,使用户可以方便地管理和配置 Elasticsearch/EasySearch 的索引别名。

创建别名

可以通过 DSL 创建别名。例如,创建一个名为 my_index_alias 的别名指向 my_index

POST /_aliases
{
  "actions": [
    {
      "add": {
        "index": "my_index",
        "alias": "my_index_alias"
      }
    }
  ]
}

删除别名

删除一个别名同样可以通过 REST API 实现:

POST /_aliases
{
  "actions": [
    {
      "remove": {
        "index": "my_index",
        "alias": "my_index_alias"
      }
    }
  ]
}

索引轮换

索引轮换是一种常用的索引管理策略,特别适用于日志和时间序列数据的场景。通过索引轮换,用户可以在索引达到一定条件(如大小或文档数量)时,创建一个新的索引来继续存储数据,而旧的索引可以继续用于查询。

  1. 设置写别名:创建一个指向当前写入索引的别名,例如 current_write_index。
  2. 定义索引轮换条件:可以基于索引的大小、文档数量或时间来定义轮换条件。
  3. 索引并更新写别名指向这个新索引。

创建初始索引并设置写别名:

PUT /my_index-000001
{
  "aliases": {
    "current_write_index": {}
  }
}

使用 /_rollover API 定义轮换条件并执行轮换:

POST /current_write_index/_rollover
{
  "conditions": {
    "max_age": "7d",
    "max_docs": 1000000
  },
  "settings": {
    "number_of_shards": 1
  },
  "aliases": {
    "current_write_index": {}
  }
}

通过这种方式,查询操作可以透明地访问所有历史数据,而写操作总是指向最新的索引。

在 INFINI Console 中提供了可视化创建索引及别名的方式。页面右上角提供了新建按钮,用户可以通过点击该按钮创建新的索引别名,填写别名名称、关联索引、索引路由、搜索路由和过滤查询等配置。

平台监控

展示了多个关键指标的监控图表,包括:

  • 健康状态 (Health):显示系统当前的健康状态。如果没有数据,则显示“暂无数据”。
  • 引擎分布 (Engines):展示系统中不同搜索引擎的分布情况,例如 EasySearch 和 Elasticsearch 的比例。图表显示当前 EasySearch 占 67%,Elasticsearch 占 33%。
  • 提供商 (Providers):显示系统中使用的云服务提供商信息。在示例中,所有资源都托管在 AWS 上。
  • JDK 版本 (JDK):显示系统中使用的 JDK 版本信息。在示例中,所有节点都使用 JDK 版本 11.0.20。
  • 磁盘使用情况 (Disk Utilization) - Top 10:显示磁盘使用率最高的前 10 个节点。在示例中,easysearch-node1 和 easysearch-node2 的磁盘使用率均为 4%。
  • JVM 使用情况 (JVM Utilization) - Top 10:展示 JVM 使用率最高的前 10 个节点。在示例中,infinilabs 集群的 easysearch-node1 和 easysearch-node2 节点的 JVM 使用情况有详细的时间序列数据,显示了不同时间点的使用率变化。

我们还能够看到更多指标:

数据探索

在数据探索里,可以根据时间、字段等条件对索引或者视图下的数据进行搜索查询和分析,类似 Kibana 的 Discover。

这里可以看到集群的警报,目前集群运行良好,没有任何警报。

内部会预设一些警报规则,如下:

点进去一个请求,比如磁盘的警告,可以针对不同的使用量设置不同的警告级别和通知。

这里针对警报设置警报,可以看到现在支持很多平台,Discord、飞书、邮件、微信、Slack 以及钉钉。

点击进去可以查看,对于社交软件而言,其实是使用 Webhook 进行通知,除此之外也支持配置邮件服务器和自定义的 Webhook 进行通知。

开发工具

Console 的开发工具相当于 Kibana DevTool 的升级版,使用上基本没有大的区别,除了支持 DSL 之外,还支持多集群 Tab 切换、常用命令快速 Load、SQL 查询等。

集群连接凭证管理

可以看到连接这三个集群的凭证管理,目前都是有效的。

后台用户授权

可以添加用户以及修改 Console 管理界面的密码。目前设置了 admin 账号。

审计日志

追踪对集群的操作,捕获查看集群监控信息以及集群索引的操作。

结论

INFINI Console 的仪表盘页面集成了系统的关键信息和快捷操作入口,使用户可以高效地管理和监控系统。通过详细的概览信息、实时的告警通知、快速的功能入口和动态日志,用户能够对系统的运行状态一目了然,并快速响应各种管理需求。这个设计不仅提升了用户的工作效率,还确保了系统的安全和稳定运行。

INFINI Console 的集群管理页面提供了对系统集群的全面监控和管理功能。通过详细的集群信息展示、便捷的功能选项卡切换以及丰富的筛选和排序功能,用户可以高效地管理和监控系统中的集群状态。这不仅提升了运维效率,还确保了系统的稳定运行和高效管理。

INFINI Console 的节点管理页面提供了对集群节点的全面监控和管理功能。通过详细的节点信息展示、便捷的功能选项卡切换以及丰富的筛选和搜索功能,用户可以高效地管理和监控系统中的节点状态,从而提升运维效率,确保系统的稳定运行和高效管理。

INFINI Console 的监控报表页面提供了对集群运行状况的全面监控和分析功能。通过详细的概览信息和多个性能指标图表,用户可以高效地监控和管理集群的运行状态。这不仅提升了系统运维效率,还确保了集群的稳定运行和高效管理。

通过这些功能,INFINI Console 为用户提供了全面的系统管理工具,帮助他们高效地应对各种运维挑战,确保系统的高效、安全、稳定运行。

关于 Easysearch 有奖征文活动

黑神话悟空

无论你是 Easysearch 的老用户,还是第一次听说这个名字,只要你对 INFINI Labs 旗下的 Easysearch 产品感兴趣,或者是希望了解 Easysearch,都可以参加这次活动。

详情查看:Easysearch 征文活动

作者:韩旭,亚马逊云技术支持,亚马逊云科技技领云博主,目前专注于云计算开发和大数据领域。

原文:https://blog.csdn.net/weixin_38781498/article/details/140077785

INFINI Easysearch 尝鲜 Hands on

EasysearchINFINI Labs 小助手 发表了文章 • 0 个评论 • 1971 次浏览 • 2024-07-10 14:43 • 来自相关话题

INFINI Easysearch 是一个分布式的近实时搜索与分析引擎,核心引擎基于开源的 Apache Lucene。Easysearch 的目标是提供一个自主可控的轻量级的 Elasticsearch 可替代版本,并继续完善和支持更多的企业级功能。与 Elasticsearch 相比,Easysearch 更关注在搜索业务场景的优化和继续保持其产品的简洁与易用性。

Easysearch 支持原生 Elasticsearch 的 DSL 查询语法,确保原业务代码无需调整即可无缝迁移。同时,极限科技还支持 SQL 查询,为熟悉 SQL 的开发人员提供更加便捷的数据分析方式。此外,Easysearch 兼容 Elasticsearch 的 SDK 和现有索引存储格式,支持冷热架构和索引生命周期管理,确保用户能够轻松实现数据的无缝衔接。

安装

安装脚本

无论是 Linux 还是 Mac 都是这个一键脚本

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

同时也提供了二进制的安装包:

如果不想整理 JAVA 环境问题,还可以使用这个 https://release.infinilabs.com/easysearch/stable/bundle/

docker 部署

官方提供了 Docker Compose 样例,包括三个服务:

  • easysearch-node1
  • easysearch-node2
  • console

以下是详细说明:

版本控制:

  • version: '3' 表示使用 Docker Compose 文件的第 3 版格式。

服务定义:

  • easysearch-node1 和 easysearch-node2:

    • 这两个服务使用相同的 Docker 镜像 infinilabs/easysearch:latest 来组成双节点的集群。
    • 容器运行时使用用户和组 ID 602:602。
    • 设置了 ES_JAVA_OPTS 环境变量以配置 Java 虚拟机的内存。
    • ulimits 选项配置了内存锁定和文件描述符的限制,以提升性能。
    • 容器内的配置、数据和日志目录通过卷映射到主机目录中,以便于数据持久化。
    • 服务暴露特定端口,使外部能够访问容器中的服务。
    • 两个节点均加入名为 esnet 的自定义网络中。
  • console:

    • 该服务使用镜像 infinilabs/console:1.26.0-1552(该镜像没有 latest,需要手动把 latest 更改位特定的版本号)。
    • 同样通过卷将数据和日志目录映射到主机。
    • 暴露 9000 端口用于 Web 界面访问。
    • 使用 links 功能链接到 easysearch-node1 和 easysearch-node2,简化容器之间的通信。
    • 设置了时区环境变量 TZ 为 Asia/Shanghai。

网络配置:

  • esnet 网络使用 bridge 驱动,提供一个隔离的网络环境,配置了特定的子网 172.24.0.0/16,以确保服务之间的网络通信。
version: '3'
  services:
    easysearch-node1:
      user: "602:602"
      image: infinilabs/easysearch:latest
      container_name: easysearch-node1
      hostname: easysearch-node1
      environment:
        - "ES_JAVA_OPTS=-Xms1g -Xmx1g"
      ulimits:
        memlock:
          soft: -1
          hard: -1
        nofile:
          soft: 65536
          hard: 65536
      volumes:
        - $PWD/ezs1/config:/app/easysearch/config
        - $PWD/ezs1/data:/app/easysearch/data
        - $PWD/ezs1/logs:/app/easysearch/logs
      ports:
        - 9201:9200
        - 9301:9300
      networks:
        - esnet
    easysearch-node2:
      user: "602:602"
      image: infinilabs/easysearch:latest
      container_name: easysearch-node2
      hostname: easysearch-node2
      environment:
        - "ES_JAVA_OPTS=-Xms1g -Xmx1g"
      ulimits:
        memlock:
          soft: -1
          hard: -1
        nofile:
          soft: 65536
          hard: 65536
      volumes:
        - $PWD/ezs2/config:/app/easysearch/config
        - $PWD/ezs2/data:/app/easysearch/data
        - $PWD/ezs2/logs:/app/easysearch/logs
      ports:
        - 9202:9200
        - 9302:9300
      networks:
        - esnet
    console:
      image: infinilabs/console:1.26.0-1552
      container_name: console
      hostname: console
      volumes:
        - $PWD/console/data:/data
        - $PWD/console/log:/log
      networks:
        - esnet
      ports:
        - 9000:9000
      links:
        - easysearch-node1:es1
        - easysearch-node2:es2
      environment:
        - TZ=Asia/Shanghai

  networks:
    esnet:
      driver: bridge
      ipam:
        config:
          - subnet: 172.24.0.0/16

尽管在这里官方提供了详细的命令,完全可以使用这个 docker-compose up 来进行替代。其他的脚本解释如下:

init.sh

#!/bin/bash

# 获取当前脚本所在目录的绝对路径

CUR_DIR=$(cd $(dirname $0); pwd)

# 创建必要的目录结构

mkdir -p $CUR_DIR/console/{data,log}
mkdir -p $CUR_DIR/{ezs1,ezs2}/{data,logs}

# 设置目录的拥有者和权限

chown -R 1000:1000 $CUR_DIR/console
chown -R 602:602 $CUR_DIR/{ezs1,ezs2}
chmod -R 0600 $CUR_DIR/{ezs1,ezs2}/config

# 设置 config 目录的子目录权限

find $CUR_DIR/{ezs1,ezs2}/config -type d -print0 | xargs -0 chmod 750

reset.sh

#!/bin/bash

# 获取当前脚本所在目录的绝对路径

CUR_DIR=$(cd $(dirname $0); pwd)

# 定义确认函数
function confirm() {
  display_str=$1
  default_ans=$2
  if [[ $default_ans == 'y/N' ]]; then
     must_match='[yY]'
  else
     must_match='[nN]'
  fi
  read -p"${display_str} [${default_ans}]:" ans
  [[ $ans == $must_match ]]
}

# 提示用户确认删除所有数据
confirm "RISK WARN: Delete all data!!!" 'y/N' && echo || exit

# 删除 console、ezs1 和 ezs2 的数据和日志文件
rm -rvf $CUR_DIR/console/{data,log}/*
rm -rvf $CUR_DIR/{ezs1,ezs2}/{data,logs}/*

start.sh

#!/bin/bash

# 使用 Docker Compose 启动 ezs2 项目中的服务
docker-compose -p ezs2 up

stop.sh

#!/bin/bash

# 使用 Docker Compose 关闭并移除 ezs2 项目中的所有服务

docker-compose -p ezs2 down

在我的电脑中,可以看到成功启动的容器。

https://infinilabs.cn/docs/latest/easysearch/getting-started/install/docker-compose/

Console 连接

设置集群连接参数,比如域名端口,用户名密码。

初始化,这里会新建索引,写一些 sample 数据。

设置后台管理的密码,后期使用这个登录控制台。

检查配置,完成集群关联。

这个是后台管理界面,除了用户名密码之外,也支持单点登录:

跨引擎、跨版本、跨集群 独一份!

使用自带的面板进行查看节点数量:

同时也支持 REST 风格的 API 来进行查询。

接下来使用 Console 连接 Amazon 的 OpenSearch:

同样是输入集群的 URL,用户名和密码。

然后可以拿到集群的信息,比如地址,版本号,集群状态,节点数量。

最后看到连接成功的信息。

我们可以在集群管理中看到 Easysearch 的集群和我们刚刚添加的 OpenSearch 集群。

是否开源?目前还没有开放源代码。

关于 Easysearch 有奖征文活动

黑神话悟空

无论你是 Easysearch 的老用户,还是第一次听说这个名字,只要你对 INFINI Labs 旗下的 Easysearch 产品感兴趣,或者是希望了解 Easysearch,都可以参加这次活动。

详情查看:Easysearch 征文活动

作者:韩旭,亚马逊云技术支持,亚马逊云科技技领云博主,目前专注于云计算开发和大数据领域。

原文:https://blog.csdn.net/weixin_38781498/article/details/140077785

【搜索客社区日报】第1854期 (2024-07-08)

社区日报searchkit 发表了文章 • 0 个评论 • 1988 次浏览 • 2024-07-08 20:33 • 来自相关话题

1. Easysearch 数据可视化和管理平台:INFINI Console 使用介绍 | 征文系列 https://mp.weixin.qq.com/s/4JuN2xFLv8nrtbBiRG3-kw 2. 认识新的 Google AI 助手 Gemini https://www.sqlservercentral.c ... emini 3. 理解和实施 Medprompt https://towardsdatascience.com ... 77c91 4. 人工智能中的性别偏见简介 https://thegradient.pub/gender-bias-in-ai/ 5. GraphRAG:用于复杂数据发现的新工具现已在 GitHub 上发布 https://www.microsoft.com/en-u ... thub/ 编辑:Muse  更多资讯:http://news.searchkit.cn

【搜索客社区日报】第1853期 (2024-07-05)

社区日报Fred2000 发表了文章 • 0 个评论 • 1805 次浏览 • 2024-07-05 09:26 • 来自相关话题

Gitee 两大指标超越 GitHub,携手中国开源共绘新篇章 https://mp.weixin.qq.com/s/J92AOb9HGQDb4FqqJUPGhQ 前沿重器[51] | 聊聊搜索系统4:query理解 https://mp.weixin.qq.com/s/R4njGbiz_yT0wqN4by0uDg Elasticsearch 是什么?工作原理是怎么样的? https://mp.weixin.qq.com/s/UXzFg6LbHCifeObiLsXAMA INFINI Easysearch 尝鲜 Hands on https://mp.weixin.qq.com/s/OLdD3KkgXK5Q4e2RDzMD8Q 编辑:Fred  更多资讯:http://news.searchkit.cn
Gitee 两大指标超越 GitHub,携手中国开源共绘新篇章 https://mp.weixin.qq.com/s/J92AOb9HGQDb4FqqJUPGhQ 前沿重器[51] | 聊聊搜索系统4:query理解 https://mp.weixin.qq.com/s/R4njGbiz_yT0wqN4by0uDg Elasticsearch 是什么?工作原理是怎么样的? https://mp.weixin.qq.com/s/UXzFg6LbHCifeObiLsXAMA INFINI Easysearch 尝鲜 Hands on https://mp.weixin.qq.com/s/OLdD3KkgXK5Q4e2RDzMD8Q 编辑:Fred  更多资讯:http://news.searchkit.cn

搜索型数据库的技术发展历程与趋势前瞻

资讯动态INFINI Labs 小助手 发表了文章 • 0 个评论 • 1926 次浏览 • 2024-06-26 13:13 • 来自相关话题

概述

随着数字科技的飞速发展和信息量的爆炸性增长,搜索引擎已成为我们获取信息的首选途径之一,典型的代表厂商如 Google。然而,随着用户需求的不断演变,传统的搜索技术已经无法满足人们对信息的实时性、个性化和多样性的需求。

在企业内部,这种需求更加显著。随着企业数字化转型的持续深化,非结构化数据正日益成为各类组织数据增长的主要来源,也是数据体系中至关重要的组成部分,蕴含着巨大的价值。如何高效地存储和利用非结构化数据的重要性也日益凸显。企业需要更高效地管理和检索内部的海量数据,以支持业务决策和运营需求。

据 IDC 数据预计,到 2025 年,80%的数据将是非结构化数据;而根据 Gartner 的数据显示,从 2019 年到 2024 年,非结构化数据容量预计将增加两倍。然而,目前非结构化数据面临着表现形式多样、管理复杂性高、价值挖掘难度大等诸多挑战。传统的数据库系统往往无法满足企业对实时性和多样性的搜索需求,为了解决这些挑战,以自动分词、倒排索引、相关度计算、向量检索引擎等技术为核心构建的搜索型数据库应运而生。这些数据库自上世纪 90 年代诞生以来不断发展演进,正在成为数据库领域中不可或缺的一个重要分支。

什么是搜索型数据库?

搜索型数据库早期又称全文数据库,或者企业搜索引擎,是一种专门用于存储和管理大规模文本数据,并支持高效的文本搜索和信息检索的数据库系统,不过随着技术不断发展和应用场景日益丰富,目前搜索型数据库不仅仅可以处理长文本数据,也可以处理常见的数值、日期等结构化数据,IP、地理位置信息、图片、音视频等非结构化数据,搜索型数据库的应用范畴不断拓展,正在由支撑业务系统检索加速、IT 运维可观测性、聚合查询分析等向多场景、多模态数据搜索方向发展。

典型的搜索数据库一般具有以下特点:

  1. 灵活的索引能力:搜索数据库能够处理多种类型的数据,包括文本、图像、音频、视频等非结构化数据。它们采用自动分词、倒排索引等技术,能够高效地处理不同格式和类型的数据,提供灵活的搜索和检索功能。
  2. 高效的查询性能:搜索数据库具有高效的查询处理能力,能够快速索引和检索大规模的数据。借助优化的索引结构和查询算法,搜索数据库能够在短时间内准确地返回与查询相关的结果,提高用户的搜索效率,常用于解决关系型数据库的高并发检索需求。
  3. 支持复杂的搜索功能:搜索数据库提供多样化的搜索功能,包括全文检索、模糊搜索、精确搜索、范围搜索、向量搜索、地理信息检索等。用户可以根据不同的需求和场景,灵活地选择和组合不同的搜索功能,以获取符合期望的搜索结果。
  4. 高性能和可扩展性:搜索数据库具有高性能和可扩展性的特点,能够处理大规模数据和高并发访问。它们采用分布式架构和并行计算技术,实现了水平扩展,能够满足不断增长的数据量和用户访问量的需求。

综上所述,搜索数据库具有处理非结构化数据、实时搜索和更新、多样化的搜索功能、个性化推荐和智能搜索、高性能和可扩展性、全面的搜索结果展示等特点,是处理大规模数据和提供高效搜索服务的重要工具。

搜索型数据库的应用场景

搜索型数据库在各行各业都有广泛的应用,以下是一些典型的应用场景:

  1. 零售和电商:在零售和电商行业,搜索型数据库被广泛应用于产品搜索和推荐系统中。通过搜索功能,顾客可以轻松查找所需商品,而个性化推荐系统则可以根据用户的搜索历史和行为习惯推荐相关的产品,提高购物体验和交易转化率。
  2. 医疗保健:在医疗保健行业,搜索型数据库被用于医学文献检索、疾病诊断和药物搜索等方面。医生和研究人员可以利用搜索功能找到相关的医学文献和研究成果,帮助诊断疾病和制定治疗方案。
  3. 金融服务:在金融服务行业,搜索型数据库被用于金融数据检索、市场分析和投资决策等方面。投资者可以通过搜索功能查找相关的金融数据和市场资讯,帮助他们做出更加准确的投资决策。
  4. 制造业:在制造业中,搜索型数据库被用于生产过程监控、质量控制和故障诊断等方面。工程师可以利用搜索功能查找相关的生产数据和技术资料,帮助他们解决生产中的问题和挑战。
  5. 媒体和娱乐:在媒体和娱乐行业,搜索型数据库被用于内容检索、版权管理和用户推荐等方面。用户可以通过搜索功能查找感兴趣的新闻、音乐和视频等内容,而个性化推荐系统则可以根据用户的搜索历史和偏好推荐相关的内容。
  6. 教育和培训:在教育和培训行业,搜索型数据库被用于学习资源检索、课程管理和学习分析等方面。学生和教师可以利用搜索功能查找相关的学习资源和课程内容,而学习分析系统则可以分析学生的搜索行为和学习表现,为教学提供参考和支持。
  7. IT 运维可观测性:通过搜索型数据库,可以实时监控系统的运行状况、性能指标和日志数据,帮助运维团队及时发现和解决系统故障、性能问题和异常情况,确保系统的稳定运行。
  8. 安全监测和威胁检测:利用搜索型数据库对系统的安全日志进行审计和监控,监测用户的访问行为和系统操作,及时发现异常行为和安全事件。同时,搜索型数据库还可以与威胁情报数据集成,对内部日志数据进行关联分析,快速识别并应对各种安全威胁和攻击行为,保障系统和数据的安全。

综上所述,搜索型数据库在各行各业都发挥着重要作用,数据规模从 GB 到 PB 不等,体现在生活中的方方面面,为用户提供了高效、准确和个性化的信息搜索和检索服务,推动了各行业的发展和进步。随着搜索技术的不断创新和发展,搜索型数据库在各行业中的应用将会越来越广泛,并持续为用户带来更加便捷和智能的搜索体验。

搜索型数据库的发展历程

搜索型数据库的发展历程可以概括如下四个阶段:

  1. 起步阶段(1990 年代):搜索数据库的雏形开始于上世纪 90 年代,当时以全文检索为主要技术手段,最初用于文档检索和网络搜索。典型代表包括 AltaVista、Excite 等。
  2. 技术突破(2000 年代):随着互联网的快速发展,搜索数据库开始应用于更多领域,如电子商务、社交网络等。Lucene、Sphinx 等开源搜索引擎的出现推动了搜索技术的进步。
  3. 商业化发展(2010 年代):搜索数据库进入商业化阶段,以 Elasticsearch 等为代表的商业搜索引擎崭露头角。企业开始大规模应用搜索数据库来管理和检索大量数据。
  4. 智能化转型(2020 年代):随着人工智能技术的发展,搜索数据库逐渐向智能化转型,开始引入机器学习、自然语言处理等技术,提供个性化推荐和智能搜索服务。同时,搜索数据库也在更多领域得到应用,如医疗保健、金融服务等。

    综上所述,搜索数据库经历了从起步阶段到技术突破、商业化发展再到智能化转型的发展历程,表明了其在信息检索领域的重要性和不断演进的趋势,不并断推动着搜索技术的进步和应用范围的扩展。随着人工智能技术的不断成熟,搜索数据库将会在智能化、个性化等方面取得更大的进步,为用户提供更加优质的搜索体验。

搜索型数据库的发展情况

搜索型数据库市场上已经有不少成熟的产品和厂商,但是总的来说,搜索型数据库的界限范围有点模糊,当然其他数据库也有同样的问题,有很多数据库既是文档数据库,又是多模态数据库,还是向量数据库等等,而常见的搜索型数据库主要诞生于:

  • 由搜索引擎内核库发展而来的搜索数据库,如 Elasticsearch
  • 由其他数据库扩展而来的搜索数据库,如 Postgres Full-Text Search
  • 从零开始整体设计的搜索数据库:如 INFINI Pizza

通过流行的 DB-Engines 的搜索引擎排行榜,可以初探国外主流的搜索型数据库的流行趋势,如下图:

可以看到 Elastic 公司的 Elasticsearch 还是依旧保持强悍,自从 Elasticsearch 十多年前掀翻了 Splunk 的桌子,硬生生的在日志领域杀出一条新路,随后大杀四方,碾压整个搜索行业,霸榜至今。Elastic 商业化增长稳健,2023 年收入超过 10 亿美金。

OpenSearch 是由 AWS 发起的 Elasticsearch 开源分支,起因是由于 Elastic 针对云厂商采取的协议变更为 Elastic+SSPL,OpenSearch 基于 Apache 2.0 协议的 Elasticsearch 7.10 版本衍生而来,目前也具备了一定的用户基础。

Splunk 是一款用于搜索、监控和分析大规模机器生成的数据的软件平台,主要用于日志和安全分析领域,属于商业闭源产品。2023 年中被思科(Cisco) 以 230 亿美元现金收购,瞬间刷爆朋友圈。另外有意思的是,前四名除了 Splunk,底层都是 Lucene 内核。

MarkLogic 成立于 2001 年,自我定位是一个 NoSQL 多模态数据库厂商,也是商业闭源软件,生态成熟但是系统过于复杂,学习曲线较陡, 2023 年初被 Progress Software 以 3.55 亿美元收购算是一个比较好的结局。

当然了,除了榜上的这些产品,还有很多优秀的挑战者正摩拳擦掌,跃跃欲试。如下面的这些项目: vespa、Rockset、Doris,Clickhouse、quickwit、Pinot、SingleStore、qdrant、milvus、algolia、meilisearch、typesense、Manticore Search 等等。这些项目不一定都是自己定位是搜索型数据库,有侧重在 AI 领域的,有侧重在实时分析领域的等等,可谓各有千秋,不过都具备一定的搜索和分析能力,不出意外,基本上每家都要号称吊打 Elasticsearch 一番。

国内搜索型数据库的发展情况

搜索型数据库已经成为企业事实上的重要基础设施,而国内搜索型数据库的发展近些年也是开始得到重视,2023 年初,由中国信通院云计算与大数据研究所牵头,依托中国通信标准化协会大数据技术标准推进委员会,联合拓尔思、极限科技、星环科技等 30 余家企业编制的《搜索型数据库技术要求》正式出炉,该标准已成为行业内搜索型数据库技术选型和产品开发的风向标,极限科技的 INFINI Easysearch 率先通过了该标准

墨天轮社区也开辟了搜索型数据库的排行榜,共有 6 家企业的产品上榜:

国内搜索型数据库的市场还在起步阶段,厂商和可选的产品也还比较少,不过随着市场的成熟,相信未来将迎来一波高速的发展。

搜索型数据库的趋势前瞻

技术在演变,场景在演变,数据也在演变,搜索数据库领域的发展也呈现出多个显著的趋势,这些趋势将进一步推动搜索技术的演进和应用范围的扩展。笔者观测到的主要的发展趋势包括以下方向供参考:

1. 趋势一:实时搜索与分析

  • 实时搜索是搜索数据库领域的一个重要发展趋势,业务应用都在朝实时方向演进,用户对信息的即时性需求不断增加,要求搜索结果能够及时反映最新的数据和内容。

  • 实时搜索技术通过实时索引和实时更新机制,能够实现快速的数据检索和更新,提供与时俱进的搜索结果,满足用户对信息的即时性需求。

  • 目前以 Lucene 为内核的搜索型数据库基本上都只能做到 NRT(近实时)搜索,并且频繁更新带来的挑战和资源的浪费比较高,如果能做到更高效的实时性,可以大大提升用户的搜索体验和实时决策能力。

2. 趋势二:多模态混合搜索

  • 多模态搜索是指在搜索过程中同时考虑多种信息形式,如文本、图像、视频等,以提高搜索结果的准确性和全面性。

  • 这种技术能够通过分析和理解多种信息形式之间的关联性,为用户提供更加全面、丰富的搜索结果,适用于需要综合不同媒体形式的搜索场景。

  • 现实世界的数据越来越复杂化,非结构化数据的利用的场景也越来越多,多模态可以为业务提供更加灵活的分析和探索能力,混合搜索的能力非常具有吸引力。

3. 趋势三:AI 智能语义搜索

  • 大模型、AI 智能搜索技术的探索可谓是一日千里,通过利用人工智能技术来实现搜索过程中的智能化、语义化和个性化,结合自然语言处理、机器学习等技术分析用户意图,提供更加智能、个性化的搜索服务。

  • 随着大模型的兴起,搜索数据库开始采用像 RAG(Retriever-Reader for Generative Question Answering)这样的大型预训练模型来提升搜索的效果。RAG 模型结合了检索器和阅读器的功能,能够实现更加准确和全面的搜索结果,为用户提供更加智能和个性化的搜索服务。

  • 搜索型数据库可谓是 AI 落地最好的是试验田,Elasticsearch 通过拥抱 AI 和大模型,目前股价又重回巅峰,可喜可贺。

4. 趋势四:云原生、存算分离、Serverless

  • 随着云计算技术的发展,搜索数据库正逐渐向云原生架构转变。云原生搜索数据库利用容器化、微服务架构等技术,实现了更高的灵活性、可扩展性和容错性,为企业提供了更加稳定和高效的搜索服务,并且成本更低,更加弹性。

  • 存算分离是搜索数据库发展的另一重要趋势。通过将存储与计算分离,搜索数据库可以更好地适应数据存储和计算需求的变化,提高系统的性能和效率。存算分离技术使得搜索数据库能够实现更高的并发访问和更快的数据处理速度,为用户提供更加流畅和稳定的搜索体验。

  • Serverless 提供开箱即用的体验,成本更低,使用更加灵活,也是目前很多搜索服务提供商正在积极探索的方向。

5. 趋势五:增强现实搜索

  • 随着增强现实技术的发展,尤其是 Apple 发布的头戴式 Vision Pro,一部革命性的空间运算设备,将数位内容无缝融入实体世界,而搜索技术也将逐渐与增强现实相结合,为用户提供更加直观和沉浸式的搜索体验。增强现实搜索能够将搜索结果与现实世界相结合,结合 AI 技术为用户提供更加个性化和便捷的搜索服务,这是一个全新的领域,也意味着巨大的机会。

6. 趋势六:现代硬件的高效利用

  • 现代硬件及软件运行环境已发生翻天覆地的变化, 片上计算,边缘计算,FPGA,DPU,GPU,一台设备几百核上 TB 内存已经成为现实,可运行之上的软件却还是停留在几十年前的架构。 如 Elasticsearch 其核心 Lucene(及类似实现) 是在 1997 建立的,距今已有 27 年了,虽然也在与时俱进,但是部分架构和设计理念已不具备先进性。

  • 在现代的硬件上采用更先进的算法,更新的数据结构、更新的设计理论,利用最新的 CPU 指令集,向量化,批处理,充分发挥多核、大内存和 SSD 的优势,从而达到更高的效率,更低的成本,去解决之前不可能实现的问题,大有可为,也是下一代引擎需要关注的方向。

随着各类数据库功能的边界越来越模糊,应用场景高度交叉重叠,市场竞争也变得白热化,不过笔者认为垂直领域的搜索型数据库机会还是很大,而想做大而全的数据库产品已经没有太多的市场生存空间,一定要在垂直领域有特别专注的地方,我们 INFINI Labs 正在基于 Rust 研发的下一代搜索引擎 INFINI Pizza,就侧重于面向终端用户场景,解决海量数据更新情况下,同时满足高并发和低延迟的核心业务实时检索需求。

总结

综上所述,搜索数据库领域正处于快速发展的阶段。随着互联网数据量的不断增长和用户需求的不断变化,搜索数据库技术将不断创新和进步,以满足用户对信息获取的更加即时、个性化和多样化的需求。未来,随着人工智能技术的进一步发展和应用,搜索数据库将会变得更加智能化、普及化和多样化,为用户提供更加高效、准确和个性化的搜索服务,推动互联网信息的更加便捷获取和利用。

关于极限科技(INFINI Labs)

INFINI Labs

极限科技,全称极限数据(北京)科技有限公司,是一家专注于实时搜索与数据分析的软件公司。旗下品牌极限实验室(INFINI Labs)致力于打造极致易用的数据探索与分析体验。

极限科技是一支年轻的团队,采用天然分布式的方式来进行远程协作,员工分布在全球各地,希望通过努力成为中国乃至全球企业大数据实时搜索分析产品的首选,为中国技术品牌输出添砖加瓦。

官网:https://infinilabs.cn

联系我们

原文:https://infinilabs.cn/blog/2024/the-technological-development-and-future-trends-of-search-oriented-databases/

【搜索客社区日报】第1843期 (2024-06-21)

社区日报Fred2000 发表了文章 • 0 个评论 • 1762 次浏览 • 2024-06-22 23:57 • 来自相关话题

1、一文带你搞清楚AI领域的高频术语!RAG、Agent、知识库、向量数据库、知识图谱、Prompt...都是在讲啥? https://mp.weixin.qq.com/s/HjvPTPdkBvqJrpomDvZjRg 2、Elasticsearch 的基数统计在大数据量下有什么办法能做到 100% 准确度吗? https://mp.weixin.qq.com/s/iVqIKAwFFKEOkw5bL3QfGA 3、How AI Will Change the World of Search https://opster.com/blogs/how-a ... arch/ 4、INFINI Labs 推出开源项目与教育机构免费许可证计划,可申请 Easysearch 等产品企业版。 https://infinilabs.cn/community/ 编辑:Fred  更多资讯:http://news.searchkit.cn
1、一文带你搞清楚AI领域的高频术语!RAG、Agent、知识库、向量数据库、知识图谱、Prompt...都是在讲啥? https://mp.weixin.qq.com/s/HjvPTPdkBvqJrpomDvZjRg 2、Elasticsearch 的基数统计在大数据量下有什么办法能做到 100% 准确度吗? https://mp.weixin.qq.com/s/iVqIKAwFFKEOkw5bL3QfGA 3、How AI Will Change the World of Search https://opster.com/blogs/how-a ... arch/ 4、INFINI Labs 推出开源项目与教育机构免费许可证计划,可申请 Easysearch 等产品企业版。 https://infinilabs.cn/community/ 编辑:Fred  更多资讯:http://news.searchkit.cn

INFINI Labs 助力开源与教育:免费许可证计划全面升级

开源项目INFINI Labs 小助手 发表了文章 • 0 个评论 • 2040 次浏览 • 2024-06-19 17:21 • 来自相关话题

免费许可证计划

在数字化浪潮席卷全球的今天,INFINI Labs 深刻认识到开源项目和教育机构在技术创新与人才培养中的核心作用。因此,我们郑重推出全新升级的免费许可证计划,旨在全球范围内为开源社区和教育界提供有力支持,共同推动软件生态的繁荣与进步。

一、产品实力与荣誉

1.INFINI Pizza:实时搜索的新纪元

INFINI Pizza

  • 第十三届“数据技术嘉年华”(DTC2024)上,INFINI Labs 发布了划时代的搜索引擎——INFINI Pizza,标志着搜索型数据库迈入实时搜索的新纪元。
  • INFINI Pizza 凭借先进的设计理念与架构,以及独有的专利技术,实现了对海量数据的无限伸缩,提供高效、准确的实时数据搜索能力

2.行业标杆案例

  • INFINI Labs 荣获中国信通院大数据“星河”标杆案例,其中移动云搜索数据库案例更是荣选为数据库标杆案例。
  • 该案例基于移动云 Easysearch 数据库,通过创新的多集群协同模式,实现了数据高性能存取,展现出极高的经济价值与社会价值。

3.国家发明专利认可

  • INFINI Labs 的多项自主研发技术获得国家发明专利授权,这些成果彰显了公司在大数据领域的技术实力与创新精神。

二、品牌与行业地位

  • INFINI Labs 作为搜索型数据库产品领域的领军企业,积极参与行业标准的制定与推动。

  • 其核心产品 INFINI Easysearch 荣获信通院首批可信搜索型数据库产品证书,再次印证了公司在行业中的领先地位。

三、产品介绍

Products

  1. INFINI Easysearch:作为 Elasticsearch 的国产化替代方案,提供高度兼容性与卓越性能,满足企业级需求。

  2. INFINI Console:轻量级多集群、跨版本搜索基础设施统一管控平台,助力企业高效管理搜索集群。

  3. INFINI Gateway:专为 Elasticsearch 打造的高性能应用网关,提供丰富的功能特性与卓越性能。

  4. INFINI Loadgen:支持多种搜索引擎的轻量级压测工具,为企业提供强大的数据加载与测试能力。

  5. INFINI Pizza:引领实时搜索时代的新星,为企业提供高效、准确的实时数据搜索解决方案。

四、免费许可证计划

1.教育机构学术许可证

  • 面向全球公立或私立学校、职业学校、大学等教育机构,提供非商业用途的软件使用许可。

  • 有效期一年,符合条件的教育机构可继续申请。

2.开源项目许可证

  • 面向非商业开源项目开发者,要求项目拥有活跃社区并在其官网添加 INFINI Labs 的链接。

  • 许可证免费,有效期一年,符合条件的项目可继续申请。

五、申请方式

符合条件的开源项目和教育机构可通过访问 INFINI Labs 官方网站,轻松提交申请,我们将尽快审核并回复。

申请链接:https://infinilabs.cn/community

六、结语

INFINI Labs 以全新升级的免费许可证计划为契机,与全球开源社区和教育界携手合作,共同推动软件生态的创新与发展。让我们共同迎接更加美好的未来!

七、关于极限科技(INFINI Labs)

INFINI Labs

极限科技,全称极限数据(北京)科技有限公司,是一家专注于实时搜索与数据分析的软件公司。旗下品牌极限实验室(INFINI Labs)致力于打造极致易用的数据探索与分析体验。

极限科技是一支年轻的团队,采用天然分布式的方式来进行远程协作,员工分布在全球各地,希望通过努力成为中国乃至全球企业大数据实时搜索分析产品的首选,为中国技术品牌输出添砖加瓦。

官网:https://www.infinilabs.cn

联系我们

原文:https://infinilabs.cn/blog/2024/infini-labs-for-open-source-education-the-free-license-program-upgrades/

INFINI Labs 产品更新 | Easysearch 1.8.2 发布优化 CCR 性能

Easysearchliaosy 发表了文章 • 0 个评论 • 2191 次浏览 • 2024-06-09 12:52 • 来自相关话题

release

INFINI Labs 产品又更新啦~,包括 Easysearch v1.8.2、Gateway、Console、Agent、Loadgen v1.26.0。本次各产品更新了很多亮点功能,如 Easysearch 优化 CCR 同步性能;Gateway 增加了 HTTP 请求动态域名路由功能,移除了安全相关的 Filter,进一步提升 Gateway 稳定性;Console 修复了多个已知问题,如当文档数过亿时单位换算错误,修复了因采集延迟导致指标图表显示异常,修复了多行查询中包含 SQL 查询异常等问题。欢迎大家下载体验。

以下是本次更新的详细说明。

INFINI Easysearch v1.8.2

INFINI Easysearch 是一个分布式的近实时搜索与分析引擎,核心引擎基于开源的 Apache Lucene。Easysearch 的目标是提供一个轻量级的 Elasticsearch 可替代版本,并继续完善和支持更多的企业级功能。

Easysearch 本次更新如下:

Bug fix

  • 修复 source_reuse 与 object 字段为 enable: false 时的冲突

Improvements

  • 升级部分依赖包版本,Commons-collections to 3.2.2, Snakeyaml to 2.0
  • 优化 CCR 同步性能及调整 CCR 全局配置参数
  • 优化插件配置命名,去除"plugins."
  • 优化配置文件目录获取命名

INFINI Console v1.26.0

INFINI Console 是一款非常轻量级的多集群、跨版本的搜索基础设施统一管控平台。通过对流行的搜索引擎基础设施进行跨版本、多集群的集中纳管, 企业可以快速方便的统一管理企业内部的不同版本的多套搜索集群。

Console 在线体验: http://demo.infini.cloud (用户名/密码:readonly/readonly)。

Console 本次更新如下:

Bug fix

  • 修复监控数据布局
  • 修复命令存储权限
  • 修复多行请求包含 SQL 语法
  • 修复文档数过亿时换算错误
  • 修复导入低版本 v1.6.0 告警规则缺少字段问题
  • 修复当 buck_size 小于 60 秒时,因指标采集延迟导致指标显示异常问题

INFINI Gateway v1.26.0

INFINI Gateway 是一个面向搜索场景的高性能数据网关,所有请求都经过网关处理后再转发到后端的搜索业务集群。基于 INFINI Gateway 可以实现索引级别的限速限流、常见查询的缓存加速、查询请求的审计、查询结果的动态修改等等。

Gateway 本次更新如下:

Improvements

  • feat: add wildcard_domain filter
  • chore: remove security filter and translog_viewer

INFINI Framework

INFINI Framework 是 INFINI Labs 各产品依赖的内部核心公共代码库。

Framework 本次更新如下:

Improvements

  • feat: support dynamic app setting
  • feat: add cluster settings query args
  • feat: add gateway config
  • feat: add http interceptor
  • feat: return host info in info api
  • feat: add util to convert string to float
  • feat: use common app setting api to instead of auth setting api
  • feat: crontab task support multi crontab expression
  • fix: skip submit empty bulk requests
  • feat: support ccr api
  • fix: get latest offset should compare segment first
  • fix: wrong use of zstd with vfs
  • fix: prevent close closed channel
  • fix: panic on error while saving keystore

期待反馈

欢迎下载体验使用,如果您在使用过程中遇到如何疑问或者问题,欢迎前往 INFINI Labs Github(https://github.com/infinilabs) 中的对应项目中提交 Feature Request 或提交 Bug。

您还可以通过邮件联系我们:hello@infini.ltd

或者拨打我们的热线电话:(+86) 400-139-9200

欢迎加入 Discord 聊天室:https://discord.gg/4tKTMkkvVX

也欢迎大家微信扫码添加小助手(INFINI-Labs),加入用户群一起讨论交流。

联系我们

关于极限科技(INFINI Labs)

INFINI Labs

极限科技,全称极限数据(北京)科技有限公司,是一家专注于实时搜索与数据分析的软件公司。旗下品牌极限实验室(INFINI Labs)致力于打造极致易用的数据探索与分析体验。

极限科技是一支年轻的团队,采用天然分布式的方式来进行远程协作,员工分布在全球各地,希望通过努力成为中国乃至全球企业大数据实时搜索分析产品的首选,为中国技术品牌输出添砖加瓦。

官网:https://www.infinilabs.cn

从 Redis 开源协议变更到 ES 国产化:一次技术自主的机遇

EasysearchMuses 发表了文章 • 0 个评论 • 4460 次浏览 • 2024-04-11 16:05 • 来自相关话题

引言

近日,Redis Labs 宣布其主导的开源项目 Redis 将采用双重源代码可用许可证(RSALv2)和服务器端公共许可证(SSPLv1)。这一重大决策标志着 Redis 从传统的 BSD 许可证向更加严格的控制权转变,同时也引发了广泛的社区和行业讨论。这不仅是一个关于许可证变更的故事,更是关于开源社区如何响应,以及这一变化如何激发对国产技术探索和发展的深刻思考。Redis,作为最受欢迎的开源键值存储数据库之一,其开源协议的变更反映了开源软件在商业化道路上的挑战和压力。Redis Labs 的 CEO Rowan Trollope 指出,这一变化旨在防止云服务提供商免费使用 Redis 代码,同时促进 Redis 社区的可持续发展和创新。

Redis 协议变更的深远影响

Redis 决定放弃 BSD 协议,转而采用双重源代码可用许可证(RSALv2 和 SSPLv1),标志着开源界的一个重要转折点。这一变化不仅影响了 Redis 本身,更引发了社区成员和技术行业的激烈讨论,许多人担心这将限制 Redis 的开源精神和广泛应用。然而,也有声音认为,这为其他开源项目,如 KeyDB、Dragonfly 和 Garnet 等,提供了发展的机遇,尤其是在提供与 Redis 兼容的替代解决方案方面。尽管 Redis 的这一变更在技术和法律上引发了争议,它也激发了开源社区对于如何在维护开源精神和寻求商业可持续性之间找到平衡的探索。此外,Redis 团队对于保持客户端库的开源许可和继续支持开源社区版的承诺,展示了一种尝试在新的许可模式下保持开放性和可接入性的方法。由于 Redis 的广泛应用,其协议变更对云服务商、Linux 发行版,甚至整个开源软件生态都产生了不小的冲击。一方面,云服务提供商需要重新评估其服务模型;另一方面,一些 Linux 发行版可能需要考虑将 Redis 从其软件仓库中移除。

ES 国产化的契机

Redis 开源协议的变更同时也让人们重新审视其他关键技术,特别是 Elasticsearch(ES)的依赖和发展。ES 作为一个强大的搜索和数据分析引擎,在全球范围内被广泛使用。随着对开源项目商业化模式的重新考量,中国开发者和企业开始寻求国产化的 ES 替代品,旨在减少对外部技术的依赖,同时推动国内技术生态的多元化和自主创新。但是国产化的探索并非没有挑战。从技术兼容性、性能优化到社区生态建设,每一步都需要深思熟虑和持续的努力。然而,Redis 的许可证变更为国内技术自主提供了一个独特的视角,鼓励开发者、企业乃至政府机构更加积极地参与到开源技术的本土化和创新中来。Redis 开源协议的变更引发的讨论和行动,凸显了开源社区对于自身未来发展方向的深刻反思。这一变革不仅关乎一个项目的许可模式转变,更触及到开源项目如何在保持开放和自由的同时,寻找到可持续发展的道路。此外,它也促使更多的开源项目和企业思考如何在全球化的技术生态中保持竞争力和影响力。

Easysearch:国产化的新选择

针对这一需求,极限科技 隆重推出了 Easysearch 搜索引擎软件,旨在提供一个与 Elasticsearch 兼容的国产化解决方案。Easysearch 不仅支持原生 Elasticsearch 的 DSL 查询语法,还提供了诸多企业级功能的增强,如更高的性能、稳定性和扩展性,以及更加丰富的安全管理和数据压缩功能。这表明,国产化技术的发展不仅是为了替代,更是在原有基础上进行创新和优化。ES 国产化解决方案 Easysearch 的推出,是响应国家对信创、自主可控战略布局的具体行动。通过提供兼容性强、功能丰富且稳定的国产技术替代品,不仅有助于减少对外部技术的依赖,也为国内技术生态的繁荣和创新贡献力量。这一过程中,既涵盖了对现有技术的深入理解和应用,也包含了对新技术、新方法的探索和实践。

结语

Redis 开源协议的变更和 Elasticsearch 国产化解决方案的兴起,共同反映了当前技术世界中开源与商业、国际与国产之间复杂而微妙的关系。这一趋势不仅仅是技术领域的变化,更是全球化背景下,各国在技术自主、安全与发展方面所做出的战略性调整。随着更多开源项目和技术面临类似的挑战,我们或许可以预见,技术自主和开源创新将成为推动未来技术发展的两大关键力量。

参考

关于极限科技(INFINI Labs)

关于极限科技

极限科技,全称极限数据(北京)科技有限公司,是一家专注于实时搜索与数据分析的软件公司。旗下品牌极限实验室(INFINI Labs)致力于打造极致易用的数据探索与分析体验。

极限科技是一支年轻的团队,采用天然分布式的方式来进行远程协作,员工分布在全球各地,希望通过努力成为中国乃至全球企业大数据实时搜索分析产品的首选,为中国技术品牌输出添砖加瓦。

官网:https://www.infinilabs.com

探索搜索引擎的新时代:Windows 安装 Easysearch 完全指南

EasysearchMuses 发表了文章 • 0 个评论 • 1489 次浏览 • 2024-03-19 21:07 • 来自相关话题

相信最近大家都已经听过Easysearch的名头,成功拿下了墨天轮搜索型数据库的榜首!什么?您不知道?那我再给您介绍下: INFINI Easysearch 是一个分布式的近实时搜索与分析引擎,核心引擎基于开源的 Apache Lucene。Easysearch 的目标是提供一个轻量级的 Elasticsearch 可替代版本,并继续完善和支持更多的企业级功能。与 Elasticsearch 相比,Easysearch 更关注在搜索业务场景的优化和继续保持其产品的简洁与易用性。 相信看完了上面您已经对使用Easysearch有了想法,不要想,行动!我将带领您在windows环境中使用Easysearch,有几种安装方法可供选择!

方法一:使用Docker

对于已在Windows系统上安装了Docker的用户来说,通过Docker安装Easysearch是最直接高效的方法。接下来我将介绍Docker部署Easysearch的方法,如果没有安装Docker请跳过!

Docker 环境下使用 Easysearch

在使用 Docker 运行 Easysearch 之前,请确保已进行系统调优并安装好Docker服务,且Docker服务正常运行。

最快方式:启动临时的docker容器,可以从前台查看到admin的初始密码

```bash
docker run --name easysearch -p 9200:9200 dockerproxy.com/infinilabs/easysearch:latest

个性配置

从宿主机挂载数据目录及日志目录,并配置jvm内存为512m。

  1. 在宿主机上创建目录

    bashCopy code
    sudo mkdir -p /data/easysearch/{data,logs}
  2. 修改目录权限

    bashCopy code
    # 容器内es用户的uid为602,通过调整宿主机的目录权限,确保在容器内部es用户有权限读写挂载的数据卷
    sudo chown -R 602.602 /data/easysearch
  3. 后台运行容器

    bashCopy code
    docker run -d --restart always -p 9200:9200 \
              -e ES_JAVA_OPTS="-Xms512m -Xmx512m" \
              -v /data/easysearch/data:/app/easysearch/data \
              -v /data/easysearch/logs:/app/easysearch/logs \
              --name easysearch --hostname easysearch \
              dockerproxy.com/infinilabs/easysearch:latest
  4. 查看初始密码

    bashCopy code
    # 由于以上容器是后台启动,需要通过日志找出admin的初始密码
    docker logs easysearch 2>/dev/null | grep -w Usage

    容器启停

  5. 启动容器

    bashCopy code
    docker start easysearch
  6. 停止容器

    bashCopy code
    docker stop easysearch

    后续验证工作,请继续查看安装指南。

    方法二:不使用HTTPS安装Easysearch

    在某些情况下,您可能需要或者偏好不通过HTTPS方式进行安装。这种方法需要您手动下载并设置Easysearch及其依赖。

    步骤1:下载并安装Easysearch

    首先,手动下载 Easysearch 并将其解压到您希望的安装目录。

    步骤2:下载并安装JDK

  7. 手动下载JDK安装包。
  8. 将JDK解压到Easysearch安装目录下。
  9. 将解压出来的JDK目录重命名为jdk

    步骤3:修改Easysearch配置

    鉴于Windows默认不包含openssl,生成证书可能较为困难。您可以通过修改config/easysearch.yml文件来绕过证书验证:

    security.enabled: false

    方法三:通过git-for-windows安装

    对于喜欢使用命令行的用户,可以通过安装git-for-windows,利用bash环境来执行安装命令。

    步骤1:安装Easysearch

    通过以下在线脚本命令安装Easysearch:

    bashCopy code
    curl -sSL http://get.infini.cloud | bash -s -- -p easysearch -d /d/opt/easysearch

    步骤2:下载并安装JDK

  10. 使用curl命令将JDK下载到指定目录:

    bashCopy code
    curl -# https://release.infinilabs.com/easysearch/jdk/zulu17.42.19-ca-jdk17.0.7-win_x64.zip -o /d/opt/jdk.zip
  11. 解压JDK文件,并将解压后的目录重命名为jdk
    bashCopy code
    cd /d/opt/easysearch && unzip -q /d/opt/jdk.zip
    mv zulu* jdk

    步骤3:设置JAVA_HOME环境变量

    配置JAVA_HOME环境变量,以确保Easysearch能正确找到JDK。

    bashCopy code
    export JAVA_HOME=/d/opt/easysearch/jdk

    步骤4:初始化证书、密码和插件

    执行以下命令,初始化所需的配置:

    bashCopy code
    bin/initialize.sh

    步骤5:运行Easysearch

    最后,使用以下命令启动Easysearch:

    bashCopy code
    bin/easysearch.bat

    通过以上任一方法,您都应该能够成功在Windows系统上安装并运行Easysearch。请选择最适合您的需求和环境的安装方法。 请根据Easysearch和JDK的最新版本,适时更新上述命令和下载链接。接下来,请继续完成验证工作。

    验证工作

    为了保证Easysearch数据安全,初始化脚本会为admin用户生成随机的密码,如果使用Docker运行Easysearch或执行初始化脚本时同意记录初始密码到日志文件,则可在Docker日志文件或logs/initialize.log中找到admin用户对应的初始化密码。 由于初始脚本会自动覆盖集群上次使用的证书及内置的admin用户密码,请勿多次运行!如果您忘记了初始密码,可以通过内置的证书来进行密码重置。

    bashCopy code
    # 根据初始化脚本生成的随机密码访问 Easysearch 的 REST API
    curl -ku admin:xxx https://localhost:9200

    也可以在浏览器中输入网址 https://localhost:9200/,即可验证Easysearch是否完成启动。推荐使用INFINI Console来进行集群管理,功能更加强大和方便。 注:各类客户端及周边工具,如 Logstash、Filebeat 请使用7.10.2 oss版本来连接Easysearch。并打开config/easysearch.yml中的配置项elasticsearch.api_compatibility: true

如果你已经按照上面的步骤完成了安装,那么接下来请尽情的使用Easysearch吧!如果在安装过程中出现了问题的请私聊我!对了,希望在其他环境中部署Easysearch的也可以查询我们的安装指南,上面有详细的安装步骤!祝你好运!