当前位置: 首页 > news >正文

ElasticSearch第4篇(亿级中文数据量 ElasticSearch与Sphinx建索引速度、查询速度、并发性能、实测对比)

经过实测:1.09亿的数据量进行中文检索。ElasticSearch单机的检索性能在0.005~5.6秒之间,此检索速度可满足95%的业务场景(注意:每条ES文档平均65个汉字,数据源取自几千本小说,大部分文档在15~300个汉字之间,不然字数太多索引太大电脑存不下)。

前置文章

由于本文章的前置操作强依赖于另一篇文章,推荐阅读:
万字详解PHP+Sphinx中文亿级数据全文检索实战(实测亿级数据0.1秒搜索耗时)

运行配置

和Sphinx环境保持一致。
服务器配置:CentOS7.6 16核4G内存。固态硬盘。
ES配置:ElasticSearch 8.14.1单机,默认配置,使用IK分词器的ik_max_word配置。不设置分片和副本数量。

数据准备

和Sphinx用的数据源保持一致。
依旧是上次用的几千本小说,整合后的单个txt文件9.57个G,用\n间隔,作为一个ES文档。
数据量为109 450 000条数据。

数据插入

  • 创建索引与映射,并修改max_result_window参数
$params = ['index' => 'performance_test','body'  => ['settings' => ['analysis' => ['analyzer' => ['ik_analyzer' => ['type'      => 'ik_max_word',],],],],'mappings' => ['properties' => ['id' => ['type'     => 'integer',],'content' => ['type'     => 'text','analyzer' => 'ik_analyzer',],],],],
];$response = $client->indices()->create($params);
dd($response->asBool());$params = ['index' => 'performance_test','body'  => ['index' => ['max_result_window' => 2147483647 //用于控制在搜索查询中可以检索到的最大文档数,有符号int类型,最大可设置2^31 - 1,大了会有性能问题]]
];$response = $client->indices()->putSettings($params);
dd($response->asBool());
  • 插入数据
//这段代码只确保可批量插入,忽略精准的数据处理高可用问题。
$start = microtime(true);
ini_set('memory_limit', '4096M');
set_time_limit(0);include __DIR__ . './vendor/autoload.php';$client = \Elasticsearch\ClientBuilder::create()->setHosts(['192.168.0.183:9200'])->setBasicAuthentication('elastic', '123456')->build();/*** @function 逐行读取大文件* @param    $file_name string 文件名* @return   Generator|object*/
function readLargeFile($file_name) {$file = fopen($file_name, 'rb');if (! $file) {return false;}while (! feof($file)) {$line = fgets($file);if ($line !== false) {yield $line;}}fclose($file);
}// 使用生成器逐行读取大文件
$file_resource = readLargeFile('E:/其它/一亿行汉字文本.txt');
foreach ($file_resource as $loop => $line) {$loop ++;$from_charset = mb_detect_encoding($line, 'UTF-8, GBK, GB2312, BIG5, CP936, ASCII');$utf8_str     = @iconv($from_charset, 'UTF-8', $line);if(in_array($utf8_str, ["\n", "\r", "\n\r", "\r\n"])) {continue;}$params['body'][] = ['index' => ['_index' => 'performance_test', '_id' => $loop]];$params['body'][] = ['id' => $loop, 'content' => $utf8_str];if(count($params['body']) >= 100000) {$client->bulk($params); //忽略批量插入的错误$params = [];}
}echo '插入耗时:' . bcsub(microtime(true), $start, 3) . '秒';

实测ES与Sphinx新增数据建索引速度对比

应用耗时新增数据量补充
Sphinx50.5分钟109 450 000/
ElasticSearch119分钟109 450 000(总时间 - PHP代码执行时间,总耗时190分钟)

实测ES与Sphinx查询性能对比

某些项,ElasticSearch搜索出来的结果远超MySQL和Sphinx查询的结果,这是分词汇总的缘故。
而Sphinx使用的是SPH_MATCH_PHRASE格式,所以数量不会有ES那么多,若用SPH_MATCH_ANY,可能有更多的检索结果。

类型搜索关键字Sphinx搜索耗时(秒)ES搜索耗时(秒)MySQL搜索耗时(秒)Sphinx搜索数量ES搜索数量MySQL搜索数量
数字1230.0050.005305.142312138778143
中文单字0.0130.115223.1846780260016103272
英文单字母A0.0310.009339.57613642801017983
单中文标点4.4710.003125.10667088012067096182
单英文标点.00.003251.171006697242
可打印特殊字符00.002355.469000
中文词语(易分词)黑色衣服0.0660.283346.44210397224021062
中文词语(不易分词)夏威夷0.0110.114127.054363636643664
中文词语(热门)你好0.0220.091126.979102826136996137717
中文词语(冷门)旖旎0.0100.077345.493445244964528
英文单词good0.0100.074137.5625535881036
中文短语他不禁一脸茫然1.7420.973218.2720496986600
英文短语I am very happy0.0150.121355.2351483750
长文本陈大人不急着回答,他先从柜台下面又抽出了一份文案,翻了好一阵之后才回答道:“瞧,果然如此,如今广州这边官职该放得都放出去了,只剩下消防营山字营的一个哨官之职。不出所料的话,督抚大人准会委你这个职务。0.1315.638129.2041804989221

实测ES与Sphinx并发性能对比

  • 压测方式 :ab -c 1 -n 10~1000 127.0.0.1/temp/es/test.php
  • 中文定值关键字为华盛顿,英文定值关键字为XYZ,30位随机中文或英文字符,由代码生成(用代码生成数据源,是避免引入更好的数据源带来了性能误差)。
  • 由于ES IK分词器比Sphinx中文分词器分词粒度更细,所以并发下30位随机中文字符检索性能极具下降。
生成任意正整数个中文字符
function generateRandomChinese($length) {$result = '';for ($i = 0; $i < $length; $i++) {$result .= mb_convert_encoding('&#' . mt_rand(0x3e00, 0x9fa5) . ';', 'UTF-8', 'HTML-ENTITIES');}return $result;
}生成任意正整数个英文字符
function generateRandomEnglish($length) {$result = '';for ($i = 0; $i < $length; $i++) {$result .= chr(mt_rand(97, 122)); // 小写字母ASCII码范围: 97~122;大写字母:65~90}return $result;
}
类型搜索次数(ab -n 参数值)Sphinx耗时(秒)ES耗时(秒)
固定中文多次搜索100.2560.623
固定中文多次搜索1001.4351.915
固定中文多次搜索100011.60418.821
随机30位中文字符多次搜索100.5174.257
随机30位中文字符多次搜索1002.30552.505
随机30位中文字符多次搜索100017.197超时
固定英文多次搜索100.3270.584
固定英文多次搜索1000.7475.085
固定英文多次搜索10008.51050.423
随机30位英文字符多次搜索100.0770.0623
随机30位英文字符多次搜索1000.7664.810
随机30位英文字符多次搜索10009.42850.698

ES与Sphinx各项优缺点直观对比

项目ElasticSearch(相比于Sphinx)Sphinx(相比于ElasticSearch)
创建索引性能
查询性能相差无几相差无几
并发性能
中文分词支持需安装IK分词器需安装Mmseg分词工具和Coreseek中文搜索引擎框架
实时搜索友好不友好
对增量数据(Insert)通过代码层可直接同步ES需要运维层面的触发而生成增量索引
与数据库一致性同步问题(Update、Delete)ES支持直接更新Sphinx不支持对索引更新,需重建索引
客户端语言支持Java、PHP、JavaScript、Perl、Ruby、Python、Golang、Eland、.NET、RustJava、PHP、Python、Perl、C
开发语言JavaC++
支持跨平台
架构C/SC/S
合作流程内置数据库,支持对自身数据进行复杂的增删改查,但需要MySQL兜底内置索引库、帮MySQL找ID
事务支持不支持不支持
系统内存占用
集群部署支持支持
集群协调模式自动负载均衡节点间协调 需要手动设置负载均衡和协调
数据分析内建强大的聚合和分析功能不支持复杂的数据分析
GUI需额外安装组件,例如Kibana无官方可视化工具
生态繁荣一般
上手难度
安全性支持基于用户的访问控制,集成X-Pack进行高级安全配置。但内部的Log4j2组件存在高危漏洞基本的权限管理,需依赖外部工具

相关文章:

ElasticSearch第4篇(亿级中文数据量 ElasticSearch与Sphinx建索引速度、查询速度、并发性能、实测对比)

经过实测&#xff1a;1.09亿的数据量进行中文检索。ElasticSearch单机的检索性能在0.005~5.6秒之间&#xff0c;此检索速度可满足95%的业务场景&#xff08;注意&#xff1a;每条ES文档平均65个汉字&#xff0c;数据源取自几千本小说&#xff0c;大部分文档在15~300个汉字之间&…...

过期知识:thinkphp5 使用migrate给现有的数据表新增表字段

个人开发网站记录, 这个文章主要是个以后健忘的我看的. 我在搞我的画笔审核 , 发现数据表的画笔数据在审核驳回的时候还是软删除好一些, 免得用户找不到之前上传的画笔数据, 后期也可以考虑重新显示给用户,让用户可以修改画笔信息重新提交审核. 这个时候想起了…...

前端和Postman调用同一个接口,拿到的数据不一样

1、表现 联调一个List接口&#xff0c;Postman自测得到的ID和前端调用得到的ID&#xff0c;结果不一样。前者结果&#xff1a; 后者结果&#xff1a; 同一份代码、同一个数据库&#xff0c;出现这种错误&#xff0c;大概率是类型转换时出问题了&#xff0c;但检查代码发现&…...

1000W长连接,如何建立和维护?千万用户IM 架构设计

1000W长连接&#xff0c;如何建立和维护&#xff1f;千万用户IM 架构设计 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格&#xff0c;遇到很多很重要的架构类/设计类…...

vulhub:Apache解析漏洞CVE-2017-15715

Apache HTTPD是一款HTTP服务器&#xff0c;它可以通过mod_php来运行PHP网页。其2.4.0~2.4.29版本中存在一个换行解析漏洞&#xff0c;在解析PHP时&#xff0c;1.php\x0A将被按照PHP后缀进行解析&#xff0c;导致绕过一些服务器的安全策略。 #启动靶机 cd /Vulnhub/vulhub-mast…...

开发中可能会面临的真实问题及处理流程

接口返回数据不符合预期 问题描述&#xff1a;接口返回的数据结构或字段名称与前端预期不符&#xff0c;导致页面展示错误。 处理流程&#xff1a; 检查接口文档&#xff1a;确保前后端约定的接口文档是最新的&#xff0c;并且描述一致。 前后端沟通&#xff1a;与后端开发人员…...

个性化你的生产力工具:待办事项App定制指南

国内外主流的10款待办事项软件对比&#xff1a;PingCode、Worktile、滴答清单、番茄ToDo、Teambition、Todoist、Microsoft To Do、TickTick、Any.do、Trello。 在寻找合适的待办事项软件时&#xff0c;你是否感到选择众多、难以决断&#xff1f;一个好的待办事项工具可以大大提…...

本地部署持续集成工具Jenkins并配置公网地址实现远程自动化构建

文章目录 前言1. 安装Jenkins2. 局域网访问Jenkins3. 安装 cpolar内网穿透软件4. 配置Jenkins公网访问地址5. 公网远程访问Jenkins6. 固定公网地址 前言 本文主要介绍如何在Linux CentOS 7中安装Jenkins并结合cpolar内网穿透工具实现远程访问管理本地部署的Jenkins服务. Jenk…...

【数据结构】了解哈希表,解决哈希冲突,用Java模拟实现哈希桶

哈希表的概念 哈希表&#xff08;Hash Table&#xff09;是一种高效的数据结构&#xff0c;用于实现快速的数据存储和检索。它通过将数据映射到一个数组的索引位置&#xff0c;从而能够在平均情况下实现O(1)的时间复杂度进行查找、插入和删除操作。 哈希表的基本概念包括以下…...

qt5 ui转python或C++文件

firstMainWin.ui转换成.py文件&#xff0c;输入以下命令即可 pyuic5 -o firstMainWin.py firstMainwin. ui python -m PyQt5.uic.pyuic Img_ui.ui -o Img_ui.py firstMainWin.ui转换成c文件&#xff0c;输入以下命令即可 uic firstMainWin.ui -o hello.h ##用python转 新建…...

scp命令详解

scp&#xff08;secure copy&#xff09;是一个基于 SSH 的命令行工具&#xff0c;用于在不同计算机之间安全地复制文件和目录。scp 提供了在本地和远程主机之间传输文件的简单方法&#xff0c;并且支持加密和认证&#xff0c;确保文件传输的安全性。 基本用法 从本地复制到远…...

算法小白的进阶之路(力扣1~5)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…...

昇思25天学习打卡营第22天|MindSporeK基于Diffusion扩散模型学习- Diffusion与其他生成模型

Diffusion扩散模型 本文基于Hugging Face&#xff1a;The Annotated Diffusion Model一文翻译迁移而来&#xff0c;同时参考了由浅入深了解Diffusion Model一文。 本教程在Jupyter Notebook上成功运行。如您下载本文档为Python文件&#xff0c;执行Python文件时&#xff0c;请…...

【C++版本】protobuf与gRPC

文章目录 一、Protobuf二、安装以及使用protoc三、gRPC1.Q&A2.学习版rpc3.gRPC压缩算法 参考 一、Protobuf Google Protocol Buffers&#xff08;protobuf&#xff09;是一种语言中立、平台中立的序列化协议&#xff0c;旨在高效地将结构化数据进行序列化和反序列化。它主要…...

要抓住国际白银现货行情 以下这几点需要注意

国际白银现货行情最近表现不甚稳定&#xff0c;在七月上旬出现了比较强势的上涨&#xff0c;但随后出现强势的下跌&#xff0c;跌破了30关口。如果我们要抓住国际白银现货行情&#xff0c;那么以下这几点我们就需要注意。 一&#xff0c;建立交易计划&#xff0c;并且按计划执行…...

【计算机毕业设计】​720图书馆智能选座系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…...

java面向对象重点总结

文章目录 java面向对象重点总结类与实例构造方法方法重载属性与修饰符封装继承多态重构抽象类接口抽象类和接口的区别&#xff1a;集合泛型 java面向对象重点总结 对象是一个自包含的实体&#xff0c;用一组可识别的特性和行为来标识。 面向对象编程&#xff0c;英文叫Object…...

1321:【例6.3】删数问题(Noip1994)

大模拟 #include<bits/stdc.h> using namespace std; int s,len; char c[245]; int main(){cin>>c>>s;//读入高精度数和待删除的数lenstrlen(c);//1、寻找第一个下降序列的转折点&#xff0c;删去//2、如果找不到&#xff0c;意味着全部递增&#xff0c;删…...

使用 Python 中的 ELSER 进行Serverless 语义搜索:探索夏季奥运会历史

作者&#xff1a;来自 Elastic Essodjolo Kahanam 本博客介绍如何使用语义搜索以自然语言表达形式从 Elasticsearch 索引中获取信息。我们将创建一个无服务器 Elasticsearch 项目&#xff0c;将之前的奥运会数据集加载到索引中&#xff0c;使用推理处理器和 ELSER 模型生成推理…...

[HITCON 2017]SSRFme 1

目录 代码审计 符号shell_exec() 函数:GET " . escapeshellarg($_GET["url"])&#xff1a;pathinfo($_GET["filename"]basename() 题目解析 代码审计 118.182.186.90 <?phpif (isset($_SERVER[HTTP_X_FORWARDED_FOR])) {$http_x_headers explod…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...