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新增数据建索引速度对比
应用 | 耗时 | 新增数据量 | 补充 |
---|---|---|---|
Sphinx | 50.5分钟 | 109 450 000 | / |
ElasticSearch | 119分钟 | 109 450 000 | (总时间 - PHP代码执行时间,总耗时190分钟) |
实测ES与Sphinx查询性能对比
某些项,ElasticSearch搜索出来的结果远超MySQL和Sphinx查询的结果,这是分词汇总的缘故。
而Sphinx使用的是SPH_MATCH_PHRASE格式,所以数量不会有ES那么多,若用SPH_MATCH_ANY,可能有更多的检索结果。
类型 | 搜索关键字 | Sphinx搜索耗时(秒) | ES搜索耗时(秒) | MySQL搜索耗时(秒) | Sphinx搜索数量 | ES搜索数量 | MySQL搜索数量 |
---|---|---|---|---|---|---|---|
数字 | 123 | 0.005 | 0.005 | 305.142 | 3121 | 3877 | 8143 |
中文单字 | 虹 | 0.013 | 0.115 | 223.184 | 67802 | 60016 | 103272 |
英文单字母 | A | 0.031 | 0.009 | 339.576 | 136428 | 0 | 1017983 |
单中文标点 | 。 | 4.471 | 0.003 | 125.106 | 67088012 | 0 | 67096182 |
单英文标点 | . | 0 | 0.003 | 251.171 | 0 | 0 | 6697242 |
可打印特殊字符 | ☺ | 0 | 0.002 | 355.469 | 0 | 0 | 0 |
中文词语(易分词) | 黑色衣服 | 0.066 | 0.283 | 346.442 | 1039 | 722402 | 1062 |
中文词语(不易分词) | 夏威夷 | 0.011 | 0.114 | 127.054 | 3636 | 3664 | 3664 |
中文词语(热门) | 你好 | 0.022 | 0.091 | 126.979 | 102826 | 136996 | 137717 |
中文词语(冷门) | 旖旎 | 0.010 | 0.077 | 345.493 | 4452 | 4496 | 4528 |
英文单词 | good | 0.010 | 0.074 | 137.562 | 553 | 588 | 1036 |
中文短语 | 他不禁一脸茫然 | 1.742 | 0.973 | 218.272 | 0 | 49698660 | 0 |
英文短语 | I am very happy | 0.015 | 0.121 | 355.235 | 1 | 48375 | 0 |
长文本 | 陈大人不急着回答,他先从柜台下面又抽出了一份文案,翻了好一阵之后才回答道:“瞧,果然如此,如今广州这边官职该放得都放出去了,只剩下消防营山字营的一个哨官之职。不出所料的话,督抚大人准会委你这个职务。 | 0.131 | 5.638 | 129.204 | 1 | 80498922 | 1 |
实测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耗时(秒) |
---|---|---|---|
固定中文多次搜索 | 10 | 0.256 | 0.623 |
固定中文多次搜索 | 100 | 1.435 | 1.915 |
固定中文多次搜索 | 1000 | 11.604 | 18.821 |
随机30位中文字符多次搜索 | 10 | 0.517 | 4.257 |
随机30位中文字符多次搜索 | 100 | 2.305 | 52.505 |
随机30位中文字符多次搜索 | 1000 | 17.197 | 超时 |
固定英文多次搜索 | 10 | 0.327 | 0.584 |
固定英文多次搜索 | 100 | 0.747 | 5.085 |
固定英文多次搜索 | 1000 | 8.510 | 50.423 |
随机30位英文字符多次搜索 | 10 | 0.077 | 0.0623 |
随机30位英文字符多次搜索 | 100 | 0.766 | 4.810 |
随机30位英文字符多次搜索 | 1000 | 9.428 | 50.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、Rust | Java、PHP、Python、Perl、C |
开发语言 | Java | C++ |
支持跨平台 | 是 | 是 |
架构 | C/S | C/S |
合作流程 | 内置数据库,支持对自身数据进行复杂的增删改查,但需要MySQL兜底 | 内置索引库、帮MySQL找ID |
事务支持 | 不支持 | 不支持 |
系统内存占用 | 大 | 小 |
集群部署 | 支持 | 支持 |
集群协调模式 | 自动负载均衡 | 节点间协调 需要手动设置负载均衡和协调 |
数据分析 | 内建强大的聚合和分析功能 | 不支持复杂的数据分析 |
GUI | 需额外安装组件,例如Kibana | 无官方可视化工具 |
生态 | 繁荣 | 一般 |
上手难度 | 难 | 易 |
安全性 | 支持基于用户的访问控制,集成X-Pack进行高级安全配置。但内部的Log4j2组件存在高危漏洞 | 基本的权限管理,需依赖外部工具 |
相关文章:
ElasticSearch第4篇(亿级中文数据量 ElasticSearch与Sphinx建索引速度、查询速度、并发性能、实测对比)
经过实测:1.09亿的数据量进行中文检索。ElasticSearch单机的检索性能在0.005~5.6秒之间,此检索速度可满足95%的业务场景(注意:每条ES文档平均65个汉字,数据源取自几千本小说,大部分文档在15~300个汉字之间&…...
过期知识:thinkphp5 使用migrate给现有的数据表新增表字段
个人开发网站记录, 这个文章主要是个以后健忘的我看的. 我在搞我的画笔审核 , 发现数据表的画笔数据在审核驳回的时候还是软删除好一些, 免得用户找不到之前上传的画笔数据, 后期也可以考虑重新显示给用户,让用户可以修改画笔信息重新提交审核. 这个时候想起了…...
前端和Postman调用同一个接口,拿到的数据不一样
1、表现 联调一个List接口,Postman自测得到的ID和前端调用得到的ID,结果不一样。前者结果: 后者结果: 同一份代码、同一个数据库,出现这种错误,大概率是类型转换时出问题了,但检查代码发现&…...
1000W长连接,如何建立和维护?千万用户IM 架构设计
1000W长连接,如何建立和维护?千万用户IM 架构设计 在40岁老架构师 尼恩的读者交流群(50)中,最近有小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格,遇到很多很重要的架构类/设计类…...
vulhub:Apache解析漏洞CVE-2017-15715
Apache HTTPD是一款HTTP服务器,它可以通过mod_php来运行PHP网页。其2.4.0~2.4.29版本中存在一个换行解析漏洞,在解析PHP时,1.php\x0A将被按照PHP后缀进行解析,导致绕过一些服务器的安全策略。 #启动靶机 cd /Vulnhub/vulhub-mast…...
开发中可能会面临的真实问题及处理流程
接口返回数据不符合预期 问题描述:接口返回的数据结构或字段名称与前端预期不符,导致页面展示错误。 处理流程: 检查接口文档:确保前后端约定的接口文档是最新的,并且描述一致。 前后端沟通:与后端开发人员…...
个性化你的生产力工具:待办事项App定制指南
国内外主流的10款待办事项软件对比:PingCode、Worktile、滴答清单、番茄ToDo、Teambition、Todoist、Microsoft To Do、TickTick、Any.do、Trello。 在寻找合适的待办事项软件时,你是否感到选择众多、难以决断?一个好的待办事项工具可以大大提…...
本地部署持续集成工具Jenkins并配置公网地址实现远程自动化构建
文章目录 前言1. 安装Jenkins2. 局域网访问Jenkins3. 安装 cpolar内网穿透软件4. 配置Jenkins公网访问地址5. 公网远程访问Jenkins6. 固定公网地址 前言 本文主要介绍如何在Linux CentOS 7中安装Jenkins并结合cpolar内网穿透工具实现远程访问管理本地部署的Jenkins服务. Jenk…...
【数据结构】了解哈希表,解决哈希冲突,用Java模拟实现哈希桶
哈希表的概念 哈希表(Hash Table)是一种高效的数据结构,用于实现快速的数据存储和检索。它通过将数据映射到一个数组的索引位置,从而能够在平均情况下实现O(1)的时间复杂度进行查找、插入和删除操作。 哈希表的基本概念包括以下…...
qt5 ui转python或C++文件
firstMainWin.ui转换成.py文件,输入以下命令即可 pyuic5 -o firstMainWin.py firstMainwin. ui python -m PyQt5.uic.pyuic Img_ui.ui -o Img_ui.py firstMainWin.ui转换成c文件,输入以下命令即可 uic firstMainWin.ui -o hello.h ##用python转 新建…...
scp命令详解
scp(secure copy)是一个基于 SSH 的命令行工具,用于在不同计算机之间安全地复制文件和目录。scp 提供了在本地和远程主机之间传输文件的简单方法,并且支持加密和认证,确保文件传输的安全性。 基本用法 从本地复制到远…...
算法小白的进阶之路(力扣1~5)
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…...
昇思25天学习打卡营第22天|MindSporeK基于Diffusion扩散模型学习- Diffusion与其他生成模型
Diffusion扩散模型 本文基于Hugging Face:The Annotated Diffusion Model一文翻译迁移而来,同时参考了由浅入深了解Diffusion Model一文。 本教程在Jupyter Notebook上成功运行。如您下载本文档为Python文件,执行Python文件时,请…...
【C++版本】protobuf与gRPC
文章目录 一、Protobuf二、安装以及使用protoc三、gRPC1.Q&A2.学习版rpc3.gRPC压缩算法 参考 一、Protobuf Google Protocol Buffers(protobuf)是一种语言中立、平台中立的序列化协议,旨在高效地将结构化数据进行序列化和反序列化。它主要…...
要抓住国际白银现货行情 以下这几点需要注意
国际白银现货行情最近表现不甚稳定,在七月上旬出现了比较强势的上涨,但随后出现强势的下跌,跌破了30关口。如果我们要抓住国际白银现货行情,那么以下这几点我们就需要注意。 一,建立交易计划,并且按计划执行…...
【计算机毕业设计】720图书馆智能选座系统
🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板ÿ…...
java面向对象重点总结
文章目录 java面向对象重点总结类与实例构造方法方法重载属性与修饰符封装继承多态重构抽象类接口抽象类和接口的区别:集合泛型 java面向对象重点总结 对象是一个自包含的实体,用一组可识别的特性和行为来标识。 面向对象编程,英文叫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、寻找第一个下降序列的转折点,删去//2、如果找不到,意味着全部递增,删…...
使用 Python 中的 ELSER 进行Serverless 语义搜索:探索夏季奥运会历史
作者:来自 Elastic Essodjolo Kahanam 本博客介绍如何使用语义搜索以自然语言表达形式从 Elasticsearch 索引中获取信息。我们将创建一个无服务器 Elasticsearch 项目,将之前的奥运会数据集加载到索引中,使用推理处理器和 ELSER 模型生成推理…...
[HITCON 2017]SSRFme 1
目录 代码审计 符号shell_exec() 函数:GET " . escapeshellarg($_GET["url"]):pathinfo($_GET["filename"]basename() 题目解析 代码审计 118.182.186.90 <?phpif (isset($_SERVER[HTTP_X_FORWARDED_FOR])) {$http_x_headers explod…...
看不见的硝烟:中国网络安全三十年沉浮史
2022 年 5 月 16 日,俄罗斯黑客组织 KillNet 向包括美国、英国、德国在内 10 个国家的政府正式 “宣战”。 2022 年 4 月 28 日,一则消息刷屏,北京健康宝在使用高峰期间,遭受到境外网络攻击。北京健康宝保障团队进行了及时有效应…...
3.7.物体检测算法
物体检测算法 1.R-CNN 首先使用启发式搜索算法来选择锚框,使用预训练模型对每个锚框抽取特征,训练一个SVM来对类别分类,最后训练一个线性回归模型来预测边缘框偏移。 R-CNN比较早,所以使用的是SVM 1.1 兴趣区域(RoI)池化…...
Spring源码解析(27)之AOP的核心对象创建过程2
一、前言 我们在上一节中已经介绍了Advisor的创建过程,当时我们创建的logUtil这bean,他在 resolveBeforeInstantiation返回的是null,那么就会继续往下执行doCreateBean方法。 二、源码分析 protected Object doCreateBean(String beanName,…...
【题解】【数学】—— [CSP-J 2023] 小苹果
【题解】【数学】—— [CSP-J 2023] 小苹果 [CSP-J 2023] 小苹果题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示 1.题意分析2.代码 [CSP-J 2023] 小苹果 前置知识:数学分组思想,整体思想。 [CSP-J 2023] 小苹果 题目描述 小 Y 的桌子上…...
python实现微信聊天图片DAT文件还原
完整代码如下: from glob import glob import os from tqdm import tqdmdef get_sign(dat_r):signatures [(0x89, 0x50, 0x4e), (0x47, 0x49, 0x46), (0xff, 0xd8, 0xff)]mats [".png", ".gif", ".jpg"]for now in dat_r:for j, x…...
栈与队列——1.有效的括号
力扣题目链接 给定一个只包括 (,),{,},[,] 的字符串,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效…...
C语言家教记录(二)
C语言家教记录(二) 导语输入输出表达式算数运算符示例程序赋值运算符简单赋值复合赋值 总结和复习 导语 本次授课内容如下:输入输出、表达式 有时间则讲解选择语句 辅助教材为 《C语言程序设计现代方法(第2版)》 输…...
Cocos Creator2D游戏开发(10)-飞机大战(8)-计分和结束
现在游戏基本能完了, 飞机能发射子弹,打了敌机,敌机也能炸; 接下来要做计分了; 步骤: 搞出一个lable让lable显示炸了多少飞机 开搞: ①创建一个Lable标签 ② root.ts文件 添加 property(Label) player_score: Label; // 标签属性 标签绑定 ③ 代码添加 注册 然后回调 contac…...
经验分享:大数据多头借贷风险对自身的不利影响?
在现代金融体系中,大数据技术的应用使得多头借贷成为一种普遍现象。多头借贷指的是个人或企业在短时间内同时或近期内申请多笔贷款或信用产品,这种行为可能带来一系列财务和信用风险。以下是大数据多头借贷风险对个人自身可能产生的不利影响:…...
OpenCV 图像处理 轮廓检测基本原理
文章目录 基本原理关键函数和参数注意事项 示例代码示例效果代码详解findContours 函数原型findContours函数变体 基本原理 轮廓发现是图像处理中的一个重要步骤,用于检测物体的边界和形状。 图像预处理: 轮廓发现通常在灰度图像上进行。因此࿰…...
做网站都需要买什么/淘宝如何提升关键词排名
原创地址:http://www.cnblogs.com/jfzhu/archive/2012/12/10/2812040.html 转载请注明出处 我在之前的博客中介绍过如何为Microsoft Dynamics CRM 2011 安装语言包,安装了不同的语言包后,用户可以选择使用不同的界面语言。我在本文中介绍一下…...
做海报裂变的网站/百度移动点击排名软件
AndroidStudio 引入 aidl 文件,一般来说,有两种方法.第一种方法直接在 src/main 目录下新建 aidl 文件夹,并将我们的 aidl 文件放到该目录下。因为 AndroidStudio 默认的 aidl 文件默认配置是这样的。第二种方法 把 adil 文件拷贝到libs文件夹…...
女孩子做网站推广/网络营销的优缺点
新开了公众号,欢迎关注 epoll epoll是linux下的一种I/O多路复用的操作方式,是event poll的意思 I/O多路复用,举个栗子,在酒吧,一个服务员,10个顾客在喝酒,服务员有这么几种服务方式 服务员…...
校园o2o平台有哪些/无锡seo网络推广
scanner.next()是接收一个字符串 而scanner.next().charAt(0)是接收到一个字符串,而取到这个字符串的第一个元素。...
平乡县网站建设平台/十大免费无代码开发软件
目录 规则 举例说明并解释: 补充:实例化规律 规则 <? extends class>确定上边界,不能使用Set方法 <? super class>确定下边界,不能使用get方法 如果你既想要获取数据,又要写入数据,那么…...
找工程项目/如何优化网页加载速度
vim常用命令总结 (转) 在命令状态下对当前行用 (连按两次), 或对多行用n(n是自然数)表示自动缩进从当前行起的下面n行。你可以试试把代码缩进任意打乱再用n排版,相当于一般IDE里的code format。使用ggG可对…...