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组件存在高危漏洞基本的权限管理,需依赖外部工具

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/387913.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决nginx端口转发后,获取不到真实IP问题

文章目录 1&#xff0c;设置nginx端口转发1.2&#xff0c;无法获取客户端真实IP 2&#xff0c;nginx配置文件增加配置&#xff0c;保留客户端信息2.2&#xff0c;可以看到真实IP信息 1&#xff0c;设置nginx端口转发 location /AWAPI/ {proxy_pass http://172.28.43.19:9607; …

UEFI DebugLib 介绍

1.我们调试中常用Debug 打印信息&#xff0c;这些会输出到BIOS串口日志中 EFI_STATUSEFIAPIHelloWorld2(IN EFI_HANDLE ImageHandle,IN EFI_SYSTEM_TABLE *SystemTable){EFI_STATUS Status;StatusEFI_SUCCESS;gST->ConOut->OutputString(gST->ConOut,L&q…

HomeServer平台选择,介绍常用功能

​​ 平台选择 HomeServer 的性能要求不高&#xff0c;以下是我的硬件参数&#xff0c;可供参考&#xff1a; ‍ 硬件&#xff1a; 平台&#xff1a;旧笔记本CPU&#xff1a;i5 4210u内存 8G硬盘&#xff1a;128G 固态做系统盘&#xff0c;1T1T 机械盘组 RAID1 做存储。硬…

【数据结构与算法】详解计数排序:小范围整数排序的最佳选择

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《数据结构与算法》 期待您的关注 ​ 目录 一、引言 二、计数排序的基本原理 三、实现步骤 1. 确定数据范围 2. 初始化计数数组…

Serverless Knative冷启动与自动扩缩容研究:从原理到实践

最近一个研究生网页的提问&#xff0c;然后就有了这篇博客&#xff01; 大佬你好&#xff0c;我看到您的关于Serverless的文章于是十分冒昧的向您提问。我现在是一名在研究通过Serverless容器调度解决冷启动问题的本科生&#xff0c;导师放养&#xff0c;就让看论文但是后面的代…

ubuntu20.04.6 安装Skywalking 10.0.1

1.前置准备 1.1. **jdk17&#xff08;Skywalking10 jdk22不兼容&#xff0c;用17版本即可&#xff09;**安装&#xff1a; https://blog.csdn.net/CsethCRM/article/details/140768670 1.2. elasticsearch安装&#xff1a; https://blog.csdn.net/CsethCRM/article/details…

Python入门宝藏《看漫画学Python》,495页漫画带你弄清python知识点!简单易懂 | 附PDF全彩版

华为出品的《看漫画学Python》全彩PDF教程是一本适合Python初学者的学习资料&#xff0c;通过漫画的形式将复杂的Python技术问题简单化&#xff0c;使学习过程更加生动有趣。以下是对该教程的内容简介、本书概要及本书目录的详细解析&#xff1a; 内容简介 《看漫画学Python》…

手机三要素接口怎么对接呢?(一)

一、什么是手机三要素&#xff1f; 手机三要素又叫运营商三要素&#xff0c;运营商实名认证&#xff0c;运营商实名核验&#xff0c;手机三要素实名验证&#xff0c;手机三要素实名核验&#xff0c;每个人的称呼都不同&#xff0c;但是入参和出参是一样的。 输入姓名、身份证…

MATLAB基础:函数与函数控制语句

今天我们继续学习Matlab中函数相关知识。 API的查询和调用 help 命令是最基本的查询方法&#xff0c;可查询所有目录、指定目录、命令、函数。 我们直接点击帮助菜单即可查询所需的API函数。 lookfor 关键字用于搜索相关的命令和函数。 如&#xff0c;我们输入lookfor inpu…

矩估计与最大似然估计的通俗理解

点估计与区间估计 矩估计与最大似然估计都属于点估计&#xff0c;也就是估计出来的结果是一个具体的值。对比区间估计&#xff0c;通过样本得出的估计值是一个范围区间。例如估计馒头店每天卖出的馒头个数&#xff0c;点估计就是最终直接估计每天卖出10个&#xff0c;而区间估…

【机器学习基础】机器学习的数学基础

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈Python机器学习 ⌋ ⌋ ⌋ 机器学习是一门人工智能的分支学科&#xff0c;通过算法和模型让计算机从数据中学习&#xff0c;进行模型训练和优化&#xff0c;做出预测、分类和决策支持。Python成为机器学习的首选语言&#xff0c;…

鸿蒙(HarmonyOS)DatePicker+TimePicker时间选择控件

一、操作环境 操作系统: Windows 11 专业版、IDE:DevEco Studio 3.1.1 Release、SDK:HarmonyOS 3.1.0&#xff08;API 9&#xff09; 二、效果图 可实现两种选择方式&#xff0c;可带时分选择&#xff0c;也可不带&#xff0c;使用更加方便。 三、代码 SelectedDateDialog…

2024下半年,前端的技术风口来了

“ 你近期有体验过哪些大模型产品呢&#xff1f; 你有使用大模型API做过一些实际开发吗&#xff1f; 在你日常开发中&#xff0c;可以与大模型相关应用结合来完成工作吗&#xff1f; ” **最近&#xff0c;一直在和同事聊&#xff0c;关于前端可以用大模型干点啥&#xff…

实战:安装ElasticSearch 和常用操作命令

概叙 科普文&#xff1a;深入理解ElasticSearch体系结构-CSDN博客 Elasticsearch各版本比较 ElasticSearch 单点安装 1 创建普通用户 #1 创建普通用户名&#xff0c;密码 [roothlink1 lyz]# useradd lyz [roothlink1 lyz]# passwd lyz#2 然后 关闭xshell 重新登录 ip 地址…

Nat Med·UNI:开启计算病理学新篇章的自监督基础模型|顶刊精析·24-07-31

小罗碎碎念 本期推文主题 这一期推文是病理AI基础模型UNI的详细介绍&#xff0c;原文如下。下期推文会介绍如何使用这个模型&#xff0c;为了你能看懂下期的推文&#xff0c;强烈建议你好好看看今天这期推文。 看完这篇推文以后&#xff0c;你大概就能清楚这个模型对自己的数据…

卷积神经网络(六)---实现 cifar10 分类

cifar10 数据集有60000张图片&#xff0c;每张图片的大小都是 32x32 的三通道的彩色图&#xff0c;一共是10种类别、每种类别有6000张图片&#xff0c;如图4.27所示。 图 4.27 cifar数据集 使用前面讲过的残差结构来处理 cifar10 数据集&#xff0c;可以实现比较高的准确率。 …

麦田物语第十五天

系列文章目录 麦田物语第十五天 文章目录 系列文章目录一、构建游戏的时间系统二、时间系统 UI 制作总结 一、构建游戏的时间系统 在该游戏中我们要构建年月日天时分秒等时间的概念&#xff0c;从而实现季节的更替&#xff0c;昼夜的更替等&#xff08;不同的季节可以播种不同…

【MATLAB源码】机器视觉与图像识别技术实战示例文档---鱼苗面积预测计数

系列文章目录 第一篇文章&#xff1a;【MATLAB源码】机器视觉与图像识别技术—视觉系统的构成(视频与图像格式转换代码及软件下载) 第二篇文章&#xff1a;【MATLAB源码】机器视觉与图像识别技术(2)—图像分割基础 第三篇文章&#xff1a;【MATLAB源码】机器视觉与图像识别技术…

提交高通量测序处理数据到 GEO --- 操作流程

❝ 写在前面 由于最近在提交课题数据到 NCBI 数据库&#xff0c;整理了相关笔记。本着自己学习、分享他人的态度&#xff0c;分享学习笔记&#xff0c;希望能对大家有所帮助。推荐先按顺序阅读往期内容&#xff1a; 1. 提交高通量测序数据到 GEO --- 说明书 2. 提交高通量测序原…

jQuery前端网页制作

1、Jquery的概述 1.1JavaScript库 JavaScript 高级程序设计(特别是对浏览器差异的复杂处理),通常很困难也很耗时。 为了应对这些调整,许多的 JavaScript (helper) 库应运而生。 这些 JavaScript 库常被称为 JavaScript 框架。 市面上一些广受欢迎的 JavaScript 框架:…