
Easysearch
INFINI Labs 产品更新 | Coco AI – 增强 AI 搜索、API 管理与性能优化等
资讯动态 • INFINI Labs 小助手 发表了文章 • 0 个评论 • 1896 次浏览 • 2025-03-15 18:21
INFINI Labs 产品更新发布!此次更新涵盖 Coco AI 、Easysearch 等产品多项重要升级,重点提升 AI 搜索能力、易用性及企业级优化。
- Coco AI v0.2 作为 开源、跨平台的 AI 搜索工具,新增 APP 自动更新提示、API Token 管理、文档处理优化 等功能。
- INFINI Easysearch v1.11.1 集成 AI 向量搜索,优化查询聚合能力。
- INFINI Console、Gateway、Agent、Loadgen、Framework 关键问题修复,优化 WebSocket 处理与整体用户体验。
- Coco AI Server 增强 WebSocket 会话处理、支持 RAG 会话和动态配置,并新增图形化管理界面。
Coco AI v0.2
Coco AI 是一个完全开源、跨平台的统一 AI 搜索与效率工具,能够连接并搜索多种数据源,包括应用程序、文件、谷歌网盘、Notion、语雀、Hugo 等本地与云端数据。通过接入 DeepSeek 等大模型,Coco AI 实现了智能化的个人知识库管理,注重隐私,支持私有部署,帮助用户快速、智能地访问信息。
Coco AI 本次详细更新记录如下:
Coco AI 客户端 v0.2.1
功能更新
- 支持 APP 应用内更新提示并可自动更新
问题修复
- 修复融合搜索包含已禁用服务器的问题
- 修复版本类型不正确:应为字符串而不是 u32
- 修复聊天推送结束的判断类型不准确问题
优化改进
- 重构了聊天组件
- 添加服务链接展示
- 优化了聊天滚动效果和聊天数据渲染效果
- 设置聊天窗口最小宽度 & 移除输入框背景
- 移除废弃的选中功能 & 添加选择隐藏 APP 功能
- Websocket 超时增加到 2 分钟
Coco AI 服务端 v0.2.2
功能更新
- 新增图形化管理界面
- 新增数据源下文档创建 API
- 新增文件上传相关 API
- 新增 API TOKEN 管理相关 API
- 数据源同步支持动态配置时间间隔
- 支持动态更新服务端设置
- 支持动态更新大模型相关设置
- 新增 RAG 聊天会话处理
- 新增联网搜索能力
- 支持对接 Deepseek 大模型
- 新增文档预处理 Processor
问题修复
- 修复 Google Drive Connector 缺少文件报错
优化改进
- 优化聊天会话功能
- 优化 Websocket 会话管理
- 优化登录退出接口
- 保存 Notion 其它内容到 Payload 字段
- 完善后台任务退出机制
- 优化默认索引模版和查询模版
INFINI Easysearch v1.11.1
INFINI Easysearch 是一个分布式的搜索型数据库,实现非结构化数据检索、全文检索、向量检索、地理位置信息查询、组合索引查询、多语种支持、聚合分析等。Easysearch 可以完美替代 Elasticsearch,同时添加和完善多项企业级功能。Easysearch 助您拥有简洁、高效、易用的搜索体验。
Easysearch 本次更新如下:
功能更新
- 新增 AI 模块,集成 Ollama embedding API,支持文本向量化
问题修复
- 修复 DateRange 聚合在 Rollup 查询中无法正确合并的问题
优化改进
针对用户使用体验进行了多项改进,包括:
- 弃用 KNN 模块中的 index.knn 配置项,(此配置项和其他功能经常发生冲突) 简化配置逻辑,该配置项将在后续版本中移除
- 将 KNN 搜索功能从插件形式集成为内置功能,无需额外安装即可使用
- 将跨集群复制(CCR)功能从插件形式集成为内置功能,开箱即用
- 优化索引配置更新验证:增加非动态配置项的值比对,避免误报
INFINI Console v1.29.1
INFINI Console 是一款开源的非常轻量级的多集群、跨版本的搜索基础设施统一管控平台。通过对流行的搜索引擎基础设施进行跨版本、多集群的集中纳管, 企业可以快速方便的统一管理企业内部的不同版本的多套搜索集群。
Console 在线体验:
http://demo.infini.cloud (用户名/密码:readonly/readonly)。
Console 本次更新如下:
问题修复
- 修复 agentless 模式下计算索引级别实时 QPS 不准确的问题
INFINI Gateway v1.29.1
INFINI Gateway 是一个开源的面向搜索场景的高性能数据网关,所有请求都经过网关处理后再转发到后端的搜索业务集群。基于 INFINI Gateway 可以实现索引级别的限速限流、常见查询的缓存加速、查询请求的审计、查询结果的动态修改等等。
Gateway 本次更新如下:
优化改进
- 同步更新 Framework v1.1.4 优化了一些已知问题
INFINI Agent v1.29.1
INFINI Agent 负责采集和上传 Elasticsearch, Easysearch, Opensearch 集群的日志和指标信息,通过 INFINI Console 管理,支持主流操作系统和平台,安装包轻量且无任何外部依赖,可以快速方便地安装。
Agent 本次更新如下:
优化改进
- 同步更新 Framework v1.1.4 优化了一些已知问题
INFINI Loadgen v1.29.1
INFINI Loadgen 是一款开源的专为 Easysearch、Elasticsearch、OpenSearch 设计的轻量级性能测试工具。
Loadgen 本次更新如下:
优化改进
- 同步更新 Framework v1.1.4 优化了一些已知问题
INFINI Framework v1.1.4
INFINI Framework 是 INFINI Labs 基于 Golang 的产品的核心基础,已开源。该框架以开发者为中心设计,简化了构建高性能、可扩展且可靠的应用程序的过程。
Framework 本次更新如下:
功能更新
- 添加配置选项,以在 WebSocket 连接期间禁用回显消息
- 允许在 WebSocket 连接/断开时注册回调函数
- 为 API 添加可选的登录验证配置
优化改进
- 停止任务后取消任务
- 回调发生错误时关闭 WebSocket 连接
更多详情请查看以下详细的 Release Notes 或联系我们的技术支持团队!
期待反馈
欢迎下载体验使用,如果您在使用过程中遇到如何疑问或者问题,欢迎前往 INFINI Labs Github(https://github.com/infinilabs) 中的对应项目中提交 Feature Request 或提交 Bug。
下载地址: https://infinilabs.cn/download
邮件:hello@infini.ltd
电话:(+86) 400-139-9200
Discord:https://discord.gg/4tKTMkkvVX
也欢迎大家微信扫码添加小助手(INFINI-Labs),加入用户群一起讨论交流。
关于极限科技(INFINI Labs)
极限科技,全称极限数据(北京)科技有限公司,是一家专注于实时搜索与数据分析的软件公司。旗下品牌极限实验室(INFINI Labs)致力于打造极致易用的数据探索与分析体验。
极限科技是一支年轻的团队,采用天然分布式的方式来进行远程协作,员工分布在全球各地,希望通过努力成为中国乃至全球企业大数据实时搜索分析产品的首选,为中国技术品牌输出添砖加瓦。
活动回顾 - 第7期 搜索客 Meetup 线上直播活动圆满结束,附 PPT 下载与视频回放
活动 • searchkit 发表了文章 • 0 个评论 • 2489 次浏览 • 2025-03-09 15:29
2025 年 03 月 07 日,由搜索客社区和极限科技(INFINI Labs)联合举办的第 7 期线上 Meetup 技术交流直播活动圆满结束。本期 Meetup 直播活动吸引了超过 700+ 技术爱好者观看参与,活动主要介绍了极限科技新推出并正在研发的开源智能搜索产品 Coco AI 的技术特点和应用场景,并探讨了如何通过 AI 等技术提高企业内部协作的效率和智能化程度。
本期 Meetup 活动回顾
本期 Meetup 活动的分享嘉宾是 极限科技(INFINI Labs)创始人和 CEO 曾勇老师(Medcl) ,Medcl 在搜索技术领域有着丰富的经验和深厚的积累,致力于下一代搜索引擎和智能 AI 搜索领域相关技术的研究。他为大家带来了主题为 《开源智能搜索与知识库管理 - Coco AI》 精彩分享。
Medcl 首先介绍了极限科技的成立背景和主要业务。极限科技成立于 2021 年底,致力于为企业提供国产化的搜索工具和产品。其中,Coco AI 是极限科技最近推出的一款开源智能搜索产品,旨在为用户提供更加便捷、高效的搜索体验。
Medcl 详细介绍了 Coco AI 的产品架构和功能特点。Coco AI 采用分布式架构,支持多种数据源连接和异构数据的整合。同时,它还集成了 AI 技术,能够实现智能问答、意图识别等功能,帮助用户更加高效地获取所需信息。
在 Medcl 的演示中,我们看到了 Coco AI 的实际应用效果。通过简单的配置和操作,用户可以轻松地连接各种数据源,并实现快速检索和智能问答。同时,Coco AI 还支持多种操作系统和设备,为用户提供了更加便捷的使用体验。
在活动的互动环节中,观众们积极提问,Medcl 耐心解答了关于 Coco AI 的技术细节和应用场景等问题。下面摘取部分问答:
问 1:Coco AI 的架构图中有提到 Pizza,Pizza 是向量数据库吗?
答:Pizza 是极限科技即将推出的下一代搜索引擎,既包含全文检索的能力,也包含向量检索能力。问 2: Coco AI App 的 windows 版本啥时候开放下载体验?
答:已开放下载,下载地址:https://coco.rs/,欢迎体验和反馈!问 3: 幻觉问题有解决方案吗,试了很多款 RAG 开源项目,还有云服务,都没有特别好的方式
答:大模型幻觉问题可通过多阶段处理和提示词设计优化:先快速识别意图并筛选信息,再提取可靠资料,最后用高精度模型生成答案,耗时较长但准确性高;同时提示模型在依据不足时回答“缺少信息”,避免无意义输出。这种分层处理方式有效减少幻觉问题,提升可靠性。问 4: Coco 怎么做数据源的更新的 🤔
答:Coco AI 的数据源更新方式灵活多样:1.定期更新,通过 Connect 定期按频率更新数据;2.主动推送,支持业务方主动推送数据或结合消息通知,实现部分更新;3.接口支持,提供接口接收推送数据,实时检索更新,适应多种数据场景。问 5: Coco 的数据源是否计划支持飞书云文档?
答:飞书云文档我们本身是有计划的,因为飞书云文档我们也有在用的我们。支持起来的话也很快。
同时,在整个直播过程中,主持人进行了多轮激动人心的抽奖活动,为参会小伙伴带来了额外的惊喜。
最后感谢大家的参与和支持,让我们共同期待下一次 搜索客 Meetup 活动带来更多的精彩内容!
本期 Meetup 的 PPT 下载
本期 PPT 下载的链接:https://searchkit.cn/slides/331
本期 Meetup 视频回放
扫码关注极限实验室视频号查看直播回放,或者扫码关注极限实验室 B 站 账号,可查看本期 Meetup 活动视频。我们也会在视频号、B 站持续更新最新技术视频,欢迎通过点赞、投币,收藏,三连来支持我们。
Meetup 活动讲师招募
搜索客社区 Meetup 的成功举办,离不开社区小伙伴的热情参与。目前社区讲师招募计划也在持续进行中,我们诚挚邀请各位技术大咖、行业精英踊跃提交演讲议题,与大家分享您的经验。
讲师报名链接:http://cfp.searchkit.cn
或扫描下方二维码,立刻报名成为讲师!
Meetup 活动聚焦 AI 与搜索领域的最新动态,以及数据实时搜索分析、向量检索、技术实践与案例分析、日志分析、安全等领域的深度探讨。
我们热切期待您的精彩分享!
关于 搜索客(SearchKit)社区
搜索客社区由 Elasticsearch 中文社区进行全新的品牌升级,以新的 Slogan:“搜索人自己的社区” 为宣言。汇集搜索领域最新动态、精选干货文章、精华讨论、文档资料、翻译与版本发布等,为广大搜索领域从业者提供更为丰富便捷的学习和交流平台。社区官网:https://searchkit.cn 。
关于极限科技(INFINI Labs)
极限科技,全称极限数据(北京)科技有限公司,是一家专注于实时搜索与数据分析的软件公司。旗下品牌极限实验室(INFINI Labs)致力于打造极致易用的数据探索与分析体验。
极限科技是一支年轻的团队,采用天然分布式的方式来进行远程协作,员工分布在全球各地,希望通过努力成为中国乃至全球企业大数据实时搜索分析产品的首选,为中国技术品牌输出添砖加瓦。
【搜索客社区日报】第1998期 (2025-03-07)
社区日报 • Fred2000 发表了文章 • 0 个评论 • 1948 次浏览 • 2025-03-07 10:33
Easysearch 证书:Windows 上创建自签名证书的 7 种方法
Easysearch • liaosy 发表了文章 • 0 个评论 • 3281 次浏览 • 2025-02-09 18:58
背景
最近 INFINI Labs 社区有 Easysearch 开发者反馈,其开发环境为 Windows 系统,安装部署 Easysearch 时初始化证书遇到麻烦,如果没有证书就无法开启 Easysearch TLS 传输加密来保护数据的网络传输安全。本文将介绍在 Windows 上创建自签名证书的 7 种不同方法。
使用在线工具 certificatetools.com
在允许生成自签名证书的在线服务中,CertificateTools 是最先进的。只需查看所有可用选项即可:
就这么简单!
使用 Let’s Encrypt
首先,安装 Certbot,这是 Let’s Encrypt 官方推荐的工具,用于自动化获取和续期 SSL/TLS 证书。
1. 安装 Certbot
- 访问 Certbot 下载页面。
- 选择 Windows 系统,下载并安装 Certbot。
2. 获取证书
- 打开 命令提示符 或 PowerShell 以管理员身份运行。
- 输入以下命令获取证书(替换 example.com 为你的域名):
certbot certonly --standalone --preferred-challenges http -d example.com
- Certbot 会自动通过 HTTP 验证域名并生成证书。证书会存储在:
C:\Certbot\live\example.com\
里面有以下文件:
- cert.pem:证书。
- privkey.pem:私钥。
- fullchain.pem:完整证书链。
3. 导入证书
- 打开 Windows 证书管理器 (mmc),选择 个人 文件夹。
- 右键点击 个人 文件夹,选择 导入,导入 cert.pem 和 privkey.pem。
4. 验证证书
- 在证书管理器中,确认证书已成功导入并配置。
5. 续期证书
- 使用以下命令手动续期证书:
certbot renew
使用 OpenSSL
OpenSSL 是一个跨平台的工具,适用于各种操作系统,包括 Windows。在 Windows 上,你需要首先安装 OpenSSL。
步骤:
- 从 OpenSSL 官方网站 下载并安装 OpenSSL。
- 打开 命令提示符 或 PowerShell,并导航到 OpenSSL 的安装目录。
- 运行以下命令生成自签名证书:
openssl req -new -x509 -keyout mycert.pem -out mycert.pem -days 365
-new:创建一个新的证书请求。
-x509:生成一个自签名证书。
-keyout 和 -out:指定证书和私钥文件的保存路径。
-days 365:证书有效期为 365 天。
- 系统会提示你输入一些证书的详细信息,如国家、组织名等。
验证:
检查生成的 mycert.pem 文件是否存在,并通过命令 openssl x509 -in mycert.pem -text 查看证书的内容。
使用 PowerShell
PowerShell 提供了一个简单的命令 New-SelfSignedCertificate 来创建自签名证书。以下是具体的操作步骤:
步骤:
- 按下 Windows + X,选择 Windows PowerShell (管理员)。
- 在 PowerShell 窗口中输入以下命令:
New-SelfSignedCertificate -DnsName "example.com" -CertStoreLocation "cert:\LocalMachine\My"
-DnsName "example.com":指定证书的 DNS 名称,可以更改为你需要的域名或主机名。
-CertStoreLocation "cert:\LocalMachine\My":将证书存储到本地计算机的证书存储区。
- 执行后,证书将被创建,并存储在 Windows 证书管理器中。
验证:
- 打开 运行 (Windows + R),输入 mmc,点击确定。
- 在 MMC 中,选择 文件 > 添加/删除管理单元,选择 证书,然后选择 计算机帐户。
- 查看 个人 文件夹,你将看到刚才创建的证书。
使用 IIS
IIS(Internet Information Services)是一种 Web 服务器软件,可以通过它为你的服务器生成自签名证书。
步骤:
- 打开 IIS 管理器,选择你的服务器名称。
- 在主界面中,双击 服务器证书 选项。
- 在右侧操作面板中,点击 创建自签名证书。
- 输入证书的名称(如:example.com),然后选择证书的存储位置。
- 点击确定,证书将被创建并存储在 IIS 中。
验证:
在 服务器证书 部分,你将看到已创建的证书。
使用 MMC 管理工具
Windows 提供了 MMC 管理工具,可以通过图形界面创建自签名证书。
步骤:
- 按 Windows + R 打开运行窗口,输入 mmc 并按下回车。
- 在 MMC 中,选择 文件 > 添加/删除管理单元,点击 证书 并选择 计算机帐户。
- 选择 本地计算机 > 确定。
- 在左侧的证书树中,右键点击 个人 文件夹,选择 所有任务 > 请求新证书。
- 跟随向导填写证书的详细信息并选择 自签名证书 选项,完成后证书将被创建。
验证:
在 MMC 中查看证书是否已经生成,并且可以在 个人 文件夹中找到它。
使用 XCA 工具
XCA 是一个开源工具,支持生成和管理证书。它为用户提供了一个图形化界面,适合那些不熟悉命令行操作的用户。
步骤:
- 从 XCA 官方网站 下载并安装 XCA。
- 启动 XCA,点击 文件 > 新建数据库 来创建一个新的证书数据库。
- 在 证书 选项卡中,点击 新建证书。
- 在证书的设置中,选择 自签名证书,然后填写证书的详细信息。
- 点击 保存 来生成证书。
验证:
生成的证书可以在 XCA 的 证书 列表中查看,并导出为文件或在需要的地方使用。
总结
在 Windows 上创建自签名证书对于开发者和管理员来说是一项常见任务。自签名证书通常用于测试环境、开发、或者是没有商业证书的情况下使用。本文所述在 Windows 上创建自签名证书的 7 种方法都有详细步骤和验证方式,希望能给你带来帮助。
参考资料
Spring Boot 集成 Easysearch 完整指南
Easysearch • INFINI Labs 小助手 发表了文章 • 0 个评论 • 3328 次浏览 • 2025-02-08 12:27
Easysearch 的很多用户都有这样的需要,之前是用的 ES,现在要迁移到 Easysearch,但是业务方使用的是 Spring Boot 集成的客户端,问是否能平滑迁移。
Easysearch 是完全兼容 Spring Boot 的,完全不用修改,本指南将探讨如何将 Spring Boot 和 ES 的 high-level 客户端 与 Easysearch 进行集成,涵盖从基础设置到实现 CRUD 操作和测试的所有内容。
服务器设置
首先,需要修改 Easysearch 节点的 easysearch.yml 文件,打开并配置这 2 个配置项:
elasticsearch.api_compatibility: true
#根据客户端版本配置版本号,我这里配置成 7.17.18
elasticsearch.api_compatibility_version: "7.17.18"
项目设置
然后,让我们设置 Maven 依赖。以下是 pom.xml
中的基本配置:
<properties>
<java.version>11</java.version>
<spring-data-elasticsearch.version>4.4.18</spring-data-elasticsearch.version>
<elasticsearch.version>7.17.18</elasticsearch.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-elasticsearch</artifactId>
<version>${spring-data-elasticsearch.version}</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>${elasticsearch.version}</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>${elasticsearch.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
客户端连接配置
完全和连接 Elasticsearch 的方式一样,不用修改:
配置 src/main/resources/application.yml 文件
spring:
elasticsearch:
rest:
uris: https://localhost:9202
username: admin
password: xxxxxxxxxxx
ssl:
verification-mode: none
连接配置类
@Configuration
public class ElasticsearchConfig extends AbstractElasticsearchConfiguration {
@Value("${spring.elasticsearch.rest.uris}")
private String elasticsearchUrl;
@Value("${spring.elasticsearch.rest.username}")
private String username;
@Value("${spring.elasticsearch.rest.password}")
private String password;
@Override
@Bean
public RestHighLevelClient elasticsearchClient() {
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY,
new UsernamePasswordCredentials(username, password));
SSLContext sslContext = SSLContexts.custom()
.loadTrustMaterial(null, (x509Certificates, s) -> true)
.build();
RestClientBuilder builder = RestClient.builder(HttpHost.create(elasticsearchUrl))
.setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder
.setDefaultCredentialsProvider(credentialsProvider)
.setSSLContext(sslContext)
.setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE));
return new RestHighLevelClient(builder);
}
}
领域模型
使用 Spring 的 Elasticsearch 注解定义领域模型:
@Data
@Document(indexName = "products")
public class Product {
@Id
private String id;
@Field(type = FieldType.Text, name = "name")
private String name;
@Field(type = FieldType.Double, name = "price")
private Double price;
}
仓库层
创建继承 ElasticsearchRepository 的仓库接口:
@Repository
@EnableElasticsearchRepositories
public interface ProductRepository extends ElasticsearchRepository<Product, String> {
}
服务层
实现服务层来处理业务逻辑:
@Service
public class ProductService {
private final ProductRepository productRepository;
@Autowired
public ProductService(ProductRepository productRepository) {
this.productRepository = productRepository;
}
public Product saveProduct(Product product) {
return productRepository.save(product);
}
public Product findProductById(String id) {
return productRepository.findById(id).orElse(null);
}
}
测试
编写集成测试类:
@SpringBootTest
public class ProductServiceIntegrationTest {
@Autowired
private ElasticsearchOperations elasticsearchOperations;
@Autowired
private ProductService productService;
private static final String INDEX_NAME = "products";
@BeforeEach
public void setUp() {
IndexOperations indexOperations = elasticsearchOperations.indexOps(IndexCoordinates.of(INDEX_NAME));
if (indexOperations.exists()) {
indexOperations.delete();
}
// 定义 mapping
Document mapping = Document.create()
.append("properties", Document.create()
.append("name", Document.create()
.append("type", "text")
.append("analyzer", "standard"))
.append("price", Document.create()
.append("type", "double")));
// 创建索引并应用 mapping
indexOperations.create(Collections.EMPTY_MAP, mapping);
}
@Test
public void testSaveAndFindProduct() {
List<Product> products = Arrays.asList(
new Product("Test Product 1", 99.99),
new Product("Test Product 2", 199.99),
new Product("Test Product 3", 299.99)
);
List<IndexQuery> queries = products.stream()
.map(product -> new IndexQueryBuilder()
.withObject(product)
.withIndex(INDEX_NAME)
.build())
.collect(Collectors.toList());
List<IndexedObjectInformation> indexedInfos = elasticsearchOperations.bulkIndex(
queries,
IndexCoordinates.of(INDEX_NAME)
);
// 验证结果
List<String> ids = indexedInfos.stream()
.map(IndexedObjectInformation::getId)
.collect(Collectors.toList());
assertFalse(ids.isEmpty());
assertEquals(products.size(), ids.size());
}
}
结论
本指南展示了 Easysearch 与 Elasticsearch 的高度兼容性:
- 配置方式相同,仅需启用 Easysearch 的 API 兼容模式。
- 可直接使用现有 Elasticsearch 客户端。
- Maven 依赖无需更改。
- API、注解和仓库接口完全兼容。
- 现有测试代码可直接应用。
这种兼容性使得从 Elasticsearch 迁移到 Easysearch 成为一个简单、低风险的过程。Spring Boot 项目可以几乎无缝地切换到 Easysearch,同时获得其性能和资源利用方面的优势。
关于 Easysearch
INFINI Easysearch 是一个分布式的搜索型数据库,实现非结构化数据检索、全文检索、向量检索、地理位置信息查询、组合索引查询、多语种支持、聚合分析等。Easysearch 可以完美替代 Elasticsearch,同时添加和完善多项企业级功能。Easysearch 助您拥有简洁、高效、易用的搜索体验。
官网文档:https://infinilabs.cn/docs/latest/easysearch
作者:张磊,极限科技(INFINI Labs)搜索引擎研发负责人,对 Elasticsearch 和 Lucene 源码比较熟悉,目前主要负责公司的 Easysearch 产品的研发以及客户服务工作。
原文:https://infinilabs.cn/blog/2024/use-spring-boot-for-easysearch-connection/
Easysearch 集群通过 API 进行用户密码重置
Easysearch • INFINI Labs 小助手 发表了文章 • 0 个评论 • 3234 次浏览 • 2025-02-07 17:52
在日常使用 Easysearch 中,难免会遇到集群密码需要重置的情况(如密码遗失、安全审计要求等)。
通过查看 Easysearch 用户接口文档,创建用户使用如下接口:
PUT _security/user/<username>
{
"password": "adminpass",
"roles": ["maintenance_staff", "weapons"],
"external_roles": ["captains", "starfleet"],
"attributes": {
"attribute1": "value1",
"attribute2": "value2"
}
}
同样可以通过该接口对用户进行密码重置:
PUT _security/user/<username>
{
"password": "adminpass111",
"roles": ["maintenance_staff", "weapons"],
"external_roles": ["captains", "starfleet"],
"attributes": {
"attribute1": "value1",
"attribute2": "value2"
}
API 接口创建的用户
创建一个测试用户 test,并进行访问验证。
通过接口重置用户 test 密码,并进行访问验证。
配置文件创建的用户
在配置文件 user.yml
中添加测试用户(test1、test2)配置:
## Test users
test1:
hash: "$2y$12$ZNfKKCeeRQXOWX27W50tbu0Tq4NT4ADdCQOBoZzokI1zR8ZEUWm4W" # test1
reserved: true
roles:
- "readall_and_monitor"
test2:
hash: "$2y$12$m4/eSiDlzRII87vNeKwzteEHGpgpbdMr5tRvOfve/xIbEYdC4bU7a" # test2
reserved: false
roles:
- "readall_and_monitor"
其中 hash
字段是将用户密码哈希出来的值,可通过 bin/hash_password.sh -p "<明文密码>"
生成。
进行用户访问验证。
对 test1、test2 用户进行密码重置。
用户 test1 重置失败,用户 test2 重置成功。用户 test1 重置失败是因为配置了 reserved: true
,将用户 test1 指定为内置用户,使用用户 admin 会因为权限无法进行密码重置,那就需要使用有更高权限的管理证书进行密码重置。默认在 Easysearch 集群执行初始化脚本 bin/initialize.sh
时,会在 config
目录下生成证书文件,其中 admin.crt
、admin.key
为管理证书。
test1 用户密码重置成功,进行访问验证。
关于 Easysearch
INFINI Easysearch 是一个分布式的搜索型数据库,实现非结构化数据检索、全文检索、向量检索、地理位置信息查询、组合索引查询、多语种支持、聚合分析等。Easysearch 可以完美替代 Elasticsearch,同时添加和完善多项企业级功能。Easysearch 助您拥有简洁、高效、易用的搜索体验。
如何在 Easysearch 中使用 Rollup 优化时序数据的存储和查询
Easysearch • INFINI Labs 小助手 发表了文章 • 0 个评论 • 2465 次浏览 • 2025-01-14 10:05
背景
在现代数据驱动的世界中,时序数据的处理变得越来越重要。无论是监控系统、日志分析,还是物联网设备的数据收集,时序数据都占据了大量的存储空间。随着时间的推移,这些数据的存储成本和管理复杂度也在不断增加。
为了解决这一问题,Rollup 技术应运而生。本文将带你深入了解 Rollup 的概念、优势以及如何在 Easysearch 中使用 Rollup 来优化时序数据的存储和查询。
什么是 Rollup?
Rollup 是一种数据聚合技术,主要用于处理时序数据。它通过将细粒度的原始数据汇总为粗粒度的数据,从而减少存储空间并提高查询效率。简单来说,Rollup 可以将大量的详细数据压缩为更小的、更具代表性的数据集,同时保留关键的业务指标。
Rollup 的优势
- 降低存储成本:通过汇总数据,Rollup 可以显著减少历史数据的存储空间,从而降低存储成本。
- 提高查询性能:汇总后的数据量更小,查询速度更快,尤其是在处理大规模历史数据时,性能提升尤为明显。
- 无缝集成:Easysearch 的 Rollup 功能支持直接查询原始索引,业务代码无需修改,用户无感知。
- 自动化管理:Rollup 任务可以自动滚动生成新的索引,无需手动干预,简化了数据管理流程。
Rollup 的使用场景
Rollup 特别适用于以下场景:
- 监控系统:监控系统产生的指标数据通常非常详细,但随着时间推移,这些数据的价值逐渐降低。通过 Rollup,可以将这些数据汇总为更粗粒度的指标,保留关键信息的同时减少存储压力。
- 日志分析:日志数据通常包含大量的细节信息,但随着时间的推移,这些细节信息的重要性逐渐降低。Rollup 可以帮助你将日志数据汇总为更高层次的统计信息,便于长期存储和分析。
- 物联网数据:物联网设备产生的数据量巨大,且大部分数据在短期内具有较高的分析价值。通过 Rollup,可以将这些数据汇总为更粗粒度的形式,便于长期存储和查询。
使用 Rollup 的先决条件
在使用 Rollup 之前,需要满足以下条件:
安装索引生命周期管理插件:Rollup 功能是索引生命周期管理插件的一部分,因此必须安装该插件。
源索引必须包含 date 类型字段:Rollup 依赖于时间字段来进行数据聚合,因此源索引必须包含一个 date 类型的字段。
Easysearch 中的 Rollup 功能
Easysearch 提供了强大的 Rollup 功能,支持多种聚合类型,并且可以自动滚动生成新的索引。下面我们将详细介绍如何在 Easysearch 中使用 Rollup。
支持的聚合类型
Easysearch 的 Rollup 功能支持以下聚合类型:
- 数值类型字段:
avg
、sum
、max
、min
、value_count
、percentiles
- keyword 类型字段:
terms
聚合 - date 类型字段:
date_histogram
和date_range
聚合
Rollup 的核心参数详解
在配置 Rollup 任务时,以下几个参数至关重要:
1. metrics
参数:定义需要聚合的数值字段
metrics
参数用于指定哪些数值字段需要进行聚合计算。Rollup 任务会对这些字段进行指定的聚合操作(如 avg
、sum
、max
、min
、value_count
、percentiles
),并将结果存储到目标索引中。
示例:
"metrics": [
"payload.elasticsearch.index_stats.*"
]
在这个例子中,metrics
指定了对 payload.elasticsearch.index_stats
下的所有字段进行聚合。
2. attributes
参数:保留原始数据的非聚合字段
attributes
参数用于指定哪些字段需要原封不动地保留在 Rollup 结果中。这些字段不会被聚合,而是直接复制到目标索引中。
示例:
"attributes": [
"agent.*",
"metadata.*"
]
在这个例子中,attributes
指定了所有以 agent.
和 metadata.
开头的字段都会被保留到 Rollup 结果中。
3. exclude
参数:排除不需要处理的字段
exclude
参数用于排除某些字段,使其不参与 Rollup 任务。这些字段既不会被聚合,也不会被保留到目标索引中。
示例:
"exclude": ["payload.elasticsearch.index_stats.routing.*"]
在这个例子中,exclude
指定了 payload.elasticsearch.index_stats.routing
下的所有字段都不会被处理。
4. filter
参数:过滤源数据
filter
参数用于过滤源数据,只有符合过滤条件的文档才会被 Rollup 任务处理。这个参数可以帮助你减少需要处理的数据量,从而提高 Rollup 任务的效率。
示例:
"filter": {
"metadata.name": "index_stats"
}
在这个例子中,filter
指定了只有 metadata.name
字段值为 index_stats
的文档才会被 Rollup 任务处理。
5. identity
参数:定义分组字段
identity
参数用于指定哪些字段作为分组条件。Rollup 任务会根据这些字段的值对数据进行分组,然后在每个分组内进行聚合计算。
功能:
- 定义数据分组的字段。
- 支持多个字段的组合,用于创建唯一的分组键。
- 常用于标识数据的来源或类别。
示例:
"identity": [
"metadata.labels.cluster_id",
"metadata.labels.index_id",
"metadata.labels.index_name",
"metadata.category",
"payload.elasticsearch.index_stats.index_info.health"
]
在这个例子中,identity
指定了多个字段作为分组条件。Rollup 任务会根据这些字段的值对数据进行分组,然后在每个分组内进行聚合计算。
6. interval
参数:定义时间聚合间隔
interval
参数用于指定时间聚合的间隔。Rollup 任务会根据这个间隔将数据按时间分桶,然后在每个时间桶内进行聚合计算。
功能:
- 定义时间聚合的粒度。
- 支持多种时间单位,如
1m
(1 分钟)、1h
(1 小时)、1d
(1 天)等。 - 常用于按时间维度汇总数据。
示例:
"interval": "1m"
在这个例子中,interval
指定了时间聚合的间隔为 1 分钟。Rollup 任务会每分钟对数据进行一次聚合。
1.10 版本的新特性
从 Easysearch 1.10.0 版本开始,Rollup 功能引入了一些新特性,进一步增强了其灵活性和易用性。
1. 支持 date_range
聚合
在 1.10.0 版本中,Rollup 增加了对 原始索引使用 date_range
聚合的支持。这意味着你可以在原始索引根据日期范围对数据进行聚合,而不仅仅是固定的时间间隔。
示例:
"date_range": {
"field": "@timestamp",
"ranges": [
{ "from": "now-1d/d", "to": "now" },
{ "from": "now-7d/d", "to": "now-1d/d" }
]
}
2. 通配符方式批量启动/停止 Rollup Job
在 1.10.0 版本中,你可以使用通配符批量启动或停止 Rollup 任务。这大大简化了任务管理的操作。
示例:
POST _rollup/jobs/rollup*/_start
POST _rollup/jobs/rollup*/_stop
3. 设置 Rollup 索引自动滚动的条数
你可以通过设置 rollup.max_docs
参数,控制 Rollup 索引自动滚动的条数。当索引中的文档数量达到设定值时,系统会自动创建一个新的 Rollup 索引。
示例:
PUT /_cluster/settings
{
"transient": {
"rollup.max_docs": 10000000
}
}
4. 新增 ROLLUP_SEARCH_MAX_COUNT
配置
在 1.10.0 版本中,新增了 ROLLUP_SEARCH_MAX_COUNT
配置项,用于控制 Rollup 在运行 Job 时收集历史数据的最大并发分片请求数。这个配置项可以帮助你优化 Rollup 任务的性能,并避免集群资源过载。
功能:
- 控制并发请求数:限制 Rollup 任务在执行搜索请求时的最大并发分片请求数。
- 动态调整:支持在集群运行时动态调整,无需重启集群。
- 默认值:
2
,即默认情况下,Rollup 任务最多会同时发送 2 个并发分片请求。
示例:
PUT /_cluster/settings
{
"transient": {
"rollup.search.max_count": 2
}
}
在这个例子中,ROLLUP_SEARCH_MAX_COUNT
被设置为 2
,表示 Rollup 任务在执行搜索请求时,最多会同时发送 2 个并发分片请求。
配置建议:
- 小规模集群:建议设置为较小的值(如
2
),以避免资源竞争。 - 大规模集群:可以适当增加该值(如
4
),以提高并发性能。 - 动态调整:根据集群负载情况动态调整该值,以优化性能和资源利用率。
创建 Rollup 任务的完整示例
以下是一个完整的 Rollup 任务配置示例,展示了 metrics
、attributes
、exclude
和 filter
参数的综合使用:
PUT _rollup/jobs/rollup1
{
"rollup": {
"source_index": ".infini_metrics",
"target_index": "rollup1_{{ctx.source_index}}",
"timestamp": "timestamp",
"continuous": true,
"page_size": 1000,
"cron": "*/10 1-23 * * *",
"timezone": "UTC+8",
"stats": [
{
"max": {}
},
{
"value_count": {}
}
],
"interval": "1m",
"identity": [
"metadata.labels.cluster_id",
"metadata.labels.index_id",
"metadata.labels.index_name",
"metadata.category",
"payload.elasticsearch.index_stats.index_info.health"
],
"attributes": [
"agent.*",
"metadata.*"
],
"metrics": [
"payload.elasticsearch.index_stats.*"
],
"exclude": ["payload.elasticsearch.index_stats.routing.*"],
"filter": {
"metadata.name": "index_stats"
}
}
}
如何使用 Rollup 索引
从 1.10.0 版本开始,索引生命周期插件不再默认启用 rollup 搜索功能,如果想使用搜索 rollup 搜索功能,需要设置
PUT /_cluster/settings
{
"transient": {
"rollup.search.enabled": true
}
}
无需特意搜索 rollup 索引,只需使用标准的 _search API 对原始目标索引进行搜索。需要注意的是,查询时必须符合目标索引的约束条件。
以下是一个使用 Rollup 索引的示例:
GET target-test/_search
{
"size": 0,
"aggs": {
"a": {
"date_histogram": {
"field": "@timestamp",
"fixed_interval": "1h"
}
},
"total_passenger_count": {
"sum": {
"field": "passenger_count"
}
}
}
}
总结
Rollup 是处理时序数据的强大工具,能够有效降低存储成本并提高查询性能。Easysearch 的 Rollup 功能不仅支持多种聚合类型,还提供了自动滚动索引、无缝查询等特性,极大地简化了时序数据的管理和分析流程。通过合理配置 metrics
、attributes
、exclude
和 filter
参数,你可以灵活地控制 Rollup 任务的行为,从而高效地处理时序数据。
如果你正在处理大量的时序数据,不妨尝试使用 Rollup 来优化你的数据存储和查询。通过本文的介绍,相信你已经对 Rollup 有了深入的了解。赶快动手试试吧,体验 Rollup 带来的高效与便捷!
更详细的使用文档可在 官网 查看
关于 Easysearch
INFINI Easysearch 是一个分布式的搜索型数据库,实现非结构化数据检索、全文检索、向量检索、地理位置信息查询、组合索引查询、多语种支持、聚合分析等。Easysearch 可以完美替代 Elasticsearch,同时添加和完善多项企业级功能。Easysearch 助您拥有简洁、高效、易用的搜索体验。
官网文档:https://infinilabs.cn/docs/latest/easysearch
作者:张磊,极限科技(INFINI Labs)搜索引擎研发负责人,对 Elasticsearch 和 Lucene 源码比较熟悉,目前主要负责公司的 Easysearch 产品的研发以及客户服务工作。
Spring Boot 集成 Easysearch 完整指南
Easysearch • INFINI Labs 小助手 发表了文章 • 0 个评论 • 3016 次浏览 • 2024-12-29 15:41
Easysearch 的很多用户都有这样的需要,之前是用的 ES,现在要迁移到 Easysearch,但是业务方使用的是 Spring Boot 集成的客户端,问是否能平滑迁移。
Easysearch 是完全兼容 Spring Boot 的,完全不用修改,本指南将探讨如何将 Spring Boot 和 ES 的 high-level 客户端 与 Easysearch 进行集成,涵盖从基础设置到实现 CRUD 操作和测试的所有内容。
服务器设置
首先,需要修改 Easysearch 节点的 easysearch.yml 文件,打开并配置这 2 个配置项:
elasticsearch.api_compatibility: true
#根据客户端版本配置版本号,我这里配置成 7.17.18
elasticsearch.api_compatibility_version: "7.17.18"
项目设置
然后,让我们设置 Maven 依赖。以下是 pom.xml
中的基本配置:
<properties>
<java.version>11</java.version>
<spring-data-elasticsearch.version>4.4.18</spring-data-elasticsearch.version>
<elasticsearch.version>7.17.18</elasticsearch.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-elasticsearch</artifactId>
<version>${spring-data-elasticsearch.version}</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>${elasticsearch.version}</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>${elasticsearch.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
客户端连接配置
完全和连接 Elasticsearch 的方式一样,不用修改:
配置 src/main/resources/application.yml 文件
spring:
elasticsearch:
rest:
uris: https://localhost:9202
username: admin
password: xxxxxxxxxxx
ssl:
verification-mode: none
连接配置类
@Configuration
public class ElasticsearchConfig extends AbstractElasticsearchConfiguration {
@Value("${spring.elasticsearch.rest.uris}")
private String elasticsearchUrl;
@Value("${spring.elasticsearch.rest.username}")
private String username;
@Value("${spring.elasticsearch.rest.password}")
private String password;
@Override
@Bean
public RestHighLevelClient elasticsearchClient() {
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY,
new UsernamePasswordCredentials(username, password));
SSLContext sslContext = SSLContexts.custom()
.loadTrustMaterial(null, (x509Certificates, s) -> true)
.build();
RestClientBuilder builder = RestClient.builder(HttpHost.create(elasticsearchUrl))
.setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder
.setDefaultCredentialsProvider(credentialsProvider)
.setSSLContext(sslContext)
.setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE));
return new RestHighLevelClient(builder);
}
}
领域模型
使用 Spring 的 Elasticsearch 注解定义领域模型:
@Data
@Document(indexName = "products")
public class Product {
@Id
private String id;
@Field(type = FieldType.Text, name = "name")
private String name;
@Field(type = FieldType.Double, name = "price")
private Double price;
}
仓库层
创建继承 ElasticsearchRepository 的仓库接口:
@Repository
@EnableElasticsearchRepositories
public interface ProductRepository extends ElasticsearchRepository<Product, String> {
}
服务层
实现服务层来处理业务逻辑:
@Service
public class ProductService {
private final ProductRepository productRepository;
@Autowired
public ProductService(ProductRepository productRepository) {
this.productRepository = productRepository;
}
public Product saveProduct(Product product) {
return productRepository.save(product);
}
public Product findProductById(String id) {
return productRepository.findById(id).orElse(null);
}
}
测试
编写集成测试类:
@SpringBootTest
public class ProductServiceIntegrationTest {
@Autowired
private ElasticsearchOperations elasticsearchOperations;
@Autowired
private ProductService productService;
private static final String INDEX_NAME = "products";
@BeforeEach
public void setUp() {
IndexOperations indexOperations = elasticsearchOperations.indexOps(IndexCoordinates.of(INDEX_NAME));
if (indexOperations.exists()) {
indexOperations.delete();
}
// 定义 mapping
Document mapping = Document.create()
.append("properties", Document.create()
.append("name", Document.create()
.append("type", "text")
.append("analyzer", "standard"))
.append("price", Document.create()
.append("type", "double")));
// 创建索引并应用 mapping
indexOperations.create(Collections.EMPTY_MAP, mapping);
}
@Test
public void testSaveAndFindProduct() {
List<Product> products = Arrays.asList(
new Product("Test Product 1", 99.99),
new Product("Test Product 2", 199.99),
new Product("Test Product 3", 299.99)
);
List<IndexQuery> queries = products.stream()
.map(product -> new IndexQueryBuilder()
.withObject(product)
.withIndex(INDEX_NAME)
.build())
.collect(Collectors.toList());
List<IndexedObjectInformation> indexedInfos = elasticsearchOperations.bulkIndex(
queries,
IndexCoordinates.of(INDEX_NAME)
);
// 验证结果
List<String> ids = indexedInfos.stream()
.map(IndexedObjectInformation::getId)
.collect(Collectors.toList());
assertFalse(ids.isEmpty());
assertEquals(products.size(), ids.size());
}
}
结论
本指南展示了 Easysearch 与 Elasticsearch 的高度兼容性:
- 配置方式相同,仅需启用 Easysearch 的 API 兼容模式。
- 可直接使用现有 Elasticsearch 客户端。
- Maven 依赖无需更改。
- API、注解和仓库接口完全兼容。
- 现有测试代码可直接应用。
这种兼容性使得从 Elasticsearch 迁移到 Easysearch 成为一个简单、低风险的过程。Spring Boot 项目可以几乎无缝地切换到 Easysearch,同时获得其性能和资源利用方面的优势。
关于 Easysearch
INFINI Easysearch 是一个分布式的搜索型数据库,实现非结构化数据检索、全文检索、向量检索、地理位置信息查询、组合索引查询、多语种支持、聚合分析等。Easysearch 可以完美替代 Elasticsearch,同时添加和完善多项企业级功能。Easysearch 助您拥有简洁、高效、易用的搜索体验。
官网文档:https://infinilabs.cn/docs/latest/easysearch
作者:张磊,极限科技(INFINI Labs)搜索引擎研发负责人,对 Elasticsearch 和 Lucene 源码比较熟悉,目前主要负责公司的 Easysearch 产品的研发以及客户服务工作。
原文:https://infinilabs.cn/blog/2024/use-spring-boot-for-easysearch-connection/
INFINI Labs 产品更新 | Console/Gateway/Agent 等产品开源发布首个版本
资讯动态 • INFINI Labs 小助手 发表了文章 • 1 个评论 • 3225 次浏览 • 2024-12-27 16:11
INFINI Labs 产品又更新啦~,包括 Easysearch v1.9.0、Gateway、Console、Agent、Loadgen v1.27.0。本次各产品更新了很多亮点功能,如 Easysearch 新增 rollup 功能,优化了多版本兼容配置;Console/Gateway/Agent/Loadgen 及 Framework 开源后,发布首个重大更新版本,支持过期元数据删除,指标图表懒加载,指标采集协程优化等等,欢迎大家下载体验。
INFINI Easysearch v1.9.0
INFINI Easysearch 是一个分布式的搜索型数据库,实现非结构化数据检索、全文检索、向量检索、地理位置信息查询、组合索引查询、多语种支持、聚合分析等。Easysearch 可以完美替代 Elasticsearch,同时添加和完善多项企业级功能。Easysearch 助您拥有简洁、高效、易用的搜索体验。详情见:https://infinilabs.cn
Easysearch 本次更新如下:
Improvements
-
发布 rollup 功能
- 支持自动对 rollup 索引进行滚动,无需外部触发
- 支持 avg sum max min value_count percentiles 指标类型的聚合
- 支持 terms 聚合
- 支持对指标聚合进行 Pipeline 聚合
- 支持聚合前先对数据进行过滤
- 进行聚合查询时支持直接搜索原始索引,不用更改搜索代码
- 增加适配 logstash 8.x 的请求 header
- _cat/templates 增加 lifecycle 和 rollover 列的展示
Bug fix
- 修复 rest-api template 测试错误
INFINI Console v1.27.0
INFINI Console 是一款非常轻量级的多集群、跨版本的搜索基础设施统一管控平台。通过对流行的搜索引擎基础设施进行跨版本、多集群的集中纳管, 企业可以快速方便的统一管理企业内部的不同版本的多套搜索集群。开源地址:https://github.com/infinilabs/console
Console 在线体验: http://demo.infini.cloud (用户名/密码:readonly/readonly)。
Console 本次更新如下:
Improvements
- 代码开源,统一采用 Github 仓库进行开发
- 指标采集优化,由原来的单一协程采集调整为每个注册的集群有单独的协程进行采集
- 指标监控页面图表展示采用懒加载、单个图表独立加载,增强用户体验
- 通用时间控件增加超时时间设置
- 集群选择控件增加注册、刷新功能
- 提供指标采集状态
- 表格控件排版优化
Bug fix
- 修复集群元数据更新不及时问题
- 修复帮助文档等链接不正确问题
- 修复节点、索引数据因随机 id 出现重复记录问题
- 修复 Runtime、Agent 实例编辑页面出错问题
- 修复集群、节点、索引、分片元数据无 Loading 问题
- 修复索引健康状态指标采集失败问题
- 修复个别菜单列未国际化问题
INFINI Gateway v1.27.0
INFINI Gateway 是一个面向搜索场景的高性能数据网关,所有请求都经过网关处理后再转发到后端的搜索业务集群。基于 INFINI Gateway 可以实现索引级别的限速限流、常见查询的缓存加速、查询请求的审计、查询结果的动态修改等等。开源地址:https://github.com/infinilabs/gateway
Gateway 本次更新如下:
Improvements
- 调整队列消费者 slice 默认配置为 1
Bug fix
- 修复缓存数据丢失导致队列无法消费问题
- 同步更新 Framework 修复的一些已知问题
INFINI Agent v1.27.0
INFINI Agent 是 INFINI Console 的一个可选探针组件,负责采集和上传集群指标和日志等信息,并可通过 Console 管理。Agent 支持主流操作系统和平台,安装包轻量且无任何外部依赖,可以快速方便地安装。开源地址:https://github.com/infinilabs/agent
探针 Agent 本次更新如下:
Improvements
- 与 INFINI Console 统一版本号
- 同步更新 Framework 修复的已知问题
- 支持 K8S 环境指标采集
INFINI Loadgen v1.27.0
INFINI Loadgen 是一款轻量、无依赖的 Eaysearch/Elasticsearch/OpenSearch 性能压测工具,支持参数模板化配置,支持压测端均衡流量控制,可以模拟高并发请求。开源地址:https://github.com/infinilabs/loadgen
Loadgen 本次更新如下:
Improvements
- 保持与 Console 相同版本
- 同步更新 Framework 修复的已知问题
Bug fix
- 修复 API 接口测试逻辑异常问题
INFINI Framework
INFINI Framework 是 INFINI Labs 各产品依赖的核心公共代码库。开源地址:https://github.com/infinilabs/framework
Improvements
期待反馈
欢迎下载体验使用,如果您在使用过程中遇到如何疑问或者问题,欢迎前往 INFINI Labs Github(https://github.com/infinilabs) 中的对应项目中提交 Feature Request 或提交 Bug。
下载地址: https://infinilabs.cn/download
邮件:hello@infini.ltd
电话:(+86) 400-139-9200
Discord:https://discord.gg/4tKTMkkvVX
也欢迎大家微信扫码添加小助手(INFINI-Labs),加入用户群一起讨论交流。
关于极限科技(INFINI Labs)
极限科技,全称极限数据(北京)科技有限公司,是一家专注于实时搜索与数据分析的软件公司。旗下品牌极限实验室(INFINI Labs)致力于打造极致易用的数据探索与分析体验。
极限科技是一支年轻的团队,采用天然分布式的方式来进行远程协作,员工分布在全球各地,希望通过努力成为中国乃至全球企业大数据实时搜索分析产品的首选,为中国技术品牌输出添砖加瓦。
Easysearch Java SDK 2.0.x 使用指南(一)
Easysearch • INFINI Labs 小助手 发表了文章 • 0 个评论 • 2425 次浏览 • 2024-12-14 17:50
各位 Easysearch 的小伙伴们,我们前一阵刚把 easysearch-client 更新到了 2.0.2 版本!借此详细介绍下新版客户端的使用。
新版客户端和 1.0 版本相比,完全重构,抛弃了旧版客户端的一些历史包袱,从里到外都焕然一新!不管是刚入门的小白还是经验丰富的老司机,2.0.x 客户端都能让你开发效率蹭蹭往上涨!
到底有啥新东西?
- 更轻更快: 以前的版本依赖了一堆乱七八糟的东西,现在好了,我们把那些没用的都砍掉了,客户端变得更苗条,性能也杠杠的!
- 类型安全,告别迷糊: 常用的 Easysearch API 现在都配上了强类型的请求和响应对象,再也不用担心写错参数类型了,代码也更好看了,维护起来也更省心!
- 同步异步,想咋用咋用: 所有 API 都支持同步和异步两种调用方式,不管是啥场景,都能轻松应对!
- 构建查询,跟搭积木一样简单: 我们用了流式构建器和函数式编程,构建复杂查询的时候,代码写起来那叫一个流畅,看着也舒服!
- 和 Jackson 无缝对接: 可以轻松地把你的 Java 类和客户端 API 关联起来,数据转换嗖嗖的快!
快速上手
废话不多说,咱们直接上干货!这部分教你怎么快速安装和使用 easysearch-client 2.0.2 客户端,还会演示一些基本操作。
安装
easysearch-client 2.0.2 已经上传到 Maven 中央仓库了,加到你的项目里超级方便。
最低要求: JDK 8 或者更高版本
依赖管理: 客户端内部用 Jackson 来处理对象映射。
Maven 项目
在你的 pom.xml
文件的 <dependencies>
里面加上这段:
<dependencies>
<dependency>
<groupId>com.infinilabs</groupId>
<artifactId>easysearch-client</artifactId>
<version>2.0.2</version>
</dependency>
</dependencies>
Gradle 项目
在你的 build.gradle
文件的 dependencies
里面加上这段:
dependencies {
implementation 'com.infinilabs:easysearch-client:2.0.2'
}
初始化客户端
下面这段代码演示了怎么初始化一个启用了安全通信加密和 security 的 Easysearch 客户端,看起来有点长,别慌,我们一步一步解释!
public static EasysearchClient create() throws NoSuchAlgorithmException, KeyStoreException,
KeyManagementException {
final HttpHost[] hosts = new HttpHost[]{new HttpHost("localhost", 9200, "https")};
final SSLContext sslContext = SSLContextBuilder.create()
.loadTrustMaterial(null, (chains, authType) -> true).build();
SSLIOSessionStrategy sessionStrategy = new SSLIOSessionStrategy(sslContext, NoopHostnameVerifier.INSTANCE);
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("username", "passwowd"));
RestClient restClient = RestClient.builder(hosts)
.setHttpClientConfigCallback(httpClientBuilder ->
httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider)
.setSSLStrategy(sessionStrategy)
.disableAuthCaching()
).setRequestConfigCallback(requestConfigCallback ->
requestConfigCallback.setConnectTimeout(30000).setSocketTimeout(300000))
.build();
EasysearchTransport transport = new RestClientTransport(
restClient, new JacksonJsonpMapper());
return new EasysearchClient(transport);
}
这段代码,简单来说,就是:
- 连上 Easysearch: 我们要用 HTTPS 连接到本地的 9200 端口。
- 搞定证书: 这里为了方便,我们信任了所有证书(注意!生产环境一定要配置好你们自己的证书)。
- 填上用户名密码: 这里需要填上你的用户名和密码。
- 设置连接参数: 设置了连接超时时间(30 秒)和读取超时时间(300 秒)。
- 创建客户端: 最后,我们就创建好了一个
EasysearchClient
实例,可以开始干活了!
举个栗子:批量操作
下面的例子演示了怎么用 bulk
API 来批量索引数据:
public static void bulk() throws Exception {
String json2 = "{"
+ " \"@timestamp\": \"2023-01-08T22:50:13.059Z\","
+ " \"agent\": {"
+ " \"version\": \"7.3.2\","
+ " \"type\": \"filebeat\","
+ " \"ephemeral_id\": \"3ff1f2c8-1f7f-48c2-b560-4272591b8578\","
+ " \"hostname\": \"ba-0226-msa-fbl-747db69c8d-ngff6\""
+ " }"
+ "}";
EasysearchClient client = create();
BulkRequest.Builder br = new BulkRequest.Builder();
br.index("test1");
for (int i = 0; i < 10; i++) {
BulkOperation.Builder builder = new BulkOperation.Builder();
IndexOperation.Builder indexBuilder = new IndexOperation.Builder();
builder.index(indexBuilder.document(JsonData.fromJson(json2)).build());
br.operations(builder.build());
}
for (int i = 0; i < 10; i++) {
BulkOperation.Builder builder = new BulkOperation.Builder();
IndexOperation.Builder indexBuilder = new IndexOperation.Builder();
indexBuilder.document(JsonData.fromJson(json2)).index("test2");
builder.index(indexBuilder.build());
br.operations(builder.build());
}
for (int i = 0; i < 10; i++) {
Map<String, Object> map = new HashMap<>();
map.put("@timestamp", "2023-01-08T22:50:13.059Z");
map.put("field1", "value1");
IndexOperation.Builder indexBuilder = new IndexOperation.Builder();
indexBuilder.document(map).index("test3");
br.operations(new BulkOperation(indexBuilder.build()));
}
BulkResponse bulkResponse = client.bulk(br.build());
if (bulkResponse.errors()) {
for (BulkResponseItem item : bulkResponse.items()) {
System.out.println(item.toString());
}
}
client._transport().close();
}
这个例子里,我们一口气把数据批量索引到了 test1
、test2
和 test3
这三个索引里,
并且展示了三种在 bulk API 中构建 IndexOperation 的方式,虽然它们最终都能实现将文档索引到 Easysearch,但在使用场景和灵活性上还是有一些区别的:
这段代码的核心是利用 BulkRequest.Builder 来构建一个批量请求,并通过 br.operations(...) 方法添加多个操作。而每个操作,在这个例子里,都是一个 IndexOperation,也就是索引一个文档。IndexOperation 可以通过 IndexOperation.Builder 来创建。
三种方式的区别主要体现在如何构建 IndexOperation 里的 document 部分,也就是要索引的文档内容。
第一种方式:使用 JsonData.fromJson(json2) 且不指定索引。
特点:
使用 JsonData.fromJson(json2) 将一个 JSON 字符串直接转换成 JsonData 对象作为文档内容。
这里没有在 IndexOperation.Builder 上调用 index() 方法来指定索引名称。由于没有在每个 IndexOperation 中指定索引,这个索引名称将回退到 BulkRequest.Builder 上设置的索引,即 br.index("test1"),所以这 10 个文档都会被索引到 test1。
当你需要将一批相同结构的 JSON 文档索引到同一个索引时,这种方式比较简洁。
第二种方式:使用 JsonData.fromJson(json2) 并指定索引
特点:
同样使用 JsonData.fromJson(json2) 将 JSON 字符串转换成 JsonData 对象。
关键区别在于,这里在 IndexOperation.Builder 上调用了 index("test2"),为每个操作单独指定了索引名称。
这 10 个文档会被索引到 test2,即使 BulkRequest.Builder 上设置了 index("test1") 也没用,因为 IndexOperation 里的设置优先级更高。
当你需要将一批相同结构的 JSON 文档索引到不同的索引时,就需要使用这种方式来分别指定索引。
第三种方式:使用 Map<String, Object> 并指定索引
特点:
使用 Map<String, Object> 来构建文档内容,这种方式更加灵活,可以构建任意结构的文档。
同样在 IndexOperation.Builder 上调用了 index("test3") 指定了索引名称。
使用 new BulkOperation(indexBuilder.build()) 代替之前的 builder.index(indexBuilder.build()), 这是等价的。
这 10 个文档会被索引到 test3。
当你需要索引的文档结构不固定,或者你需要动态构建文档内容时,使用 Map 是最佳选择。例如,你可以根据不同的业务逻辑,往 Map 里添加不同的字段。
总结
这次 easysearch-client 2.0.x Java 客户端的更新真的很给力,强烈建议大家升级体验!相信我,用了新版客户端,你的开发效率绝对会提升一大截!
想要了解更多?
-
客户端 Maven 地址: https://mvnrepository.com/artifact/com.infinilabs/easysearch-client/2.0.2
- 更详细的文档和示例代码在 官网 持续更新中,请随时关注!
大家有啥问题或者建议,也欢迎随时反馈!
作者:张磊,极限科技(INFINI Labs)搜索引擎研发负责人,对 Elasticsearch 和 Lucene 源码比较熟悉,目前主要负责公司的 Easysearch 产品的研发以及客户服务工作。
极限科技(INFINI Labs)招聘:搜索运维工程师(Elasticsearch/Easysearch)【北京/全职】
求职招聘 • INFINI Labs 小助手 发表了文章 • 0 个评论 • 6128 次浏览 • 2024-09-28 11:00
我们是国内搜索型数据库产品厂商第一梯队的杰出代表,随着业务的快速发展,现开放岗位:搜索运维工程师( Elasticsearch/Easysearch ),如果有兴趣,请直接拉到文末,扫描二维码或将简历投递至 hello@infini.ltd。
如果您还不了解 极限科技(INFINI Labs)是谁,在做什么,需要什么样的小伙伴,那么请看下文:
我们是谁
极限科技,全称极限数据(北京)科技有限公司,是一家专注于实时搜索与数据分析的软件公司。旗下品牌极限实验室(INFINI Labs)致力于打造极致易用的数据探索与分析体验。
极限科技是一支年轻的团队,采用天然分布式的方式来进行远程协作,员工分布在全球各地,希望通过努力成为中国乃至全球企业大数据实时搜索分析产品的首选,为中国技术品牌输出添砖加瓦。
我们在做什么
极限科技(INFINI Labs)正在致力于以下几个核心方向:
1、开发近实时搜索引擎 INFINI Easysearch
INFINI Easysearch 是一个分布式的搜索型数据库,实现非结构化数据检索、全文检索、向量检索、地理位置信息查询、组合索引查询、多语种支持、聚合分析等。Easysearch 可以完美替代 Elasticsearch,同时添加和完善多项企业级功能。Easysearch 助您拥有简洁、高效、易用的搜索体验。详情参见:https://infinilabs.cn
2、打造下一代实时搜索引擎 INFINI Pizza
INFINI Pizza 是一个分布式混合搜索数据库系统。我们的使命是充分利用现代硬件和人工智能的潜力,为企业提供量身定制的实时智能搜索体验。我们致力于满足具有挑战性的环境中高并发和高吞吐量的需求,同时提供无缝高效的搜索功能。详情参见:https://pizza.rs
3、积极参与全球开源生态建设
通过开源项目和社区贡献,推动全球开源技术的发展,提升中国在全球开源领域的影响力。
4、提供专业服务
为客户提供包括搜索技术支持、迁移服务、定制解决方案和培训在内的全方位服务。
5、提供国产化搜索解决方案
针对中国市场的特殊需求,提供符合国产化标准的搜索产品和解决方案,帮助客户解决使用 Elasticsearch 时遇到的挑战。
极限科技(INFINI Labs)通过这些努力,旨在成为全球领先的实时搜索和数据分析解决方案提供商。
我们期待有才华、有激情的你加入我们,一起探索数据搜索的未来,共同创造无限可能!
在招岗位介绍
岗位名称
搜索运维工程师(Elasticsearch/Easysearch)
岗位职责
- 负责客户现场的 Elasticsearch/Easysearch/OpenSearch 搜索引擎集群的日常维护、监控和优化,确保集群的高可用性和性能稳定;
- 协助客户进行搜索引擎集群的部署、配置及版本升级;
- 排查和解决 Elasticsearch/Easysearch/OpenSearch 集群中的各种技术问题,及时响应并处理集群异常;
- 根据业务需求设计和实施搜索索引的调优、数据迁移和扩展方案;
- 负责与客户沟通,提供技术支持及相关培训,确保客户需求得到有效满足;
- 制定并实施搜索引擎的备份、恢复和安全策略,保障数据安全;
- 与内部研发团队和外部客户进行协作,推动集群性能改进和功能优化。
岗位要求
- 全日制本科及以上学历,5 年以上运维工作经验;
- 拥有 Elasticsearch/Easysearch/OpenSearch 使用经验,熟悉搜索引擎的原理、架构和相关生态工具(如 Logstash、Kibana 等);
- 熟悉 Linux 操作系统的使用及常见性能调优方法;
- 熟练掌握 Shell 或 Python 等至少一种脚本语言,能够编写自动化运维脚本;
- 具有优秀的问题分析与解决能力,能够快速应对突发情况;
- 具备良好的沟通能力和团队合作精神,能够接受 客户驻场工作;
- 全职,北京地区,需具备在北京长期工作的条件;
优先考虑
- 计算机科学、信息技术或相关专业;
- 具备丰富的大规模分布式系统运维经验;
- 熟悉 Elasticsearch/Easysearch/OpenSearch 分片、路由、查询优化等高级功能;
- 拥有 Elastic Certified Engineer 认证;
- 具备大规模搜索引擎集群设计、扩展和调优经验;
- 熟悉其他搜索引擎技术(如 Solr、Lucene)者优先 ;
- 熟悉大数据处理相关技术(比如: Kafka 、Flink 等)者优先。
福利待遇
- 月薪: 15K - 25K,具体根据能力而定,试用期为 3-6 个月;
- 福利:五险一金/双休/国内法定假日/带薪年假等;
简历投递
简历投递:hello@infini.ltd(邮件标题请备注姓名+求职岗位+来自搜索客社区)
微信联系:INFINI-Labs(加微请备注求职岗位+来自搜索客社区)
欢迎有兴趣的小伙伴联系或推荐,期待您的加入!
【第3期】INFINI Easysearch 免费认证培训开放报名
Easysearch • INFINI Labs 小助手 发表了文章 • 0 个评论 • 5796 次浏览 • 2024-09-13 17:43
探索 Easysearch 的无限可能,与 INFINI Labs 共赴搜索技术前沿!
随着数字化转型的加速,搜索技术已成为企业数据洞察的核心。INFINI Labs 作为搜索创新技术的引领者,诚邀所有对 Easysearch 搜索引擎感兴趣的开发者、技术爱好者及合作伙伴,参加我们即将于 2024 年 10 月 19 日至 20 日举办的第 3 期 Easysearch 线上免费培训活动。这不仅是一场知识的盛宴,更是技能提升的加速器,将助您在职业道路上迈出坚实的一步!
活动亮点
- 系统课程,全面深入:从 Easysearch 的基本概念到环境搭建,再到高级功能的实战应用,INFINI Labs 的技术专家将为您带来全面而深入的讲解,确保每位参与者都能收获满满。
- 实战导向,解决痛点:课程设计紧贴实际需求,旨在帮助学员掌握 Easysearch 的核心技术,有效解决工作中的搜索需求和技术难题,让理论知识迅速转化为实践能力。
- 认证证书,助力进阶:后期 INFINI Labs 将推出 Easysearch 认证考试。通过考试的学员将获得官方认证的 Easysearch 证书,为您的职业发展增添强力背书,开启职业生涯的新篇章。
培训时间
2024 年 10 月 19 日至 20 日(周六、周日)共两天,每天具体培训时间:
- 上午 09:30 ~ 11:30
- 下午 14:00 ~ 16:00
培训内容概览
第一阶段:初识 Easysearch
- Easysearch 环境搭建与对比,了解其与 Elasticsearch 的差异;
- 功能初探:身份验证、数据脱敏、权限控制等,全面掌握 Easysearch 的基础功能;
- 容灾技术:兼容性验证、跨集群复制等,确保您的搜索服务稳定可靠;
第二阶段:Easysearch 高阶使用
- 深度探析:性能压测、数据迁移、请求管理等,提升 Easysearch 的使用效率;
- 高级功能:快照管理、可视化看板、告警功能等,让您的搜索服务更加智能;
- 生态集成:Filebeat、Logstash、LangChain 等,轻松实现 Easysearch 与其他工具的集成;
参与方式
本次活动完全免费,名额有限,请尽快报名,同时微信扫码添加小助手进群(培训会议地址将在微信群公布),锁定您的学习席位!
扫码或点击 我要报名
👉 立即行动:不要错过这次提升自我、与行业精英共成长的宝贵机会。让我们相聚云端,共同探索 Easysearch 的无限可能,开启技术进阶的新篇章!
参会提示
- 培训内容涉及动手实践,请务必自备电脑(Windows 系统环境请提前安装好 Linux 虚拟机);
- 请提前在 INFINI Labs 官网下载对应平台最新安装包(INFINI Easysearch、INFINI Gateway、INFINI Console);
- 下载地址:https://infinilabs.cn/download
联系我们
如有任何疑问,欢迎通过微信添加 [小助手:INFINI-Labs] 与我们联系。
INFINI Labs 期待与您相约,共赴这场技术盛宴!
关于 Easysearch
Easysearch 是一个分布式的近实时搜索与分析引擎,基于开源的 Apache Lucene 构建。它旨在提供一个自主可控、轻量级的 Elasticsearch 可替代版本,并不断完善和支持更多的企业级功能。与 Elasticsearch 相比,Easysearch 更注重搜索业务场景的优化,同时保持其产品的简洁与易用性。
详情参见:Easysearch 介绍
关于极限科技(INFINI Labs)
极限科技,全称极限数据(北京)科技有限公司,是一家专注于实时搜索与数据分析的软件公司。旗下品牌极限实验室(INFINI Labs)致力于打造极致易用的数据探索与分析体验。
极限科技是一支年轻的团队,采用天然分布式的方式来进行远程协作,员工分布在全球各地,希望通过努力成为中国乃至全球企业大数据实时搜索分析产品的首选,为中国技术品牌输出添砖加瓦。
如何用 Scrapy 爬取网站数据并在 Easysearch 中进行存储检索分析
Easysearch • INFINI Labs 小助手 发表了文章 • 0 个评论 • 5488 次浏览 • 2024-09-13 12:28
做过数据分析和爬虫程序的小伙伴想必对 Scrapy 这个爬虫框架已经很熟悉了。今天给大家介绍下,如何基于 Scrapy 快速编写一个爬虫程序并利用 Easysearch 储存、检索、分析爬取的数据。我们以极限科技的官网 Blog 为数据源(https://infinilabs.cn/blog) ,做下实操演示。
1、安装 scrapy
使用 Scrapy 可以快速构建一个爬虫项目,从目标网站中获取所需的数据,并进行后续的处理和分析。
pip install scrapy
# 新建项目 infini_spiders
scrapy startproject infini_spiders
# 初始化爬虫
cd infini_spiders/spiders
scrapy genspider blog infinilabs.cn
2、爬虫编写
编写一个爬虫文件 blog.py ,它会首先访问 start_urls 指定的地址,将结果发给 parse 函数解析。通过这一步解析,我们得到了每一篇博客的地址。然后我们对每个博客的地址发送请求,将结果发给 parse_blog 函数进行解析,在这里才会真正提取每篇博客的 title、tag、url、date、content 内容。
from typing import Any, Iterable
import scrapy
from bs4 import BeautifulSoup
from scrapy.http import Response
class BlogSpider(scrapy.Spider):
name = "blog"
allowed_domains = ["infinilabs.cn"]
start_urls = ["https://infinilabs.cn/blog/"]
def parse(self, response):
links = response.css("div.blogs a")
yield from response.follow_all(links, self.parse_blog)
def parse_blog(self, response):
title = response.xpath('//div[@class="title"]/text()').extract_first()
tags = response.xpath('//div[@class="tags"]/div[@class="tag"]/text()').extract()
url = response.url
author = response.xpath('//div[@class="logo"]/div[@class="name"]//text()').extract_first()
date = response.xpath('//div[@class="date"]/text()').extract_first()
all_text = response.xpath('//p//text() | //h3/text() | //h2/text() | //h4/text() | //ol/li//text()').extract()
content = '\n'.join(all_text)
yield {
'title': title,
'tags': tags,
'url': url,
'author': author,
'date': date,
'content': content
}
提取完我们想要的内容后,接下来就要考虑存储了。考虑到要对内容进行检索、分析,接下来我们将内容直接存放到 Easysearch 当中。
3、安装插件
通过安装 ScrapyElasticsearch pipeline 可将 scrapy 爬取的内容存入到 Easysearch 中。
pip install ScrapyElasticSearch
修改 scrapy 自带的配置文件 settings.py ,添加以下内容。
ITEM_PIPELINES = {
'scrapyelasticsearch.scrapyelasticsearch.ElasticSearchPipeline': 10
}
ELASTICSEARCH_SERVERS = ['http://192.168.56.3:9210']
ELASTICSEARCH_INDEX = 'scrapy'
ELASTICSEARCH_INDEX_DATE_FORMAT = '%Y-%m-%d'
ELASTICSEARCH_TYPE = '_doc'
ELASTICSEARCH_USERNAME = 'admin'
ELASTICSEARCH_PASSWORD = '9423d1d5345ed6d0db19'
ScrapyElasticSearch 会以 bulk 方式写入 Easysearch,每次批量的大小由 scrapyelasticsearch.scrapyelasticsearch.ElasticSearchPipeline 参数控制,大家可自行修改。
在上述配置中,我们会将爬到的数据存放到 scrapy-yyyy-mm-dd 索引中。
4、启动爬虫
在 infini_spiders/spiders 目录下,使用命令启动爬虫。
scrapy crawl blog
blog 就是爬虫的名字,对应到 blog.py 里面的 name 变量。运行完成后,就可以去 Easysearch 里查看数据了,当然我们还是使用 Console 进行查看。
5、查看数据
先查看下索引情况,scrapy 索引已经生成,里面有 129 篇博客。
查看详细内容,确保博客正文已经保存。
到了这一步,我们就能使用 Console 对博客进行搜索、分析了。
6、结语
这次的分享就到这里了。欢迎与我一起交流 ES 的各种问题和解决方案。
关于 Easysearch
INFINI Easysearch 是一个分布式的近实时搜索与分析引擎,核心引擎基于开源的 Apache Lucene。Easysearch 的目标是提供一个轻量级的 Elasticsearch 可替代版本,并继续完善和支持更多的企业级功能。 与 Elasticsearch 相比,Easysearch 更关注在搜索业务场景的优化和继续保持其产品的简洁与易用性。
官网文档:https://infinilabs.cn/docs/latest/easysearch
Easysearch 性能测试方法概要
Easysearch • INFINI Labs 小助手 发表了文章 • 0 个评论 • 3107 次浏览 • 2024-08-23 14:47
INFINI Easysearch
INFINI Easysearch 是一个分布式的近实时搜索与分析引擎,核心引擎基于开源的 Apache Lucene。Easysearch 衍生自基于开源协议 Apache 2.0 的 Elasticsearch 7.10 版本,完善和支持更多的企业级功能,优化搜索业务场景,以保证更佳的数据探索与分析体验。
Easysearch 的主要特点:
- 兼容 Elasticsearch,业务代码无需改动;可平滑迁移
- 企业级安全;更稳定可靠
- 企业级管理后台(多集群统一管理,实现运营标准化、自动化)
- 信创适配(全面适配国产 CPU/OS/服务器,支持国密算法)
Easysearch 快速体验,请参阅:
Loadgen
Loadgen 是 Elasticsearch 专属压测工具,用来对 Easysearch 或者网关进行压力测试。
Loadgen 的特点:
- 性能强劲
- 轻量级无依赖
- 支持模板化参数随机
- 支持高并发
- 支持压测端均衡流量控制
- 支持服务端返回值校验
当前最新版本为 1.26.1-598,下载链接如下:
https://release.infinilabs.com/loadgen/stable/
下载并解压安装包后,得到二进制文件。
查看版本信息。
$ ./loadgen-linux-amd64 -v
__ ___ _ ___ ___ __ __
/ / /___\/_\ / \/ _ \ /__\/\ \ \
/ / // ///_\\ / /\ / /_\//_\ / \/ /
/ /__/ \_// _ \/ /_// /_\\//__/ /\ /
\____|___/\_/ \_/___,'\____/\__/\_\ \/
[LOADGEN] A http load generator and testing suite.
[LOADGEN] 1.26.1#598, 2024-08-14 04:50:03, 2024-12-31 10:10:10, 00f15fd86834d7ea539f6d66ee608e3915eef0e3
loadgen 1.26.1 598 2024-08-14 04:50:03 +0000 UTC 2024-12-31 10:10:10 +0000 UTC 00f15fd86834d7ea539f6d66ee608e3915eef0e3
Loadgen 测试
Loadgen 使用非常简单,下面演示如何进行查询压测。
- 建立索引,根据节点数调节分片数。
curl -X PUT -H "Content-Type: application/json" \
-ku admin:xxx "https://localhost:9200/loadtest" -d'
{
"settings":{
"number_of_shards":"3",
"number_of_replicas":1,
"translog":{
"durability":"async"
}
}
}'
{"acknowledged":true,"shards_acknowledged":true,"index":"loadtest"}
- 创建
loadgen.dsl.shawnyan
配置文件,定义查询
GET loadtest/_search
{"query": {"term": {"id.keyword": {"value": $[[id]]}}}}
- 执行压测,
-d
表示秒数,-c
表示并发数。
$ ES_ENDPOINT=https://localhost:9200 ES_USERNAME=admin ES_PASSWORD=xxx ./loadgen-linux-amd64 -run loadgen.dsl.shawnyan -d 10 -c 2
__ ___ _ ___ ___ __ __
/ / /___\/_\ / \/ _ \ /__\/\ \ \
/ / // ///_\\ / /\ / /_\//_\ / \/ /
/ /__/ \_// _ \/ /_// /_\\//__/ /\ /
\____|___/\_/ \_/___,'\____/\__/\_\ \/
[LOADGEN] A http load generator and testing suite.
[LOADGEN] 1.26.1#598, 2024-08-14 04:50:03, 2024-12-31 10:10:10, 00f15fd86834d7ea539f6d66ee608e3915eef0e3
[08-19 16:43:27] [INF] [env.go:179] configuration auto reload enabled
[08-19 16:43:27] [INF] [app.go:285] initializing loadgen, pid: 30792
[08-19 16:43:27] [INF] [app.go:286] using config: /data/es/loadgen.yml
[08-19 16:43:27] [INF] [module.go:155] started plugin: statsd
[08-19 16:43:27] [INF] [module.go:161] all modules are started
[08-19 16:43:27] [INF] [instance.go:78] workspace: /data/es/data/loadgen/nodes/cr1gabqr90cng685o2s0
[08-19 16:43:27] [INF] [app.go:511] loadgen is up and running now.
[08-19 16:43:27] [INF] [main.go:403] loading config: /data/es/loadgen.dsl.shawnyan
21108 requests finished in 9.79061677s, 1.08MB sent, 3.22MB received
[Loadgen Client Metrics]
Requests/sec: 2110.63
Request Traffic/sec: 110.22KB
Total Transfer/sec: 440.00KB
Fastest Request: 680.198µs
Slowest Request: 12.409574ms
Status 200: 21108
[Latency Metrics]
10000 samples of 21108 events
Cumulative: 8.732205871s
HMean: 851.869µs
Avg.: 873.22µs
p50: 839.498µs
p75: 914.298µs
p95: 1.059197ms
p99: 1.327098ms
p999: 4.83579ms
Long 5%: 1.394411ms
Short 5%: 724.226µs
Max: 11.618475ms
Min: 680.198µs
Range: 10.938277ms
StdDev: 289.216µs
Rate/sec.: 2110.63
[Latency Distribution]
680µs - 1.774ms ------------------------------
1.774ms - 2.867ms -
2.867ms - 3.961ms -
3.961ms - 5.055ms -
5.055ms - 6.149ms -
6.149ms - 7.243ms -
7.243ms - 8.336ms -
8.336ms - 9.43ms -
9.43ms - 10.524ms -
10.524ms - 11.618ms -
[Estimated Server Metrics]
Requests/sec: 2155.94
Avg Req Time: 927.668µs
Transfer/sec: 449.45KB
更多内容请参阅文档:
https://infinilabs.cn/docs/latest/gateway/getting-started/benchmark/
Rally
如果对 Elasticsearch 熟悉的同学,也可尝试使用 Rally 对 Easysearch 进行测试。
Rally 是 Elasticsearch 的基准测试框架。它可以帮助您完成以下任务:
- 安装 Elasticsearch 集群以进行基准测试
- 跨 Elasticsearch 版本管理基准数据和规范
- 运行基准测试并记录结果
- 通过连接遥测设备来查找性能问题
- 比较性能结果
安装 Rally。
[root@easysearch /]# pip3 install esrally
Requirement already satisfied: esrally in /usr/local/lib/python3.9/site-packages (2.11.0)
Requirement already satisfied: py-cpuinfo==7.0.0 in /usr/local/lib/python3.9/site-packages (from esrally) (7.0.0)
Requirement already satisfied: elastic-transport==8.4.1 in /usr/local/lib/python3.9/site-packages (from esrally) (8.4.1)
Requirement already satisfied: google-resumable-media[requests]==1.1.0 in /usr/local/lib/python3.9/site-packages (from esrally) (1.1.0)
Requirement already satisfied: urllib3==1.26.18 in /usr/local/lib/python3.9/site-packages (from esrally) (1.26.18)
Requirement already satisfied: google-auth==1.22.1 in /usr/local/lib/python3.9/site-packages (from esrally) (1.22.1)
Requirement already satisfied: thespian==3.10.1 in /usr/local/lib/python3.9/site-packages (from esrally) (3.10.1)
Requirement already satisfied: jsonschema==3.1.1 in /usr/local/lib/python3.9/site-packages (from esrally) (3.1.1)
Requirement already satisfied: markupsafe==2.0.1 in /usr/local/lib64/python3.9/site-packages (from esrally) (2.0.1)
Requirement already satisfied: yappi==1.5.1 in /usr/local/lib64/python3.9/site-packages (from esrally) (1.5.1)
Requirement already satisfied: psutil==5.9.4 in /usr/local/lib64/python3.9/site-packages (from esrally) (5.9.4)
Requirement already satisfied: certifi in /usr/local/lib/python3.9/site-packages (from esrally) (2024.7.4)
Requirement already satisfied: elasticsearch[async]==8.6.1 in /usr/local/lib/python3.9/site-packages (from esrally) (8.6.1)
Requirement already satisfied: ijson==2.6.1 in /usr/local/lib/python3.9/site-packages (from esrally) (2.6.1)
Requirement already satisfied: jinja2==3.1.4 in /usr/local/lib/python3.9/site-packages (from esrally) (3.1.4)
Requirement already satisfied: requests<2.32.0 in /usr/local/lib/python3.9/site-packages (from esrally) (2.31.0)
Requirement already satisfied: tabulate==0.8.9 in /usr/local/lib/python3.9/site-packages (from esrally) (0.8.9)
Requirement already satisfied: zstandard==0.21.0 in /usr/local/lib64/python3.9/site-packages (from esrally) (0.21.0)
Requirement already satisfied: docker==6.0.0 in /usr/local/lib/python3.9/site-packages (from esrally) (6.0.0)
Requirement already satisfied: websocket-client>=0.32.0 in /usr/local/lib/python3.9/site-packages (from docker==6.0.0->esrally) (1.8.0)
Requirement already satisfied: packaging>=14.0 in /usr/lib/python3.9/site-packages (from docker==6.0.0->esrally) (20.9)
Requirement already satisfied: aiohttp<4,>=3 in /usr/local/lib64/python3.9/site-packages (from elasticsearch[async]==8.6.1->esrally) (3.10.4)
Requirement already satisfied: pyasn1-modules>=0.2.1 in /usr/local/lib/python3.9/site-packages (from google-auth==1.22.1->esrally) (0.4.0)
Requirement already satisfied: six>=1.9.0 in /usr/lib/python3.9/site-packages (from google-auth==1.22.1->esrally) (1.15.0)
Requirement already satisfied: rsa<5,>=3.1.4 in /usr/local/lib/python3.9/site-packages (from google-auth==1.22.1->esrally) (4.9)
Requirement already satisfied: setuptools>=40.3.0 in /usr/lib/python3.9/site-packages (from google-auth==1.22.1->esrally) (53.0.0)
Requirement already satisfied: cachetools<5.0,>=2.0.0 in /usr/local/lib/python3.9/site-packages (from google-auth==1.22.1->esrally) (4.2.4)
Requirement already satisfied: google-crc32c<2.0dev,>=1.0 in /usr/local/lib64/python3.9/site-packages (from google-resumable-media[requests]==1.1.0->esrally) (1.5.0)
Requirement already satisfied: attrs>=17.4.0 in /usr/local/lib/python3.9/site-packages (from jsonschema==3.1.1->esrally) (24.2.0)
Requirement already satisfied: importlib-metadata in /usr/local/lib/python3.9/site-packages (from jsonschema==3.1.1->esrally) (8.2.0)
Requirement already satisfied: pyrsistent>=0.14.0 in /usr/local/lib64/python3.9/site-packages (from jsonschema==3.1.1->esrally) (0.20.0)
Requirement already satisfied: yarl<2.0,>=1.0 in /usr/local/lib64/python3.9/site-packages (from aiohttp<4,>=3->elasticsearch[async]==8.6.1->esrally) (1.9.4)
Requirement already satisfied: frozenlist>=1.1.1 in /usr/local/lib64/python3.9/site-packages (from aiohttp<4,>=3->elasticsearch[async]==8.6.1->esrally) (1.4.1)
Requirement already satisfied: aiosignal>=1.1.2 in /usr/local/lib/python3.9/site-packages (from aiohttp<4,>=3->elasticsearch[async]==8.6.1->esrally) (1.3.1)
Requirement already satisfied: async-timeout<5.0,>=4.0 in /usr/local/lib/python3.9/site-packages (from aiohttp<4,>=3->elasticsearch[async]==8.6.1->esrally) (4.0.3)
Requirement already satisfied: aiohappyeyeballs>=2.3.0 in /usr/local/lib/python3.9/site-packages (from aiohttp<4,>=3->elasticsearch[async]==8.6.1->esrally) (2.3.7)
Requirement already satisfied: multidict<7.0,>=4.5 in /usr/local/lib64/python3.9/site-packages (from aiohttp<4,>=3->elasticsearch[async]==8.6.1->esrally) (6.0.5)
Requirement already satisfied: pyparsing>=2.0.2 in /usr/lib/python3.9/site-packages (from packaging>=14.0->docker==6.0.0->esrally) (2.4.7)
Requirement already satisfied: pyasn1<0.7.0,>=0.4.6 in /usr/local/lib/python3.9/site-packages (from pyasn1-modules>=0.2.1->google-auth==1.22.1->esrally) (0.6.0)
Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.9/site-packages (from requests<2.32.0->esrally) (3.7)
Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib64/python3.9/site-packages (from requests<2.32.0->esrally) (3.3.2)
Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.9/site-packages (from importlib-metadata->jsonschema==3.1.1->esrally) (3.20.0)
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
[root@easysearch /]# esrally --version
esrally 2.11.0
[root@easysearch /]#
关于 Rally 的更多内容,请参阅官方文档:
https://esrally.readthedocs.io/en/stable/
作者:少安事务所
原文:https://mp.weixin.qq.com/s/9eEH38kgsw4i150CJqyxvQ
Easysearch x 《黑神话悟空》有奖征文获奖结果公示
Easysearch • INFINI Labs 小助手 发表了文章 • 0 个评论 • 2804 次浏览 • 2024-08-20 13:34
随着《黑神话:悟空》游戏的正式发售,我们 INFINI Labs 组织的 Easysearch 有奖征文大赛也圆满落幕。本次征文活动自启动以来,收到了众多创作者的热情投稿。在此,我们衷心感谢每一位参与活动的作者,是你们的才华和热情让这次征文活动异彩纷呈。
经过专业评审团的认真评选,最终确定了以下获奖作品及作者,现予以公布:
奖项 | 作者 | 作品 | 奖品 |
---|---|---|---|
一等奖 | AWS 加油站 | 玩转 Easysearch 语法 | 《黑神话:悟空》数字豪华版一套 |
二等奖 | 杨帆 | 使用 Easysearch 打造企业内部知识问答系统 | 《黑神话:悟空》数字标准版一套 |
二等奖 | 李家兴 | 从 Elasticsearch 到 Easysearch:国产搜索型数据库的崛起与未来展望 | 《黑神话:悟空》数字标准版一套 |
三等奖 | 严少安 | Easysearch,地表最强,没有之一! | INFINI Labs 咖啡杯 / 指甲剪套装 |
三等奖 | 张磊 | Easysearch 新特性:写入限流功能介绍 | INFINI Labs 咖啡杯 / 指甲剪套装 |
三等奖 | keep | 如何在 MacOS 环境下快速安装部署 Easysearch | INFINI Labs 咖啡杯 / 指甲剪套装 |
恭喜以上获奖作者,你们的作品不仅展现了 Easysearch 的强大功能,也为社区成员提供了宝贵的学习资源。我们将会通过小助手微信联系各位获奖者,安排奖品的发放。
同时,我们也要感谢所有参与本次征文活动的作者,你们的每一篇 Easysearch 投稿都是对社区的一份贡献。我们期待在未来的活动中再次与大家相遇。
请继续关注 INFINI Labs,我们将持续为大家带来更多优质的产品和精彩的活动。再次感谢大家的参与和支持!
如有疑问或想加入 Easysearch 用户交流群请联系我们小助手!
附征文活动原文:
天命人, 你在吗?快拿走你的《黑神话:悟空》游戏,去开启神话冒险!
关于极限科技(INFINI Labs)
极限科技,全称极限数据(北京)科技有限公司,是一家专注于实时搜索与数据分析的软件公司。旗下品牌极限实验室(INFINI Labs)致力于打造极致易用的数据探索与分析体验。
极限科技是一支年轻的团队,采用天然分布式的方式来进行远程协作,员工分布在全球各地,希望通过努力成为中国乃至全球企业大数据实时搜索分析产品的首选,为中国技术品牌输出添砖加瓦。
【 INFINI Workshop 北京站】1月18日一起动手实验玩转 Easysearch
活动 • liaosy 发表了文章 • 0 个评论 • 2737 次浏览 • 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)进行联系
【INFINI Workshop 上海站】7 月 27 日一起动手实验玩转 Easysearch
资讯动态 • liaosy 发表了文章 • 1 个评论 • 2793 次浏览 • 2023-07-07 16:30
INFINI Labs 产品更新 | Coco AI – 增强 AI 搜索、API 管理与性能优化等
资讯动态 • INFINI Labs 小助手 发表了文章 • 0 个评论 • 1896 次浏览 • 2025-03-15 18:21
INFINI Labs 产品更新发布!此次更新涵盖 Coco AI 、Easysearch 等产品多项重要升级,重点提升 AI 搜索能力、易用性及企业级优化。
- Coco AI v0.2 作为 开源、跨平台的 AI 搜索工具,新增 APP 自动更新提示、API Token 管理、文档处理优化 等功能。
- INFINI Easysearch v1.11.1 集成 AI 向量搜索,优化查询聚合能力。
- INFINI Console、Gateway、Agent、Loadgen、Framework 关键问题修复,优化 WebSocket 处理与整体用户体验。
- Coco AI Server 增强 WebSocket 会话处理、支持 RAG 会话和动态配置,并新增图形化管理界面。
Coco AI v0.2
Coco AI 是一个完全开源、跨平台的统一 AI 搜索与效率工具,能够连接并搜索多种数据源,包括应用程序、文件、谷歌网盘、Notion、语雀、Hugo 等本地与云端数据。通过接入 DeepSeek 等大模型,Coco AI 实现了智能化的个人知识库管理,注重隐私,支持私有部署,帮助用户快速、智能地访问信息。
Coco AI 本次详细更新记录如下:
Coco AI 客户端 v0.2.1
功能更新
- 支持 APP 应用内更新提示并可自动更新
问题修复
- 修复融合搜索包含已禁用服务器的问题
- 修复版本类型不正确:应为字符串而不是 u32
- 修复聊天推送结束的判断类型不准确问题
优化改进
- 重构了聊天组件
- 添加服务链接展示
- 优化了聊天滚动效果和聊天数据渲染效果
- 设置聊天窗口最小宽度 & 移除输入框背景
- 移除废弃的选中功能 & 添加选择隐藏 APP 功能
- Websocket 超时增加到 2 分钟
Coco AI 服务端 v0.2.2
功能更新
- 新增图形化管理界面
- 新增数据源下文档创建 API
- 新增文件上传相关 API
- 新增 API TOKEN 管理相关 API
- 数据源同步支持动态配置时间间隔
- 支持动态更新服务端设置
- 支持动态更新大模型相关设置
- 新增 RAG 聊天会话处理
- 新增联网搜索能力
- 支持对接 Deepseek 大模型
- 新增文档预处理 Processor
问题修复
- 修复 Google Drive Connector 缺少文件报错
优化改进
- 优化聊天会话功能
- 优化 Websocket 会话管理
- 优化登录退出接口
- 保存 Notion 其它内容到 Payload 字段
- 完善后台任务退出机制
- 优化默认索引模版和查询模版
INFINI Easysearch v1.11.1
INFINI Easysearch 是一个分布式的搜索型数据库,实现非结构化数据检索、全文检索、向量检索、地理位置信息查询、组合索引查询、多语种支持、聚合分析等。Easysearch 可以完美替代 Elasticsearch,同时添加和完善多项企业级功能。Easysearch 助您拥有简洁、高效、易用的搜索体验。
Easysearch 本次更新如下:
功能更新
- 新增 AI 模块,集成 Ollama embedding API,支持文本向量化
问题修复
- 修复 DateRange 聚合在 Rollup 查询中无法正确合并的问题
优化改进
针对用户使用体验进行了多项改进,包括:
- 弃用 KNN 模块中的 index.knn 配置项,(此配置项和其他功能经常发生冲突) 简化配置逻辑,该配置项将在后续版本中移除
- 将 KNN 搜索功能从插件形式集成为内置功能,无需额外安装即可使用
- 将跨集群复制(CCR)功能从插件形式集成为内置功能,开箱即用
- 优化索引配置更新验证:增加非动态配置项的值比对,避免误报
INFINI Console v1.29.1
INFINI Console 是一款开源的非常轻量级的多集群、跨版本的搜索基础设施统一管控平台。通过对流行的搜索引擎基础设施进行跨版本、多集群的集中纳管, 企业可以快速方便的统一管理企业内部的不同版本的多套搜索集群。
Console 在线体验:
http://demo.infini.cloud (用户名/密码:readonly/readonly)。
Console 本次更新如下:
问题修复
- 修复 agentless 模式下计算索引级别实时 QPS 不准确的问题
INFINI Gateway v1.29.1
INFINI Gateway 是一个开源的面向搜索场景的高性能数据网关,所有请求都经过网关处理后再转发到后端的搜索业务集群。基于 INFINI Gateway 可以实现索引级别的限速限流、常见查询的缓存加速、查询请求的审计、查询结果的动态修改等等。
Gateway 本次更新如下:
优化改进
- 同步更新 Framework v1.1.4 优化了一些已知问题
INFINI Agent v1.29.1
INFINI Agent 负责采集和上传 Elasticsearch, Easysearch, Opensearch 集群的日志和指标信息,通过 INFINI Console 管理,支持主流操作系统和平台,安装包轻量且无任何外部依赖,可以快速方便地安装。
Agent 本次更新如下:
优化改进
- 同步更新 Framework v1.1.4 优化了一些已知问题
INFINI Loadgen v1.29.1
INFINI Loadgen 是一款开源的专为 Easysearch、Elasticsearch、OpenSearch 设计的轻量级性能测试工具。
Loadgen 本次更新如下:
优化改进
- 同步更新 Framework v1.1.4 优化了一些已知问题
INFINI Framework v1.1.4
INFINI Framework 是 INFINI Labs 基于 Golang 的产品的核心基础,已开源。该框架以开发者为中心设计,简化了构建高性能、可扩展且可靠的应用程序的过程。
Framework 本次更新如下:
功能更新
- 添加配置选项,以在 WebSocket 连接期间禁用回显消息
- 允许在 WebSocket 连接/断开时注册回调函数
- 为 API 添加可选的登录验证配置
优化改进
- 停止任务后取消任务
- 回调发生错误时关闭 WebSocket 连接
更多详情请查看以下详细的 Release Notes 或联系我们的技术支持团队!
期待反馈
欢迎下载体验使用,如果您在使用过程中遇到如何疑问或者问题,欢迎前往 INFINI Labs Github(https://github.com/infinilabs) 中的对应项目中提交 Feature Request 或提交 Bug。
下载地址: https://infinilabs.cn/download
邮件:hello@infini.ltd
电话:(+86) 400-139-9200
Discord:https://discord.gg/4tKTMkkvVX
也欢迎大家微信扫码添加小助手(INFINI-Labs),加入用户群一起讨论交流。
关于极限科技(INFINI Labs)
极限科技,全称极限数据(北京)科技有限公司,是一家专注于实时搜索与数据分析的软件公司。旗下品牌极限实验室(INFINI Labs)致力于打造极致易用的数据探索与分析体验。
极限科技是一支年轻的团队,采用天然分布式的方式来进行远程协作,员工分布在全球各地,希望通过努力成为中国乃至全球企业大数据实时搜索分析产品的首选,为中国技术品牌输出添砖加瓦。
活动回顾 - 第7期 搜索客 Meetup 线上直播活动圆满结束,附 PPT 下载与视频回放
活动 • searchkit 发表了文章 • 0 个评论 • 2489 次浏览 • 2025-03-09 15:29
2025 年 03 月 07 日,由搜索客社区和极限科技(INFINI Labs)联合举办的第 7 期线上 Meetup 技术交流直播活动圆满结束。本期 Meetup 直播活动吸引了超过 700+ 技术爱好者观看参与,活动主要介绍了极限科技新推出并正在研发的开源智能搜索产品 Coco AI 的技术特点和应用场景,并探讨了如何通过 AI 等技术提高企业内部协作的效率和智能化程度。
本期 Meetup 活动回顾
本期 Meetup 活动的分享嘉宾是 极限科技(INFINI Labs)创始人和 CEO 曾勇老师(Medcl) ,Medcl 在搜索技术领域有着丰富的经验和深厚的积累,致力于下一代搜索引擎和智能 AI 搜索领域相关技术的研究。他为大家带来了主题为 《开源智能搜索与知识库管理 - Coco AI》 精彩分享。
Medcl 首先介绍了极限科技的成立背景和主要业务。极限科技成立于 2021 年底,致力于为企业提供国产化的搜索工具和产品。其中,Coco AI 是极限科技最近推出的一款开源智能搜索产品,旨在为用户提供更加便捷、高效的搜索体验。
Medcl 详细介绍了 Coco AI 的产品架构和功能特点。Coco AI 采用分布式架构,支持多种数据源连接和异构数据的整合。同时,它还集成了 AI 技术,能够实现智能问答、意图识别等功能,帮助用户更加高效地获取所需信息。
在 Medcl 的演示中,我们看到了 Coco AI 的实际应用效果。通过简单的配置和操作,用户可以轻松地连接各种数据源,并实现快速检索和智能问答。同时,Coco AI 还支持多种操作系统和设备,为用户提供了更加便捷的使用体验。
在活动的互动环节中,观众们积极提问,Medcl 耐心解答了关于 Coco AI 的技术细节和应用场景等问题。下面摘取部分问答:
问 1:Coco AI 的架构图中有提到 Pizza,Pizza 是向量数据库吗?
答:Pizza 是极限科技即将推出的下一代搜索引擎,既包含全文检索的能力,也包含向量检索能力。问 2: Coco AI App 的 windows 版本啥时候开放下载体验?
答:已开放下载,下载地址:https://coco.rs/,欢迎体验和反馈!问 3: 幻觉问题有解决方案吗,试了很多款 RAG 开源项目,还有云服务,都没有特别好的方式
答:大模型幻觉问题可通过多阶段处理和提示词设计优化:先快速识别意图并筛选信息,再提取可靠资料,最后用高精度模型生成答案,耗时较长但准确性高;同时提示模型在依据不足时回答“缺少信息”,避免无意义输出。这种分层处理方式有效减少幻觉问题,提升可靠性。问 4: Coco 怎么做数据源的更新的 🤔
答:Coco AI 的数据源更新方式灵活多样:1.定期更新,通过 Connect 定期按频率更新数据;2.主动推送,支持业务方主动推送数据或结合消息通知,实现部分更新;3.接口支持,提供接口接收推送数据,实时检索更新,适应多种数据场景。问 5: Coco 的数据源是否计划支持飞书云文档?
答:飞书云文档我们本身是有计划的,因为飞书云文档我们也有在用的我们。支持起来的话也很快。
同时,在整个直播过程中,主持人进行了多轮激动人心的抽奖活动,为参会小伙伴带来了额外的惊喜。
最后感谢大家的参与和支持,让我们共同期待下一次 搜索客 Meetup 活动带来更多的精彩内容!
本期 Meetup 的 PPT 下载
本期 PPT 下载的链接:https://searchkit.cn/slides/331
本期 Meetup 视频回放
扫码关注极限实验室视频号查看直播回放,或者扫码关注极限实验室 B 站 账号,可查看本期 Meetup 活动视频。我们也会在视频号、B 站持续更新最新技术视频,欢迎通过点赞、投币,收藏,三连来支持我们。
Meetup 活动讲师招募
搜索客社区 Meetup 的成功举办,离不开社区小伙伴的热情参与。目前社区讲师招募计划也在持续进行中,我们诚挚邀请各位技术大咖、行业精英踊跃提交演讲议题,与大家分享您的经验。
讲师报名链接:http://cfp.searchkit.cn
或扫描下方二维码,立刻报名成为讲师!
Meetup 活动聚焦 AI 与搜索领域的最新动态,以及数据实时搜索分析、向量检索、技术实践与案例分析、日志分析、安全等领域的深度探讨。
我们热切期待您的精彩分享!
关于 搜索客(SearchKit)社区
搜索客社区由 Elasticsearch 中文社区进行全新的品牌升级,以新的 Slogan:“搜索人自己的社区” 为宣言。汇集搜索领域最新动态、精选干货文章、精华讨论、文档资料、翻译与版本发布等,为广大搜索领域从业者提供更为丰富便捷的学习和交流平台。社区官网:https://searchkit.cn 。
关于极限科技(INFINI Labs)
极限科技,全称极限数据(北京)科技有限公司,是一家专注于实时搜索与数据分析的软件公司。旗下品牌极限实验室(INFINI Labs)致力于打造极致易用的数据探索与分析体验。
极限科技是一支年轻的团队,采用天然分布式的方式来进行远程协作,员工分布在全球各地,希望通过努力成为中国乃至全球企业大数据实时搜索分析产品的首选,为中国技术品牌输出添砖加瓦。
【搜索客社区日报】第1998期 (2025-03-07)
社区日报 • Fred2000 发表了文章 • 0 个评论 • 1948 次浏览 • 2025-03-07 10:33
Easysearch 证书:Windows 上创建自签名证书的 7 种方法
Easysearch • liaosy 发表了文章 • 0 个评论 • 3281 次浏览 • 2025-02-09 18:58
背景
最近 INFINI Labs 社区有 Easysearch 开发者反馈,其开发环境为 Windows 系统,安装部署 Easysearch 时初始化证书遇到麻烦,如果没有证书就无法开启 Easysearch TLS 传输加密来保护数据的网络传输安全。本文将介绍在 Windows 上创建自签名证书的 7 种不同方法。
使用在线工具 certificatetools.com
在允许生成自签名证书的在线服务中,CertificateTools 是最先进的。只需查看所有可用选项即可:
就这么简单!
使用 Let’s Encrypt
首先,安装 Certbot,这是 Let’s Encrypt 官方推荐的工具,用于自动化获取和续期 SSL/TLS 证书。
1. 安装 Certbot
- 访问 Certbot 下载页面。
- 选择 Windows 系统,下载并安装 Certbot。
2. 获取证书
- 打开 命令提示符 或 PowerShell 以管理员身份运行。
- 输入以下命令获取证书(替换 example.com 为你的域名):
certbot certonly --standalone --preferred-challenges http -d example.com
- Certbot 会自动通过 HTTP 验证域名并生成证书。证书会存储在:
C:\Certbot\live\example.com\
里面有以下文件:
- cert.pem:证书。
- privkey.pem:私钥。
- fullchain.pem:完整证书链。
3. 导入证书
- 打开 Windows 证书管理器 (mmc),选择 个人 文件夹。
- 右键点击 个人 文件夹,选择 导入,导入 cert.pem 和 privkey.pem。
4. 验证证书
- 在证书管理器中,确认证书已成功导入并配置。
5. 续期证书
- 使用以下命令手动续期证书:
certbot renew
使用 OpenSSL
OpenSSL 是一个跨平台的工具,适用于各种操作系统,包括 Windows。在 Windows 上,你需要首先安装 OpenSSL。
步骤:
- 从 OpenSSL 官方网站 下载并安装 OpenSSL。
- 打开 命令提示符 或 PowerShell,并导航到 OpenSSL 的安装目录。
- 运行以下命令生成自签名证书:
openssl req -new -x509 -keyout mycert.pem -out mycert.pem -days 365
-new:创建一个新的证书请求。
-x509:生成一个自签名证书。
-keyout 和 -out:指定证书和私钥文件的保存路径。
-days 365:证书有效期为 365 天。
- 系统会提示你输入一些证书的详细信息,如国家、组织名等。
验证:
检查生成的 mycert.pem 文件是否存在,并通过命令 openssl x509 -in mycert.pem -text 查看证书的内容。
使用 PowerShell
PowerShell 提供了一个简单的命令 New-SelfSignedCertificate 来创建自签名证书。以下是具体的操作步骤:
步骤:
- 按下 Windows + X,选择 Windows PowerShell (管理员)。
- 在 PowerShell 窗口中输入以下命令:
New-SelfSignedCertificate -DnsName "example.com" -CertStoreLocation "cert:\LocalMachine\My"
-DnsName "example.com":指定证书的 DNS 名称,可以更改为你需要的域名或主机名。
-CertStoreLocation "cert:\LocalMachine\My":将证书存储到本地计算机的证书存储区。
- 执行后,证书将被创建,并存储在 Windows 证书管理器中。
验证:
- 打开 运行 (Windows + R),输入 mmc,点击确定。
- 在 MMC 中,选择 文件 > 添加/删除管理单元,选择 证书,然后选择 计算机帐户。
- 查看 个人 文件夹,你将看到刚才创建的证书。
使用 IIS
IIS(Internet Information Services)是一种 Web 服务器软件,可以通过它为你的服务器生成自签名证书。
步骤:
- 打开 IIS 管理器,选择你的服务器名称。
- 在主界面中,双击 服务器证书 选项。
- 在右侧操作面板中,点击 创建自签名证书。
- 输入证书的名称(如:example.com),然后选择证书的存储位置。
- 点击确定,证书将被创建并存储在 IIS 中。
验证:
在 服务器证书 部分,你将看到已创建的证书。
使用 MMC 管理工具
Windows 提供了 MMC 管理工具,可以通过图形界面创建自签名证书。
步骤:
- 按 Windows + R 打开运行窗口,输入 mmc 并按下回车。
- 在 MMC 中,选择 文件 > 添加/删除管理单元,点击 证书 并选择 计算机帐户。
- 选择 本地计算机 > 确定。
- 在左侧的证书树中,右键点击 个人 文件夹,选择 所有任务 > 请求新证书。
- 跟随向导填写证书的详细信息并选择 自签名证书 选项,完成后证书将被创建。
验证:
在 MMC 中查看证书是否已经生成,并且可以在 个人 文件夹中找到它。
使用 XCA 工具
XCA 是一个开源工具,支持生成和管理证书。它为用户提供了一个图形化界面,适合那些不熟悉命令行操作的用户。
步骤:
- 从 XCA 官方网站 下载并安装 XCA。
- 启动 XCA,点击 文件 > 新建数据库 来创建一个新的证书数据库。
- 在 证书 选项卡中,点击 新建证书。
- 在证书的设置中,选择 自签名证书,然后填写证书的详细信息。
- 点击 保存 来生成证书。
验证:
生成的证书可以在 XCA 的 证书 列表中查看,并导出为文件或在需要的地方使用。
总结
在 Windows 上创建自签名证书对于开发者和管理员来说是一项常见任务。自签名证书通常用于测试环境、开发、或者是没有商业证书的情况下使用。本文所述在 Windows 上创建自签名证书的 7 种方法都有详细步骤和验证方式,希望能给你带来帮助。
参考资料
Spring Boot 集成 Easysearch 完整指南
Easysearch • INFINI Labs 小助手 发表了文章 • 0 个评论 • 3328 次浏览 • 2025-02-08 12:27
Easysearch 的很多用户都有这样的需要,之前是用的 ES,现在要迁移到 Easysearch,但是业务方使用的是 Spring Boot 集成的客户端,问是否能平滑迁移。
Easysearch 是完全兼容 Spring Boot 的,完全不用修改,本指南将探讨如何将 Spring Boot 和 ES 的 high-level 客户端 与 Easysearch 进行集成,涵盖从基础设置到实现 CRUD 操作和测试的所有内容。
服务器设置
首先,需要修改 Easysearch 节点的 easysearch.yml 文件,打开并配置这 2 个配置项:
elasticsearch.api_compatibility: true
#根据客户端版本配置版本号,我这里配置成 7.17.18
elasticsearch.api_compatibility_version: "7.17.18"
项目设置
然后,让我们设置 Maven 依赖。以下是 pom.xml
中的基本配置:
<properties>
<java.version>11</java.version>
<spring-data-elasticsearch.version>4.4.18</spring-data-elasticsearch.version>
<elasticsearch.version>7.17.18</elasticsearch.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-elasticsearch</artifactId>
<version>${spring-data-elasticsearch.version}</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>${elasticsearch.version}</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>${elasticsearch.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
客户端连接配置
完全和连接 Elasticsearch 的方式一样,不用修改:
配置 src/main/resources/application.yml 文件
spring:
elasticsearch:
rest:
uris: https://localhost:9202
username: admin
password: xxxxxxxxxxx
ssl:
verification-mode: none
连接配置类
@Configuration
public class ElasticsearchConfig extends AbstractElasticsearchConfiguration {
@Value("${spring.elasticsearch.rest.uris}")
private String elasticsearchUrl;
@Value("${spring.elasticsearch.rest.username}")
private String username;
@Value("${spring.elasticsearch.rest.password}")
private String password;
@Override
@Bean
public RestHighLevelClient elasticsearchClient() {
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY,
new UsernamePasswordCredentials(username, password));
SSLContext sslContext = SSLContexts.custom()
.loadTrustMaterial(null, (x509Certificates, s) -> true)
.build();
RestClientBuilder builder = RestClient.builder(HttpHost.create(elasticsearchUrl))
.setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder
.setDefaultCredentialsProvider(credentialsProvider)
.setSSLContext(sslContext)
.setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE));
return new RestHighLevelClient(builder);
}
}
领域模型
使用 Spring 的 Elasticsearch 注解定义领域模型:
@Data
@Document(indexName = "products")
public class Product {
@Id
private String id;
@Field(type = FieldType.Text, name = "name")
private String name;
@Field(type = FieldType.Double, name = "price")
private Double price;
}
仓库层
创建继承 ElasticsearchRepository 的仓库接口:
@Repository
@EnableElasticsearchRepositories
public interface ProductRepository extends ElasticsearchRepository<Product, String> {
}
服务层
实现服务层来处理业务逻辑:
@Service
public class ProductService {
private final ProductRepository productRepository;
@Autowired
public ProductService(ProductRepository productRepository) {
this.productRepository = productRepository;
}
public Product saveProduct(Product product) {
return productRepository.save(product);
}
public Product findProductById(String id) {
return productRepository.findById(id).orElse(null);
}
}
测试
编写集成测试类:
@SpringBootTest
public class ProductServiceIntegrationTest {
@Autowired
private ElasticsearchOperations elasticsearchOperations;
@Autowired
private ProductService productService;
private static final String INDEX_NAME = "products";
@BeforeEach
public void setUp() {
IndexOperations indexOperations = elasticsearchOperations.indexOps(IndexCoordinates.of(INDEX_NAME));
if (indexOperations.exists()) {
indexOperations.delete();
}
// 定义 mapping
Document mapping = Document.create()
.append("properties", Document.create()
.append("name", Document.create()
.append("type", "text")
.append("analyzer", "standard"))
.append("price", Document.create()
.append("type", "double")));
// 创建索引并应用 mapping
indexOperations.create(Collections.EMPTY_MAP, mapping);
}
@Test
public void testSaveAndFindProduct() {
List<Product> products = Arrays.asList(
new Product("Test Product 1", 99.99),
new Product("Test Product 2", 199.99),
new Product("Test Product 3", 299.99)
);
List<IndexQuery> queries = products.stream()
.map(product -> new IndexQueryBuilder()
.withObject(product)
.withIndex(INDEX_NAME)
.build())
.collect(Collectors.toList());
List<IndexedObjectInformation> indexedInfos = elasticsearchOperations.bulkIndex(
queries,
IndexCoordinates.of(INDEX_NAME)
);
// 验证结果
List<String> ids = indexedInfos.stream()
.map(IndexedObjectInformation::getId)
.collect(Collectors.toList());
assertFalse(ids.isEmpty());
assertEquals(products.size(), ids.size());
}
}
结论
本指南展示了 Easysearch 与 Elasticsearch 的高度兼容性:
- 配置方式相同,仅需启用 Easysearch 的 API 兼容模式。
- 可直接使用现有 Elasticsearch 客户端。
- Maven 依赖无需更改。
- API、注解和仓库接口完全兼容。
- 现有测试代码可直接应用。
这种兼容性使得从 Elasticsearch 迁移到 Easysearch 成为一个简单、低风险的过程。Spring Boot 项目可以几乎无缝地切换到 Easysearch,同时获得其性能和资源利用方面的优势。
关于 Easysearch
INFINI Easysearch 是一个分布式的搜索型数据库,实现非结构化数据检索、全文检索、向量检索、地理位置信息查询、组合索引查询、多语种支持、聚合分析等。Easysearch 可以完美替代 Elasticsearch,同时添加和完善多项企业级功能。Easysearch 助您拥有简洁、高效、易用的搜索体验。
官网文档:https://infinilabs.cn/docs/latest/easysearch
作者:张磊,极限科技(INFINI Labs)搜索引擎研发负责人,对 Elasticsearch 和 Lucene 源码比较熟悉,目前主要负责公司的 Easysearch 产品的研发以及客户服务工作。
原文:https://infinilabs.cn/blog/2024/use-spring-boot-for-easysearch-connection/
Easysearch 集群通过 API 进行用户密码重置
Easysearch • INFINI Labs 小助手 发表了文章 • 0 个评论 • 3234 次浏览 • 2025-02-07 17:52
在日常使用 Easysearch 中,难免会遇到集群密码需要重置的情况(如密码遗失、安全审计要求等)。
通过查看 Easysearch 用户接口文档,创建用户使用如下接口:
PUT _security/user/<username>
{
"password": "adminpass",
"roles": ["maintenance_staff", "weapons"],
"external_roles": ["captains", "starfleet"],
"attributes": {
"attribute1": "value1",
"attribute2": "value2"
}
}
同样可以通过该接口对用户进行密码重置:
PUT _security/user/<username>
{
"password": "adminpass111",
"roles": ["maintenance_staff", "weapons"],
"external_roles": ["captains", "starfleet"],
"attributes": {
"attribute1": "value1",
"attribute2": "value2"
}
API 接口创建的用户
创建一个测试用户 test,并进行访问验证。
通过接口重置用户 test 密码,并进行访问验证。
配置文件创建的用户
在配置文件 user.yml
中添加测试用户(test1、test2)配置:
## Test users
test1:
hash: "$2y$12$ZNfKKCeeRQXOWX27W50tbu0Tq4NT4ADdCQOBoZzokI1zR8ZEUWm4W" # test1
reserved: true
roles:
- "readall_and_monitor"
test2:
hash: "$2y$12$m4/eSiDlzRII87vNeKwzteEHGpgpbdMr5tRvOfve/xIbEYdC4bU7a" # test2
reserved: false
roles:
- "readall_and_monitor"
其中 hash
字段是将用户密码哈希出来的值,可通过 bin/hash_password.sh -p "<明文密码>"
生成。
进行用户访问验证。
对 test1、test2 用户进行密码重置。
用户 test1 重置失败,用户 test2 重置成功。用户 test1 重置失败是因为配置了 reserved: true
,将用户 test1 指定为内置用户,使用用户 admin 会因为权限无法进行密码重置,那就需要使用有更高权限的管理证书进行密码重置。默认在 Easysearch 集群执行初始化脚本 bin/initialize.sh
时,会在 config
目录下生成证书文件,其中 admin.crt
、admin.key
为管理证书。
test1 用户密码重置成功,进行访问验证。
关于 Easysearch
INFINI Easysearch 是一个分布式的搜索型数据库,实现非结构化数据检索、全文检索、向量检索、地理位置信息查询、组合索引查询、多语种支持、聚合分析等。Easysearch 可以完美替代 Elasticsearch,同时添加和完善多项企业级功能。Easysearch 助您拥有简洁、高效、易用的搜索体验。
如何在 Easysearch 中使用 Rollup 优化时序数据的存储和查询
Easysearch • INFINI Labs 小助手 发表了文章 • 0 个评论 • 2465 次浏览 • 2025-01-14 10:05
背景
在现代数据驱动的世界中,时序数据的处理变得越来越重要。无论是监控系统、日志分析,还是物联网设备的数据收集,时序数据都占据了大量的存储空间。随着时间的推移,这些数据的存储成本和管理复杂度也在不断增加。
为了解决这一问题,Rollup 技术应运而生。本文将带你深入了解 Rollup 的概念、优势以及如何在 Easysearch 中使用 Rollup 来优化时序数据的存储和查询。
什么是 Rollup?
Rollup 是一种数据聚合技术,主要用于处理时序数据。它通过将细粒度的原始数据汇总为粗粒度的数据,从而减少存储空间并提高查询效率。简单来说,Rollup 可以将大量的详细数据压缩为更小的、更具代表性的数据集,同时保留关键的业务指标。
Rollup 的优势
- 降低存储成本:通过汇总数据,Rollup 可以显著减少历史数据的存储空间,从而降低存储成本。
- 提高查询性能:汇总后的数据量更小,查询速度更快,尤其是在处理大规模历史数据时,性能提升尤为明显。
- 无缝集成:Easysearch 的 Rollup 功能支持直接查询原始索引,业务代码无需修改,用户无感知。
- 自动化管理:Rollup 任务可以自动滚动生成新的索引,无需手动干预,简化了数据管理流程。
Rollup 的使用场景
Rollup 特别适用于以下场景:
- 监控系统:监控系统产生的指标数据通常非常详细,但随着时间推移,这些数据的价值逐渐降低。通过 Rollup,可以将这些数据汇总为更粗粒度的指标,保留关键信息的同时减少存储压力。
- 日志分析:日志数据通常包含大量的细节信息,但随着时间的推移,这些细节信息的重要性逐渐降低。Rollup 可以帮助你将日志数据汇总为更高层次的统计信息,便于长期存储和分析。
- 物联网数据:物联网设备产生的数据量巨大,且大部分数据在短期内具有较高的分析价值。通过 Rollup,可以将这些数据汇总为更粗粒度的形式,便于长期存储和查询。
使用 Rollup 的先决条件
在使用 Rollup 之前,需要满足以下条件:
安装索引生命周期管理插件:Rollup 功能是索引生命周期管理插件的一部分,因此必须安装该插件。
源索引必须包含 date 类型字段:Rollup 依赖于时间字段来进行数据聚合,因此源索引必须包含一个 date 类型的字段。
Easysearch 中的 Rollup 功能
Easysearch 提供了强大的 Rollup 功能,支持多种聚合类型,并且可以自动滚动生成新的索引。下面我们将详细介绍如何在 Easysearch 中使用 Rollup。
支持的聚合类型
Easysearch 的 Rollup 功能支持以下聚合类型:
- 数值类型字段:
avg
、sum
、max
、min
、value_count
、percentiles
- keyword 类型字段:
terms
聚合 - date 类型字段:
date_histogram
和date_range
聚合
Rollup 的核心参数详解
在配置 Rollup 任务时,以下几个参数至关重要:
1. metrics
参数:定义需要聚合的数值字段
metrics
参数用于指定哪些数值字段需要进行聚合计算。Rollup 任务会对这些字段进行指定的聚合操作(如 avg
、sum
、max
、min
、value_count
、percentiles
),并将结果存储到目标索引中。
示例:
"metrics": [
"payload.elasticsearch.index_stats.*"
]
在这个例子中,metrics
指定了对 payload.elasticsearch.index_stats
下的所有字段进行聚合。
2. attributes
参数:保留原始数据的非聚合字段
attributes
参数用于指定哪些字段需要原封不动地保留在 Rollup 结果中。这些字段不会被聚合,而是直接复制到目标索引中。
示例:
"attributes": [
"agent.*",
"metadata.*"
]
在这个例子中,attributes
指定了所有以 agent.
和 metadata.
开头的字段都会被保留到 Rollup 结果中。
3. exclude
参数:排除不需要处理的字段
exclude
参数用于排除某些字段,使其不参与 Rollup 任务。这些字段既不会被聚合,也不会被保留到目标索引中。
示例:
"exclude": ["payload.elasticsearch.index_stats.routing.*"]
在这个例子中,exclude
指定了 payload.elasticsearch.index_stats.routing
下的所有字段都不会被处理。
4. filter
参数:过滤源数据
filter
参数用于过滤源数据,只有符合过滤条件的文档才会被 Rollup 任务处理。这个参数可以帮助你减少需要处理的数据量,从而提高 Rollup 任务的效率。
示例:
"filter": {
"metadata.name": "index_stats"
}
在这个例子中,filter
指定了只有 metadata.name
字段值为 index_stats
的文档才会被 Rollup 任务处理。
5. identity
参数:定义分组字段
identity
参数用于指定哪些字段作为分组条件。Rollup 任务会根据这些字段的值对数据进行分组,然后在每个分组内进行聚合计算。
功能:
- 定义数据分组的字段。
- 支持多个字段的组合,用于创建唯一的分组键。
- 常用于标识数据的来源或类别。
示例:
"identity": [
"metadata.labels.cluster_id",
"metadata.labels.index_id",
"metadata.labels.index_name",
"metadata.category",
"payload.elasticsearch.index_stats.index_info.health"
]
在这个例子中,identity
指定了多个字段作为分组条件。Rollup 任务会根据这些字段的值对数据进行分组,然后在每个分组内进行聚合计算。
6. interval
参数:定义时间聚合间隔
interval
参数用于指定时间聚合的间隔。Rollup 任务会根据这个间隔将数据按时间分桶,然后在每个时间桶内进行聚合计算。
功能:
- 定义时间聚合的粒度。
- 支持多种时间单位,如
1m
(1 分钟)、1h
(1 小时)、1d
(1 天)等。 - 常用于按时间维度汇总数据。
示例:
"interval": "1m"
在这个例子中,interval
指定了时间聚合的间隔为 1 分钟。Rollup 任务会每分钟对数据进行一次聚合。
1.10 版本的新特性
从 Easysearch 1.10.0 版本开始,Rollup 功能引入了一些新特性,进一步增强了其灵活性和易用性。
1. 支持 date_range
聚合
在 1.10.0 版本中,Rollup 增加了对 原始索引使用 date_range
聚合的支持。这意味着你可以在原始索引根据日期范围对数据进行聚合,而不仅仅是固定的时间间隔。
示例:
"date_range": {
"field": "@timestamp",
"ranges": [
{ "from": "now-1d/d", "to": "now" },
{ "from": "now-7d/d", "to": "now-1d/d" }
]
}
2. 通配符方式批量启动/停止 Rollup Job
在 1.10.0 版本中,你可以使用通配符批量启动或停止 Rollup 任务。这大大简化了任务管理的操作。
示例:
POST _rollup/jobs/rollup*/_start
POST _rollup/jobs/rollup*/_stop
3. 设置 Rollup 索引自动滚动的条数
你可以通过设置 rollup.max_docs
参数,控制 Rollup 索引自动滚动的条数。当索引中的文档数量达到设定值时,系统会自动创建一个新的 Rollup 索引。
示例:
PUT /_cluster/settings
{
"transient": {
"rollup.max_docs": 10000000
}
}
4. 新增 ROLLUP_SEARCH_MAX_COUNT
配置
在 1.10.0 版本中,新增了 ROLLUP_SEARCH_MAX_COUNT
配置项,用于控制 Rollup 在运行 Job 时收集历史数据的最大并发分片请求数。这个配置项可以帮助你优化 Rollup 任务的性能,并避免集群资源过载。
功能:
- 控制并发请求数:限制 Rollup 任务在执行搜索请求时的最大并发分片请求数。
- 动态调整:支持在集群运行时动态调整,无需重启集群。
- 默认值:
2
,即默认情况下,Rollup 任务最多会同时发送 2 个并发分片请求。
示例:
PUT /_cluster/settings
{
"transient": {
"rollup.search.max_count": 2
}
}
在这个例子中,ROLLUP_SEARCH_MAX_COUNT
被设置为 2
,表示 Rollup 任务在执行搜索请求时,最多会同时发送 2 个并发分片请求。
配置建议:
- 小规模集群:建议设置为较小的值(如
2
),以避免资源竞争。 - 大规模集群:可以适当增加该值(如
4
),以提高并发性能。 - 动态调整:根据集群负载情况动态调整该值,以优化性能和资源利用率。
创建 Rollup 任务的完整示例
以下是一个完整的 Rollup 任务配置示例,展示了 metrics
、attributes
、exclude
和 filter
参数的综合使用:
PUT _rollup/jobs/rollup1
{
"rollup": {
"source_index": ".infini_metrics",
"target_index": "rollup1_{{ctx.source_index}}",
"timestamp": "timestamp",
"continuous": true,
"page_size": 1000,
"cron": "*/10 1-23 * * *",
"timezone": "UTC+8",
"stats": [
{
"max": {}
},
{
"value_count": {}
}
],
"interval": "1m",
"identity": [
"metadata.labels.cluster_id",
"metadata.labels.index_id",
"metadata.labels.index_name",
"metadata.category",
"payload.elasticsearch.index_stats.index_info.health"
],
"attributes": [
"agent.*",
"metadata.*"
],
"metrics": [
"payload.elasticsearch.index_stats.*"
],
"exclude": ["payload.elasticsearch.index_stats.routing.*"],
"filter": {
"metadata.name": "index_stats"
}
}
}
如何使用 Rollup 索引
从 1.10.0 版本开始,索引生命周期插件不再默认启用 rollup 搜索功能,如果想使用搜索 rollup 搜索功能,需要设置
PUT /_cluster/settings
{
"transient": {
"rollup.search.enabled": true
}
}
无需特意搜索 rollup 索引,只需使用标准的 _search API 对原始目标索引进行搜索。需要注意的是,查询时必须符合目标索引的约束条件。
以下是一个使用 Rollup 索引的示例:
GET target-test/_search
{
"size": 0,
"aggs": {
"a": {
"date_histogram": {
"field": "@timestamp",
"fixed_interval": "1h"
}
},
"total_passenger_count": {
"sum": {
"field": "passenger_count"
}
}
}
}
总结
Rollup 是处理时序数据的强大工具,能够有效降低存储成本并提高查询性能。Easysearch 的 Rollup 功能不仅支持多种聚合类型,还提供了自动滚动索引、无缝查询等特性,极大地简化了时序数据的管理和分析流程。通过合理配置 metrics
、attributes
、exclude
和 filter
参数,你可以灵活地控制 Rollup 任务的行为,从而高效地处理时序数据。
如果你正在处理大量的时序数据,不妨尝试使用 Rollup 来优化你的数据存储和查询。通过本文的介绍,相信你已经对 Rollup 有了深入的了解。赶快动手试试吧,体验 Rollup 带来的高效与便捷!
更详细的使用文档可在 官网 查看
关于 Easysearch
INFINI Easysearch 是一个分布式的搜索型数据库,实现非结构化数据检索、全文检索、向量检索、地理位置信息查询、组合索引查询、多语种支持、聚合分析等。Easysearch 可以完美替代 Elasticsearch,同时添加和完善多项企业级功能。Easysearch 助您拥有简洁、高效、易用的搜索体验。
官网文档:https://infinilabs.cn/docs/latest/easysearch
作者:张磊,极限科技(INFINI Labs)搜索引擎研发负责人,对 Elasticsearch 和 Lucene 源码比较熟悉,目前主要负责公司的 Easysearch 产品的研发以及客户服务工作。
Spring Boot 集成 Easysearch 完整指南
Easysearch • INFINI Labs 小助手 发表了文章 • 0 个评论 • 3016 次浏览 • 2024-12-29 15:41
Easysearch 的很多用户都有这样的需要,之前是用的 ES,现在要迁移到 Easysearch,但是业务方使用的是 Spring Boot 集成的客户端,问是否能平滑迁移。
Easysearch 是完全兼容 Spring Boot 的,完全不用修改,本指南将探讨如何将 Spring Boot 和 ES 的 high-level 客户端 与 Easysearch 进行集成,涵盖从基础设置到实现 CRUD 操作和测试的所有内容。
服务器设置
首先,需要修改 Easysearch 节点的 easysearch.yml 文件,打开并配置这 2 个配置项:
elasticsearch.api_compatibility: true
#根据客户端版本配置版本号,我这里配置成 7.17.18
elasticsearch.api_compatibility_version: "7.17.18"
项目设置
然后,让我们设置 Maven 依赖。以下是 pom.xml
中的基本配置:
<properties>
<java.version>11</java.version>
<spring-data-elasticsearch.version>4.4.18</spring-data-elasticsearch.version>
<elasticsearch.version>7.17.18</elasticsearch.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-elasticsearch</artifactId>
<version>${spring-data-elasticsearch.version}</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>${elasticsearch.version}</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>${elasticsearch.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
客户端连接配置
完全和连接 Elasticsearch 的方式一样,不用修改:
配置 src/main/resources/application.yml 文件
spring:
elasticsearch:
rest:
uris: https://localhost:9202
username: admin
password: xxxxxxxxxxx
ssl:
verification-mode: none
连接配置类
@Configuration
public class ElasticsearchConfig extends AbstractElasticsearchConfiguration {
@Value("${spring.elasticsearch.rest.uris}")
private String elasticsearchUrl;
@Value("${spring.elasticsearch.rest.username}")
private String username;
@Value("${spring.elasticsearch.rest.password}")
private String password;
@Override
@Bean
public RestHighLevelClient elasticsearchClient() {
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY,
new UsernamePasswordCredentials(username, password));
SSLContext sslContext = SSLContexts.custom()
.loadTrustMaterial(null, (x509Certificates, s) -> true)
.build();
RestClientBuilder builder = RestClient.builder(HttpHost.create(elasticsearchUrl))
.setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder
.setDefaultCredentialsProvider(credentialsProvider)
.setSSLContext(sslContext)
.setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE));
return new RestHighLevelClient(builder);
}
}
领域模型
使用 Spring 的 Elasticsearch 注解定义领域模型:
@Data
@Document(indexName = "products")
public class Product {
@Id
private String id;
@Field(type = FieldType.Text, name = "name")
private String name;
@Field(type = FieldType.Double, name = "price")
private Double price;
}
仓库层
创建继承 ElasticsearchRepository 的仓库接口:
@Repository
@EnableElasticsearchRepositories
public interface ProductRepository extends ElasticsearchRepository<Product, String> {
}
服务层
实现服务层来处理业务逻辑:
@Service
public class ProductService {
private final ProductRepository productRepository;
@Autowired
public ProductService(ProductRepository productRepository) {
this.productRepository = productRepository;
}
public Product saveProduct(Product product) {
return productRepository.save(product);
}
public Product findProductById(String id) {
return productRepository.findById(id).orElse(null);
}
}
测试
编写集成测试类:
@SpringBootTest
public class ProductServiceIntegrationTest {
@Autowired
private ElasticsearchOperations elasticsearchOperations;
@Autowired
private ProductService productService;
private static final String INDEX_NAME = "products";
@BeforeEach
public void setUp() {
IndexOperations indexOperations = elasticsearchOperations.indexOps(IndexCoordinates.of(INDEX_NAME));
if (indexOperations.exists()) {
indexOperations.delete();
}
// 定义 mapping
Document mapping = Document.create()
.append("properties", Document.create()
.append("name", Document.create()
.append("type", "text")
.append("analyzer", "standard"))
.append("price", Document.create()
.append("type", "double")));
// 创建索引并应用 mapping
indexOperations.create(Collections.EMPTY_MAP, mapping);
}
@Test
public void testSaveAndFindProduct() {
List<Product> products = Arrays.asList(
new Product("Test Product 1", 99.99),
new Product("Test Product 2", 199.99),
new Product("Test Product 3", 299.99)
);
List<IndexQuery> queries = products.stream()
.map(product -> new IndexQueryBuilder()
.withObject(product)
.withIndex(INDEX_NAME)
.build())
.collect(Collectors.toList());
List<IndexedObjectInformation> indexedInfos = elasticsearchOperations.bulkIndex(
queries,
IndexCoordinates.of(INDEX_NAME)
);
// 验证结果
List<String> ids = indexedInfos.stream()
.map(IndexedObjectInformation::getId)
.collect(Collectors.toList());
assertFalse(ids.isEmpty());
assertEquals(products.size(), ids.size());
}
}
结论
本指南展示了 Easysearch 与 Elasticsearch 的高度兼容性:
- 配置方式相同,仅需启用 Easysearch 的 API 兼容模式。
- 可直接使用现有 Elasticsearch 客户端。
- Maven 依赖无需更改。
- API、注解和仓库接口完全兼容。
- 现有测试代码可直接应用。
这种兼容性使得从 Elasticsearch 迁移到 Easysearch 成为一个简单、低风险的过程。Spring Boot 项目可以几乎无缝地切换到 Easysearch,同时获得其性能和资源利用方面的优势。
关于 Easysearch
INFINI Easysearch 是一个分布式的搜索型数据库,实现非结构化数据检索、全文检索、向量检索、地理位置信息查询、组合索引查询、多语种支持、聚合分析等。Easysearch 可以完美替代 Elasticsearch,同时添加和完善多项企业级功能。Easysearch 助您拥有简洁、高效、易用的搜索体验。
官网文档:https://infinilabs.cn/docs/latest/easysearch
作者:张磊,极限科技(INFINI Labs)搜索引擎研发负责人,对 Elasticsearch 和 Lucene 源码比较熟悉,目前主要负责公司的 Easysearch 产品的研发以及客户服务工作。
原文:https://infinilabs.cn/blog/2024/use-spring-boot-for-easysearch-connection/
INFINI Labs 产品更新 | Console/Gateway/Agent 等产品开源发布首个版本
资讯动态 • INFINI Labs 小助手 发表了文章 • 1 个评论 • 3225 次浏览 • 2024-12-27 16:11
INFINI Labs 产品又更新啦~,包括 Easysearch v1.9.0、Gateway、Console、Agent、Loadgen v1.27.0。本次各产品更新了很多亮点功能,如 Easysearch 新增 rollup 功能,优化了多版本兼容配置;Console/Gateway/Agent/Loadgen 及 Framework 开源后,发布首个重大更新版本,支持过期元数据删除,指标图表懒加载,指标采集协程优化等等,欢迎大家下载体验。
INFINI Easysearch v1.9.0
INFINI Easysearch 是一个分布式的搜索型数据库,实现非结构化数据检索、全文检索、向量检索、地理位置信息查询、组合索引查询、多语种支持、聚合分析等。Easysearch 可以完美替代 Elasticsearch,同时添加和完善多项企业级功能。Easysearch 助您拥有简洁、高效、易用的搜索体验。详情见:https://infinilabs.cn
Easysearch 本次更新如下:
Improvements
-
发布 rollup 功能
- 支持自动对 rollup 索引进行滚动,无需外部触发
- 支持 avg sum max min value_count percentiles 指标类型的聚合
- 支持 terms 聚合
- 支持对指标聚合进行 Pipeline 聚合
- 支持聚合前先对数据进行过滤
- 进行聚合查询时支持直接搜索原始索引,不用更改搜索代码
- 增加适配 logstash 8.x 的请求 header
- _cat/templates 增加 lifecycle 和 rollover 列的展示
Bug fix
- 修复 rest-api template 测试错误
INFINI Console v1.27.0
INFINI Console 是一款非常轻量级的多集群、跨版本的搜索基础设施统一管控平台。通过对流行的搜索引擎基础设施进行跨版本、多集群的集中纳管, 企业可以快速方便的统一管理企业内部的不同版本的多套搜索集群。开源地址:https://github.com/infinilabs/console
Console 在线体验: http://demo.infini.cloud (用户名/密码:readonly/readonly)。
Console 本次更新如下:
Improvements
- 代码开源,统一采用 Github 仓库进行开发
- 指标采集优化,由原来的单一协程采集调整为每个注册的集群有单独的协程进行采集
- 指标监控页面图表展示采用懒加载、单个图表独立加载,增强用户体验
- 通用时间控件增加超时时间设置
- 集群选择控件增加注册、刷新功能
- 提供指标采集状态
- 表格控件排版优化
Bug fix
- 修复集群元数据更新不及时问题
- 修复帮助文档等链接不正确问题
- 修复节点、索引数据因随机 id 出现重复记录问题
- 修复 Runtime、Agent 实例编辑页面出错问题
- 修复集群、节点、索引、分片元数据无 Loading 问题
- 修复索引健康状态指标采集失败问题
- 修复个别菜单列未国际化问题
INFINI Gateway v1.27.0
INFINI Gateway 是一个面向搜索场景的高性能数据网关,所有请求都经过网关处理后再转发到后端的搜索业务集群。基于 INFINI Gateway 可以实现索引级别的限速限流、常见查询的缓存加速、查询请求的审计、查询结果的动态修改等等。开源地址:https://github.com/infinilabs/gateway
Gateway 本次更新如下:
Improvements
- 调整队列消费者 slice 默认配置为 1
Bug fix
- 修复缓存数据丢失导致队列无法消费问题
- 同步更新 Framework 修复的一些已知问题
INFINI Agent v1.27.0
INFINI Agent 是 INFINI Console 的一个可选探针组件,负责采集和上传集群指标和日志等信息,并可通过 Console 管理。Agent 支持主流操作系统和平台,安装包轻量且无任何外部依赖,可以快速方便地安装。开源地址:https://github.com/infinilabs/agent
探针 Agent 本次更新如下:
Improvements
- 与 INFINI Console 统一版本号
- 同步更新 Framework 修复的已知问题
- 支持 K8S 环境指标采集
INFINI Loadgen v1.27.0
INFINI Loadgen 是一款轻量、无依赖的 Eaysearch/Elasticsearch/OpenSearch 性能压测工具,支持参数模板化配置,支持压测端均衡流量控制,可以模拟高并发请求。开源地址:https://github.com/infinilabs/loadgen
Loadgen 本次更新如下:
Improvements
- 保持与 Console 相同版本
- 同步更新 Framework 修复的已知问题
Bug fix
- 修复 API 接口测试逻辑异常问题
INFINI Framework
INFINI Framework 是 INFINI Labs 各产品依赖的核心公共代码库。开源地址:https://github.com/infinilabs/framework
Improvements
期待反馈
欢迎下载体验使用,如果您在使用过程中遇到如何疑问或者问题,欢迎前往 INFINI Labs Github(https://github.com/infinilabs) 中的对应项目中提交 Feature Request 或提交 Bug。
下载地址: https://infinilabs.cn/download
邮件:hello@infini.ltd
电话:(+86) 400-139-9200
Discord:https://discord.gg/4tKTMkkvVX
也欢迎大家微信扫码添加小助手(INFINI-Labs),加入用户群一起讨论交流。
关于极限科技(INFINI Labs)
极限科技,全称极限数据(北京)科技有限公司,是一家专注于实时搜索与数据分析的软件公司。旗下品牌极限实验室(INFINI Labs)致力于打造极致易用的数据探索与分析体验。
极限科技是一支年轻的团队,采用天然分布式的方式来进行远程协作,员工分布在全球各地,希望通过努力成为中国乃至全球企业大数据实时搜索分析产品的首选,为中国技术品牌输出添砖加瓦。
Easysearch Java SDK 2.0.x 使用指南(一)
Easysearch • INFINI Labs 小助手 发表了文章 • 0 个评论 • 2425 次浏览 • 2024-12-14 17:50
各位 Easysearch 的小伙伴们,我们前一阵刚把 easysearch-client 更新到了 2.0.2 版本!借此详细介绍下新版客户端的使用。
新版客户端和 1.0 版本相比,完全重构,抛弃了旧版客户端的一些历史包袱,从里到外都焕然一新!不管是刚入门的小白还是经验丰富的老司机,2.0.x 客户端都能让你开发效率蹭蹭往上涨!
到底有啥新东西?
- 更轻更快: 以前的版本依赖了一堆乱七八糟的东西,现在好了,我们把那些没用的都砍掉了,客户端变得更苗条,性能也杠杠的!
- 类型安全,告别迷糊: 常用的 Easysearch API 现在都配上了强类型的请求和响应对象,再也不用担心写错参数类型了,代码也更好看了,维护起来也更省心!
- 同步异步,想咋用咋用: 所有 API 都支持同步和异步两种调用方式,不管是啥场景,都能轻松应对!
- 构建查询,跟搭积木一样简单: 我们用了流式构建器和函数式编程,构建复杂查询的时候,代码写起来那叫一个流畅,看着也舒服!
- 和 Jackson 无缝对接: 可以轻松地把你的 Java 类和客户端 API 关联起来,数据转换嗖嗖的快!
快速上手
废话不多说,咱们直接上干货!这部分教你怎么快速安装和使用 easysearch-client 2.0.2 客户端,还会演示一些基本操作。
安装
easysearch-client 2.0.2 已经上传到 Maven 中央仓库了,加到你的项目里超级方便。
最低要求: JDK 8 或者更高版本
依赖管理: 客户端内部用 Jackson 来处理对象映射。
Maven 项目
在你的 pom.xml
文件的 <dependencies>
里面加上这段:
<dependencies>
<dependency>
<groupId>com.infinilabs</groupId>
<artifactId>easysearch-client</artifactId>
<version>2.0.2</version>
</dependency>
</dependencies>
Gradle 项目
在你的 build.gradle
文件的 dependencies
里面加上这段:
dependencies {
implementation 'com.infinilabs:easysearch-client:2.0.2'
}
初始化客户端
下面这段代码演示了怎么初始化一个启用了安全通信加密和 security 的 Easysearch 客户端,看起来有点长,别慌,我们一步一步解释!
public static EasysearchClient create() throws NoSuchAlgorithmException, KeyStoreException,
KeyManagementException {
final HttpHost[] hosts = new HttpHost[]{new HttpHost("localhost", 9200, "https")};
final SSLContext sslContext = SSLContextBuilder.create()
.loadTrustMaterial(null, (chains, authType) -> true).build();
SSLIOSessionStrategy sessionStrategy = new SSLIOSessionStrategy(sslContext, NoopHostnameVerifier.INSTANCE);
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("username", "passwowd"));
RestClient restClient = RestClient.builder(hosts)
.setHttpClientConfigCallback(httpClientBuilder ->
httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider)
.setSSLStrategy(sessionStrategy)
.disableAuthCaching()
).setRequestConfigCallback(requestConfigCallback ->
requestConfigCallback.setConnectTimeout(30000).setSocketTimeout(300000))
.build();
EasysearchTransport transport = new RestClientTransport(
restClient, new JacksonJsonpMapper());
return new EasysearchClient(transport);
}
这段代码,简单来说,就是:
- 连上 Easysearch: 我们要用 HTTPS 连接到本地的 9200 端口。
- 搞定证书: 这里为了方便,我们信任了所有证书(注意!生产环境一定要配置好你们自己的证书)。
- 填上用户名密码: 这里需要填上你的用户名和密码。
- 设置连接参数: 设置了连接超时时间(30 秒)和读取超时时间(300 秒)。
- 创建客户端: 最后,我们就创建好了一个
EasysearchClient
实例,可以开始干活了!
举个栗子:批量操作
下面的例子演示了怎么用 bulk
API 来批量索引数据:
public static void bulk() throws Exception {
String json2 = "{"
+ " \"@timestamp\": \"2023-01-08T22:50:13.059Z\","
+ " \"agent\": {"
+ " \"version\": \"7.3.2\","
+ " \"type\": \"filebeat\","
+ " \"ephemeral_id\": \"3ff1f2c8-1f7f-48c2-b560-4272591b8578\","
+ " \"hostname\": \"ba-0226-msa-fbl-747db69c8d-ngff6\""
+ " }"
+ "}";
EasysearchClient client = create();
BulkRequest.Builder br = new BulkRequest.Builder();
br.index("test1");
for (int i = 0; i < 10; i++) {
BulkOperation.Builder builder = new BulkOperation.Builder();
IndexOperation.Builder indexBuilder = new IndexOperation.Builder();
builder.index(indexBuilder.document(JsonData.fromJson(json2)).build());
br.operations(builder.build());
}
for (int i = 0; i < 10; i++) {
BulkOperation.Builder builder = new BulkOperation.Builder();
IndexOperation.Builder indexBuilder = new IndexOperation.Builder();
indexBuilder.document(JsonData.fromJson(json2)).index("test2");
builder.index(indexBuilder.build());
br.operations(builder.build());
}
for (int i = 0; i < 10; i++) {
Map<String, Object> map = new HashMap<>();
map.put("@timestamp", "2023-01-08T22:50:13.059Z");
map.put("field1", "value1");
IndexOperation.Builder indexBuilder = new IndexOperation.Builder();
indexBuilder.document(map).index("test3");
br.operations(new BulkOperation(indexBuilder.build()));
}
BulkResponse bulkResponse = client.bulk(br.build());
if (bulkResponse.errors()) {
for (BulkResponseItem item : bulkResponse.items()) {
System.out.println(item.toString());
}
}
client._transport().close();
}
这个例子里,我们一口气把数据批量索引到了 test1
、test2
和 test3
这三个索引里,
并且展示了三种在 bulk API 中构建 IndexOperation 的方式,虽然它们最终都能实现将文档索引到 Easysearch,但在使用场景和灵活性上还是有一些区别的:
这段代码的核心是利用 BulkRequest.Builder 来构建一个批量请求,并通过 br.operations(...) 方法添加多个操作。而每个操作,在这个例子里,都是一个 IndexOperation,也就是索引一个文档。IndexOperation 可以通过 IndexOperation.Builder 来创建。
三种方式的区别主要体现在如何构建 IndexOperation 里的 document 部分,也就是要索引的文档内容。
第一种方式:使用 JsonData.fromJson(json2) 且不指定索引。
特点:
使用 JsonData.fromJson(json2) 将一个 JSON 字符串直接转换成 JsonData 对象作为文档内容。
这里没有在 IndexOperation.Builder 上调用 index() 方法来指定索引名称。由于没有在每个 IndexOperation 中指定索引,这个索引名称将回退到 BulkRequest.Builder 上设置的索引,即 br.index("test1"),所以这 10 个文档都会被索引到 test1。
当你需要将一批相同结构的 JSON 文档索引到同一个索引时,这种方式比较简洁。
第二种方式:使用 JsonData.fromJson(json2) 并指定索引
特点:
同样使用 JsonData.fromJson(json2) 将 JSON 字符串转换成 JsonData 对象。
关键区别在于,这里在 IndexOperation.Builder 上调用了 index("test2"),为每个操作单独指定了索引名称。
这 10 个文档会被索引到 test2,即使 BulkRequest.Builder 上设置了 index("test1") 也没用,因为 IndexOperation 里的设置优先级更高。
当你需要将一批相同结构的 JSON 文档索引到不同的索引时,就需要使用这种方式来分别指定索引。
第三种方式:使用 Map<String, Object> 并指定索引
特点:
使用 Map<String, Object> 来构建文档内容,这种方式更加灵活,可以构建任意结构的文档。
同样在 IndexOperation.Builder 上调用了 index("test3") 指定了索引名称。
使用 new BulkOperation(indexBuilder.build()) 代替之前的 builder.index(indexBuilder.build()), 这是等价的。
这 10 个文档会被索引到 test3。
当你需要索引的文档结构不固定,或者你需要动态构建文档内容时,使用 Map 是最佳选择。例如,你可以根据不同的业务逻辑,往 Map 里添加不同的字段。
总结
这次 easysearch-client 2.0.x Java 客户端的更新真的很给力,强烈建议大家升级体验!相信我,用了新版客户端,你的开发效率绝对会提升一大截!
想要了解更多?
-
客户端 Maven 地址: https://mvnrepository.com/artifact/com.infinilabs/easysearch-client/2.0.2
- 更详细的文档和示例代码在 官网 持续更新中,请随时关注!
大家有啥问题或者建议,也欢迎随时反馈!
作者:张磊,极限科技(INFINI Labs)搜索引擎研发负责人,对 Elasticsearch 和 Lucene 源码比较熟悉,目前主要负责公司的 Easysearch 产品的研发以及客户服务工作。
极限科技(INFINI Labs)招聘:搜索运维工程师(Elasticsearch/Easysearch)【北京/全职】
求职招聘 • INFINI Labs 小助手 发表了文章 • 0 个评论 • 6128 次浏览 • 2024-09-28 11:00
我们是国内搜索型数据库产品厂商第一梯队的杰出代表,随着业务的快速发展,现开放岗位:搜索运维工程师( Elasticsearch/Easysearch ),如果有兴趣,请直接拉到文末,扫描二维码或将简历投递至 hello@infini.ltd。
如果您还不了解 极限科技(INFINI Labs)是谁,在做什么,需要什么样的小伙伴,那么请看下文:
我们是谁
极限科技,全称极限数据(北京)科技有限公司,是一家专注于实时搜索与数据分析的软件公司。旗下品牌极限实验室(INFINI Labs)致力于打造极致易用的数据探索与分析体验。
极限科技是一支年轻的团队,采用天然分布式的方式来进行远程协作,员工分布在全球各地,希望通过努力成为中国乃至全球企业大数据实时搜索分析产品的首选,为中国技术品牌输出添砖加瓦。
我们在做什么
极限科技(INFINI Labs)正在致力于以下几个核心方向:
1、开发近实时搜索引擎 INFINI Easysearch
INFINI Easysearch 是一个分布式的搜索型数据库,实现非结构化数据检索、全文检索、向量检索、地理位置信息查询、组合索引查询、多语种支持、聚合分析等。Easysearch 可以完美替代 Elasticsearch,同时添加和完善多项企业级功能。Easysearch 助您拥有简洁、高效、易用的搜索体验。详情参见:https://infinilabs.cn
2、打造下一代实时搜索引擎 INFINI Pizza
INFINI Pizza 是一个分布式混合搜索数据库系统。我们的使命是充分利用现代硬件和人工智能的潜力,为企业提供量身定制的实时智能搜索体验。我们致力于满足具有挑战性的环境中高并发和高吞吐量的需求,同时提供无缝高效的搜索功能。详情参见:https://pizza.rs
3、积极参与全球开源生态建设
通过开源项目和社区贡献,推动全球开源技术的发展,提升中国在全球开源领域的影响力。
4、提供专业服务
为客户提供包括搜索技术支持、迁移服务、定制解决方案和培训在内的全方位服务。
5、提供国产化搜索解决方案
针对中国市场的特殊需求,提供符合国产化标准的搜索产品和解决方案,帮助客户解决使用 Elasticsearch 时遇到的挑战。
极限科技(INFINI Labs)通过这些努力,旨在成为全球领先的实时搜索和数据分析解决方案提供商。
我们期待有才华、有激情的你加入我们,一起探索数据搜索的未来,共同创造无限可能!
在招岗位介绍
岗位名称
搜索运维工程师(Elasticsearch/Easysearch)
岗位职责
- 负责客户现场的 Elasticsearch/Easysearch/OpenSearch 搜索引擎集群的日常维护、监控和优化,确保集群的高可用性和性能稳定;
- 协助客户进行搜索引擎集群的部署、配置及版本升级;
- 排查和解决 Elasticsearch/Easysearch/OpenSearch 集群中的各种技术问题,及时响应并处理集群异常;
- 根据业务需求设计和实施搜索索引的调优、数据迁移和扩展方案;
- 负责与客户沟通,提供技术支持及相关培训,确保客户需求得到有效满足;
- 制定并实施搜索引擎的备份、恢复和安全策略,保障数据安全;
- 与内部研发团队和外部客户进行协作,推动集群性能改进和功能优化。
岗位要求
- 全日制本科及以上学历,5 年以上运维工作经验;
- 拥有 Elasticsearch/Easysearch/OpenSearch 使用经验,熟悉搜索引擎的原理、架构和相关生态工具(如 Logstash、Kibana 等);
- 熟悉 Linux 操作系统的使用及常见性能调优方法;
- 熟练掌握 Shell 或 Python 等至少一种脚本语言,能够编写自动化运维脚本;
- 具有优秀的问题分析与解决能力,能够快速应对突发情况;
- 具备良好的沟通能力和团队合作精神,能够接受 客户驻场工作;
- 全职,北京地区,需具备在北京长期工作的条件;
优先考虑
- 计算机科学、信息技术或相关专业;
- 具备丰富的大规模分布式系统运维经验;
- 熟悉 Elasticsearch/Easysearch/OpenSearch 分片、路由、查询优化等高级功能;
- 拥有 Elastic Certified Engineer 认证;
- 具备大规模搜索引擎集群设计、扩展和调优经验;
- 熟悉其他搜索引擎技术(如 Solr、Lucene)者优先 ;
- 熟悉大数据处理相关技术(比如: Kafka 、Flink 等)者优先。
福利待遇
- 月薪: 15K - 25K,具体根据能力而定,试用期为 3-6 个月;
- 福利:五险一金/双休/国内法定假日/带薪年假等;
简历投递
简历投递:hello@infini.ltd(邮件标题请备注姓名+求职岗位+来自搜索客社区)
微信联系:INFINI-Labs(加微请备注求职岗位+来自搜索客社区)
欢迎有兴趣的小伙伴联系或推荐,期待您的加入!
【第3期】INFINI Easysearch 免费认证培训开放报名
Easysearch • INFINI Labs 小助手 发表了文章 • 0 个评论 • 5796 次浏览 • 2024-09-13 17:43
探索 Easysearch 的无限可能,与 INFINI Labs 共赴搜索技术前沿!
随着数字化转型的加速,搜索技术已成为企业数据洞察的核心。INFINI Labs 作为搜索创新技术的引领者,诚邀所有对 Easysearch 搜索引擎感兴趣的开发者、技术爱好者及合作伙伴,参加我们即将于 2024 年 10 月 19 日至 20 日举办的第 3 期 Easysearch 线上免费培训活动。这不仅是一场知识的盛宴,更是技能提升的加速器,将助您在职业道路上迈出坚实的一步!
活动亮点
- 系统课程,全面深入:从 Easysearch 的基本概念到环境搭建,再到高级功能的实战应用,INFINI Labs 的技术专家将为您带来全面而深入的讲解,确保每位参与者都能收获满满。
- 实战导向,解决痛点:课程设计紧贴实际需求,旨在帮助学员掌握 Easysearch 的核心技术,有效解决工作中的搜索需求和技术难题,让理论知识迅速转化为实践能力。
- 认证证书,助力进阶:后期 INFINI Labs 将推出 Easysearch 认证考试。通过考试的学员将获得官方认证的 Easysearch 证书,为您的职业发展增添强力背书,开启职业生涯的新篇章。
培训时间
2024 年 10 月 19 日至 20 日(周六、周日)共两天,每天具体培训时间:
- 上午 09:30 ~ 11:30
- 下午 14:00 ~ 16:00
培训内容概览
第一阶段:初识 Easysearch
- Easysearch 环境搭建与对比,了解其与 Elasticsearch 的差异;
- 功能初探:身份验证、数据脱敏、权限控制等,全面掌握 Easysearch 的基础功能;
- 容灾技术:兼容性验证、跨集群复制等,确保您的搜索服务稳定可靠;
第二阶段:Easysearch 高阶使用
- 深度探析:性能压测、数据迁移、请求管理等,提升 Easysearch 的使用效率;
- 高级功能:快照管理、可视化看板、告警功能等,让您的搜索服务更加智能;
- 生态集成:Filebeat、Logstash、LangChain 等,轻松实现 Easysearch 与其他工具的集成;
参与方式
本次活动完全免费,名额有限,请尽快报名,同时微信扫码添加小助手进群(培训会议地址将在微信群公布),锁定您的学习席位!
扫码或点击 我要报名
👉 立即行动:不要错过这次提升自我、与行业精英共成长的宝贵机会。让我们相聚云端,共同探索 Easysearch 的无限可能,开启技术进阶的新篇章!
参会提示
- 培训内容涉及动手实践,请务必自备电脑(Windows 系统环境请提前安装好 Linux 虚拟机);
- 请提前在 INFINI Labs 官网下载对应平台最新安装包(INFINI Easysearch、INFINI Gateway、INFINI Console);
- 下载地址:https://infinilabs.cn/download
联系我们
如有任何疑问,欢迎通过微信添加 [小助手:INFINI-Labs] 与我们联系。
INFINI Labs 期待与您相约,共赴这场技术盛宴!
关于 Easysearch
Easysearch 是一个分布式的近实时搜索与分析引擎,基于开源的 Apache Lucene 构建。它旨在提供一个自主可控、轻量级的 Elasticsearch 可替代版本,并不断完善和支持更多的企业级功能。与 Elasticsearch 相比,Easysearch 更注重搜索业务场景的优化,同时保持其产品的简洁与易用性。
详情参见:Easysearch 介绍
关于极限科技(INFINI Labs)
极限科技,全称极限数据(北京)科技有限公司,是一家专注于实时搜索与数据分析的软件公司。旗下品牌极限实验室(INFINI Labs)致力于打造极致易用的数据探索与分析体验。
极限科技是一支年轻的团队,采用天然分布式的方式来进行远程协作,员工分布在全球各地,希望通过努力成为中国乃至全球企业大数据实时搜索分析产品的首选,为中国技术品牌输出添砖加瓦。
如何用 Scrapy 爬取网站数据并在 Easysearch 中进行存储检索分析
Easysearch • INFINI Labs 小助手 发表了文章 • 0 个评论 • 5488 次浏览 • 2024-09-13 12:28
做过数据分析和爬虫程序的小伙伴想必对 Scrapy 这个爬虫框架已经很熟悉了。今天给大家介绍下,如何基于 Scrapy 快速编写一个爬虫程序并利用 Easysearch 储存、检索、分析爬取的数据。我们以极限科技的官网 Blog 为数据源(https://infinilabs.cn/blog) ,做下实操演示。
1、安装 scrapy
使用 Scrapy 可以快速构建一个爬虫项目,从目标网站中获取所需的数据,并进行后续的处理和分析。
pip install scrapy
# 新建项目 infini_spiders
scrapy startproject infini_spiders
# 初始化爬虫
cd infini_spiders/spiders
scrapy genspider blog infinilabs.cn
2、爬虫编写
编写一个爬虫文件 blog.py ,它会首先访问 start_urls 指定的地址,将结果发给 parse 函数解析。通过这一步解析,我们得到了每一篇博客的地址。然后我们对每个博客的地址发送请求,将结果发给 parse_blog 函数进行解析,在这里才会真正提取每篇博客的 title、tag、url、date、content 内容。
from typing import Any, Iterable
import scrapy
from bs4 import BeautifulSoup
from scrapy.http import Response
class BlogSpider(scrapy.Spider):
name = "blog"
allowed_domains = ["infinilabs.cn"]
start_urls = ["https://infinilabs.cn/blog/"]
def parse(self, response):
links = response.css("div.blogs a")
yield from response.follow_all(links, self.parse_blog)
def parse_blog(self, response):
title = response.xpath('//div[@class="title"]/text()').extract_first()
tags = response.xpath('//div[@class="tags"]/div[@class="tag"]/text()').extract()
url = response.url
author = response.xpath('//div[@class="logo"]/div[@class="name"]//text()').extract_first()
date = response.xpath('//div[@class="date"]/text()').extract_first()
all_text = response.xpath('//p//text() | //h3/text() | //h2/text() | //h4/text() | //ol/li//text()').extract()
content = '\n'.join(all_text)
yield {
'title': title,
'tags': tags,
'url': url,
'author': author,
'date': date,
'content': content
}
提取完我们想要的内容后,接下来就要考虑存储了。考虑到要对内容进行检索、分析,接下来我们将内容直接存放到 Easysearch 当中。
3、安装插件
通过安装 ScrapyElasticsearch pipeline 可将 scrapy 爬取的内容存入到 Easysearch 中。
pip install ScrapyElasticSearch
修改 scrapy 自带的配置文件 settings.py ,添加以下内容。
ITEM_PIPELINES = {
'scrapyelasticsearch.scrapyelasticsearch.ElasticSearchPipeline': 10
}
ELASTICSEARCH_SERVERS = ['http://192.168.56.3:9210']
ELASTICSEARCH_INDEX = 'scrapy'
ELASTICSEARCH_INDEX_DATE_FORMAT = '%Y-%m-%d'
ELASTICSEARCH_TYPE = '_doc'
ELASTICSEARCH_USERNAME = 'admin'
ELASTICSEARCH_PASSWORD = '9423d1d5345ed6d0db19'
ScrapyElasticSearch 会以 bulk 方式写入 Easysearch,每次批量的大小由 scrapyelasticsearch.scrapyelasticsearch.ElasticSearchPipeline 参数控制,大家可自行修改。
在上述配置中,我们会将爬到的数据存放到 scrapy-yyyy-mm-dd 索引中。
4、启动爬虫
在 infini_spiders/spiders 目录下,使用命令启动爬虫。
scrapy crawl blog
blog 就是爬虫的名字,对应到 blog.py 里面的 name 变量。运行完成后,就可以去 Easysearch 里查看数据了,当然我们还是使用 Console 进行查看。
5、查看数据
先查看下索引情况,scrapy 索引已经生成,里面有 129 篇博客。
查看详细内容,确保博客正文已经保存。
到了这一步,我们就能使用 Console 对博客进行搜索、分析了。
6、结语
这次的分享就到这里了。欢迎与我一起交流 ES 的各种问题和解决方案。
关于 Easysearch
INFINI Easysearch 是一个分布式的近实时搜索与分析引擎,核心引擎基于开源的 Apache Lucene。Easysearch 的目标是提供一个轻量级的 Elasticsearch 可替代版本,并继续完善和支持更多的企业级功能。 与 Elasticsearch 相比,Easysearch 更关注在搜索业务场景的优化和继续保持其产品的简洁与易用性。
官网文档:https://infinilabs.cn/docs/latest/easysearch
Easysearch 性能测试方法概要
Easysearch • INFINI Labs 小助手 发表了文章 • 0 个评论 • 3107 次浏览 • 2024-08-23 14:47
INFINI Easysearch
INFINI Easysearch 是一个分布式的近实时搜索与分析引擎,核心引擎基于开源的 Apache Lucene。Easysearch 衍生自基于开源协议 Apache 2.0 的 Elasticsearch 7.10 版本,完善和支持更多的企业级功能,优化搜索业务场景,以保证更佳的数据探索与分析体验。
Easysearch 的主要特点:
- 兼容 Elasticsearch,业务代码无需改动;可平滑迁移
- 企业级安全;更稳定可靠
- 企业级管理后台(多集群统一管理,实现运营标准化、自动化)
- 信创适配(全面适配国产 CPU/OS/服务器,支持国密算法)
Easysearch 快速体验,请参阅:
Loadgen
Loadgen 是 Elasticsearch 专属压测工具,用来对 Easysearch 或者网关进行压力测试。
Loadgen 的特点:
- 性能强劲
- 轻量级无依赖
- 支持模板化参数随机
- 支持高并发
- 支持压测端均衡流量控制
- 支持服务端返回值校验
当前最新版本为 1.26.1-598,下载链接如下:
https://release.infinilabs.com/loadgen/stable/
下载并解压安装包后,得到二进制文件。
查看版本信息。
$ ./loadgen-linux-amd64 -v
__ ___ _ ___ ___ __ __
/ / /___\/_\ / \/ _ \ /__\/\ \ \
/ / // ///_\\ / /\ / /_\//_\ / \/ /
/ /__/ \_// _ \/ /_// /_\\//__/ /\ /
\____|___/\_/ \_/___,'\____/\__/\_\ \/
[LOADGEN] A http load generator and testing suite.
[LOADGEN] 1.26.1#598, 2024-08-14 04:50:03, 2024-12-31 10:10:10, 00f15fd86834d7ea539f6d66ee608e3915eef0e3
loadgen 1.26.1 598 2024-08-14 04:50:03 +0000 UTC 2024-12-31 10:10:10 +0000 UTC 00f15fd86834d7ea539f6d66ee608e3915eef0e3
Loadgen 测试
Loadgen 使用非常简单,下面演示如何进行查询压测。
- 建立索引,根据节点数调节分片数。
curl -X PUT -H "Content-Type: application/json" \
-ku admin:xxx "https://localhost:9200/loadtest" -d'
{
"settings":{
"number_of_shards":"3",
"number_of_replicas":1,
"translog":{
"durability":"async"
}
}
}'
{"acknowledged":true,"shards_acknowledged":true,"index":"loadtest"}
- 创建
loadgen.dsl.shawnyan
配置文件,定义查询
GET loadtest/_search
{"query": {"term": {"id.keyword": {"value": $[[id]]}}}}
- 执行压测,
-d
表示秒数,-c
表示并发数。
$ ES_ENDPOINT=https://localhost:9200 ES_USERNAME=admin ES_PASSWORD=xxx ./loadgen-linux-amd64 -run loadgen.dsl.shawnyan -d 10 -c 2
__ ___ _ ___ ___ __ __
/ / /___\/_\ / \/ _ \ /__\/\ \ \
/ / // ///_\\ / /\ / /_\//_\ / \/ /
/ /__/ \_// _ \/ /_// /_\\//__/ /\ /
\____|___/\_/ \_/___,'\____/\__/\_\ \/
[LOADGEN] A http load generator and testing suite.
[LOADGEN] 1.26.1#598, 2024-08-14 04:50:03, 2024-12-31 10:10:10, 00f15fd86834d7ea539f6d66ee608e3915eef0e3
[08-19 16:43:27] [INF] [env.go:179] configuration auto reload enabled
[08-19 16:43:27] [INF] [app.go:285] initializing loadgen, pid: 30792
[08-19 16:43:27] [INF] [app.go:286] using config: /data/es/loadgen.yml
[08-19 16:43:27] [INF] [module.go:155] started plugin: statsd
[08-19 16:43:27] [INF] [module.go:161] all modules are started
[08-19 16:43:27] [INF] [instance.go:78] workspace: /data/es/data/loadgen/nodes/cr1gabqr90cng685o2s0
[08-19 16:43:27] [INF] [app.go:511] loadgen is up and running now.
[08-19 16:43:27] [INF] [main.go:403] loading config: /data/es/loadgen.dsl.shawnyan
21108 requests finished in 9.79061677s, 1.08MB sent, 3.22MB received
[Loadgen Client Metrics]
Requests/sec: 2110.63
Request Traffic/sec: 110.22KB
Total Transfer/sec: 440.00KB
Fastest Request: 680.198µs
Slowest Request: 12.409574ms
Status 200: 21108
[Latency Metrics]
10000 samples of 21108 events
Cumulative: 8.732205871s
HMean: 851.869µs
Avg.: 873.22µs
p50: 839.498µs
p75: 914.298µs
p95: 1.059197ms
p99: 1.327098ms
p999: 4.83579ms
Long 5%: 1.394411ms
Short 5%: 724.226µs
Max: 11.618475ms
Min: 680.198µs
Range: 10.938277ms
StdDev: 289.216µs
Rate/sec.: 2110.63
[Latency Distribution]
680µs - 1.774ms ------------------------------
1.774ms - 2.867ms -
2.867ms - 3.961ms -
3.961ms - 5.055ms -
5.055ms - 6.149ms -
6.149ms - 7.243ms -
7.243ms - 8.336ms -
8.336ms - 9.43ms -
9.43ms - 10.524ms -
10.524ms - 11.618ms -
[Estimated Server Metrics]
Requests/sec: 2155.94
Avg Req Time: 927.668µs
Transfer/sec: 449.45KB
更多内容请参阅文档:
https://infinilabs.cn/docs/latest/gateway/getting-started/benchmark/
Rally
如果对 Elasticsearch 熟悉的同学,也可尝试使用 Rally 对 Easysearch 进行测试。
Rally 是 Elasticsearch 的基准测试框架。它可以帮助您完成以下任务:
- 安装 Elasticsearch 集群以进行基准测试
- 跨 Elasticsearch 版本管理基准数据和规范
- 运行基准测试并记录结果
- 通过连接遥测设备来查找性能问题
- 比较性能结果
安装 Rally。
[root@easysearch /]# pip3 install esrally
Requirement already satisfied: esrally in /usr/local/lib/python3.9/site-packages (2.11.0)
Requirement already satisfied: py-cpuinfo==7.0.0 in /usr/local/lib/python3.9/site-packages (from esrally) (7.0.0)
Requirement already satisfied: elastic-transport==8.4.1 in /usr/local/lib/python3.9/site-packages (from esrally) (8.4.1)
Requirement already satisfied: google-resumable-media[requests]==1.1.0 in /usr/local/lib/python3.9/site-packages (from esrally) (1.1.0)
Requirement already satisfied: urllib3==1.26.18 in /usr/local/lib/python3.9/site-packages (from esrally) (1.26.18)
Requirement already satisfied: google-auth==1.22.1 in /usr/local/lib/python3.9/site-packages (from esrally) (1.22.1)
Requirement already satisfied: thespian==3.10.1 in /usr/local/lib/python3.9/site-packages (from esrally) (3.10.1)
Requirement already satisfied: jsonschema==3.1.1 in /usr/local/lib/python3.9/site-packages (from esrally) (3.1.1)
Requirement already satisfied: markupsafe==2.0.1 in /usr/local/lib64/python3.9/site-packages (from esrally) (2.0.1)
Requirement already satisfied: yappi==1.5.1 in /usr/local/lib64/python3.9/site-packages (from esrally) (1.5.1)
Requirement already satisfied: psutil==5.9.4 in /usr/local/lib64/python3.9/site-packages (from esrally) (5.9.4)
Requirement already satisfied: certifi in /usr/local/lib/python3.9/site-packages (from esrally) (2024.7.4)
Requirement already satisfied: elasticsearch[async]==8.6.1 in /usr/local/lib/python3.9/site-packages (from esrally) (8.6.1)
Requirement already satisfied: ijson==2.6.1 in /usr/local/lib/python3.9/site-packages (from esrally) (2.6.1)
Requirement already satisfied: jinja2==3.1.4 in /usr/local/lib/python3.9/site-packages (from esrally) (3.1.4)
Requirement already satisfied: requests<2.32.0 in /usr/local/lib/python3.9/site-packages (from esrally) (2.31.0)
Requirement already satisfied: tabulate==0.8.9 in /usr/local/lib/python3.9/site-packages (from esrally) (0.8.9)
Requirement already satisfied: zstandard==0.21.0 in /usr/local/lib64/python3.9/site-packages (from esrally) (0.21.0)
Requirement already satisfied: docker==6.0.0 in /usr/local/lib/python3.9/site-packages (from esrally) (6.0.0)
Requirement already satisfied: websocket-client>=0.32.0 in /usr/local/lib/python3.9/site-packages (from docker==6.0.0->esrally) (1.8.0)
Requirement already satisfied: packaging>=14.0 in /usr/lib/python3.9/site-packages (from docker==6.0.0->esrally) (20.9)
Requirement already satisfied: aiohttp<4,>=3 in /usr/local/lib64/python3.9/site-packages (from elasticsearch[async]==8.6.1->esrally) (3.10.4)
Requirement already satisfied: pyasn1-modules>=0.2.1 in /usr/local/lib/python3.9/site-packages (from google-auth==1.22.1->esrally) (0.4.0)
Requirement already satisfied: six>=1.9.0 in /usr/lib/python3.9/site-packages (from google-auth==1.22.1->esrally) (1.15.0)
Requirement already satisfied: rsa<5,>=3.1.4 in /usr/local/lib/python3.9/site-packages (from google-auth==1.22.1->esrally) (4.9)
Requirement already satisfied: setuptools>=40.3.0 in /usr/lib/python3.9/site-packages (from google-auth==1.22.1->esrally) (53.0.0)
Requirement already satisfied: cachetools<5.0,>=2.0.0 in /usr/local/lib/python3.9/site-packages (from google-auth==1.22.1->esrally) (4.2.4)
Requirement already satisfied: google-crc32c<2.0dev,>=1.0 in /usr/local/lib64/python3.9/site-packages (from google-resumable-media[requests]==1.1.0->esrally) (1.5.0)
Requirement already satisfied: attrs>=17.4.0 in /usr/local/lib/python3.9/site-packages (from jsonschema==3.1.1->esrally) (24.2.0)
Requirement already satisfied: importlib-metadata in /usr/local/lib/python3.9/site-packages (from jsonschema==3.1.1->esrally) (8.2.0)
Requirement already satisfied: pyrsistent>=0.14.0 in /usr/local/lib64/python3.9/site-packages (from jsonschema==3.1.1->esrally) (0.20.0)
Requirement already satisfied: yarl<2.0,>=1.0 in /usr/local/lib64/python3.9/site-packages (from aiohttp<4,>=3->elasticsearch[async]==8.6.1->esrally) (1.9.4)
Requirement already satisfied: frozenlist>=1.1.1 in /usr/local/lib64/python3.9/site-packages (from aiohttp<4,>=3->elasticsearch[async]==8.6.1->esrally) (1.4.1)
Requirement already satisfied: aiosignal>=1.1.2 in /usr/local/lib/python3.9/site-packages (from aiohttp<4,>=3->elasticsearch[async]==8.6.1->esrally) (1.3.1)
Requirement already satisfied: async-timeout<5.0,>=4.0 in /usr/local/lib/python3.9/site-packages (from aiohttp<4,>=3->elasticsearch[async]==8.6.1->esrally) (4.0.3)
Requirement already satisfied: aiohappyeyeballs>=2.3.0 in /usr/local/lib/python3.9/site-packages (from aiohttp<4,>=3->elasticsearch[async]==8.6.1->esrally) (2.3.7)
Requirement already satisfied: multidict<7.0,>=4.5 in /usr/local/lib64/python3.9/site-packages (from aiohttp<4,>=3->elasticsearch[async]==8.6.1->esrally) (6.0.5)
Requirement already satisfied: pyparsing>=2.0.2 in /usr/lib/python3.9/site-packages (from packaging>=14.0->docker==6.0.0->esrally) (2.4.7)
Requirement already satisfied: pyasn1<0.7.0,>=0.4.6 in /usr/local/lib/python3.9/site-packages (from pyasn1-modules>=0.2.1->google-auth==1.22.1->esrally) (0.6.0)
Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.9/site-packages (from requests<2.32.0->esrally) (3.7)
Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib64/python3.9/site-packages (from requests<2.32.0->esrally) (3.3.2)
Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.9/site-packages (from importlib-metadata->jsonschema==3.1.1->esrally) (3.20.0)
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
[root@easysearch /]# esrally --version
esrally 2.11.0
[root@easysearch /]#
关于 Rally 的更多内容,请参阅官方文档:
https://esrally.readthedocs.io/en/stable/
作者:少安事务所
原文:https://mp.weixin.qq.com/s/9eEH38kgsw4i150CJqyxvQ
Easysearch x 《黑神话悟空》有奖征文获奖结果公示
Easysearch • INFINI Labs 小助手 发表了文章 • 0 个评论 • 2804 次浏览 • 2024-08-20 13:34
随着《黑神话:悟空》游戏的正式发售,我们 INFINI Labs 组织的 Easysearch 有奖征文大赛也圆满落幕。本次征文活动自启动以来,收到了众多创作者的热情投稿。在此,我们衷心感谢每一位参与活动的作者,是你们的才华和热情让这次征文活动异彩纷呈。
经过专业评审团的认真评选,最终确定了以下获奖作品及作者,现予以公布:
奖项 | 作者 | 作品 | 奖品 |
---|---|---|---|
一等奖 | AWS 加油站 | 玩转 Easysearch 语法 | 《黑神话:悟空》数字豪华版一套 |
二等奖 | 杨帆 | 使用 Easysearch 打造企业内部知识问答系统 | 《黑神话:悟空》数字标准版一套 |
二等奖 | 李家兴 | 从 Elasticsearch 到 Easysearch:国产搜索型数据库的崛起与未来展望 | 《黑神话:悟空》数字标准版一套 |
三等奖 | 严少安 | Easysearch,地表最强,没有之一! | INFINI Labs 咖啡杯 / 指甲剪套装 |
三等奖 | 张磊 | Easysearch 新特性:写入限流功能介绍 | INFINI Labs 咖啡杯 / 指甲剪套装 |
三等奖 | keep | 如何在 MacOS 环境下快速安装部署 Easysearch | INFINI Labs 咖啡杯 / 指甲剪套装 |
恭喜以上获奖作者,你们的作品不仅展现了 Easysearch 的强大功能,也为社区成员提供了宝贵的学习资源。我们将会通过小助手微信联系各位获奖者,安排奖品的发放。
同时,我们也要感谢所有参与本次征文活动的作者,你们的每一篇 Easysearch 投稿都是对社区的一份贡献。我们期待在未来的活动中再次与大家相遇。
请继续关注 INFINI Labs,我们将持续为大家带来更多优质的产品和精彩的活动。再次感谢大家的参与和支持!
如有疑问或想加入 Easysearch 用户交流群请联系我们小助手!
附征文活动原文:
天命人, 你在吗?快拿走你的《黑神话:悟空》游戏,去开启神话冒险!
关于极限科技(INFINI Labs)
极限科技,全称极限数据(北京)科技有限公司,是一家专注于实时搜索与数据分析的软件公司。旗下品牌极限实验室(INFINI Labs)致力于打造极致易用的数据探索与分析体验。
极限科技是一支年轻的团队,采用天然分布式的方式来进行远程协作,员工分布在全球各地,希望通过努力成为中国乃至全球企业大数据实时搜索分析产品的首选,为中国技术品牌输出添砖加瓦。