mysql update语句中查询语句如何翻译成ES查询语句

关于ElasticSearch与MySql的数据存储测试! - 农夫三拳有点咸 - 博客园
随笔 - 10, 文章 - 0, 评论 - 0, 引用 - 0
一直好奇存储大小相同的记录,es和mysql谁占用存储空间更大呢。虽然按道理来看应该是mysql,但一直没有亲自尝试,总还是心里感觉不那么踏实。
所以今天做一个测试,看看到底实际情况怎么样?
关于在二者的数据存储,有下面一个大概的说明,可能不够准确,但我只知道这么多:
1、ES先将数据存到内存,再通过队列的形式写到磁盘;虽然mysql也有内存模式,但是在大多数实际应用中我们仍然使用的传统模式,所以在并发写入方面,es要优于mysql。
2、ES存储的数据是经过压缩的。在实际测试中笔者发现6千条记录并不比5千条记录所占用的磁盘空间大。
3、关于mysql,每条索引的长度是和你创建列的时候制定的长度相同的。比如你创建varchar(100),当你在该列上创建索引,那么索引的长度则是102字节,因为长度超过64字节则会额外增加2字节记录索引的长度。
4、在这个测试中es未做分词,仅用于数据存储。
测试机硬件配置:
ES索引配置:5个主分片,未添加复制分片。Type结构如下:
createTimeYmd
创建日期yyyy-mm-dd格式
createTime
创建时间yyyy-mm-dd hh:mi:ss格式
createName
xmlContent
申报表xml报文,本次测试中使用的xml报文为30kb的xml结构体。约等于2.8w个字符长度。
业务关联字段(模拟)
mysql数据表的结构与es中type的结构相同,详细如下:
createTimeYmd
创建日期yyyy-mm-dd格式
createTime
创建时间yyyy-mm-dd hh:mi:ss格式
createName
varchar(10)
xmlContent
申报表xml报文,本次测试中使用的xml报文为30kb的xml结构体。约等于2.8w个字符长度。
varchar(10)
业务关联字段(模拟)
以下为es记录数与物理文件列表:
记录条数 单位:行
es数据文件(物理存储空间)
mysql数据文件(物理存储空间)
对比鲜明,不忍继续
从以上数据指标可以看出,ES在做存储的时候针对数据是做了压缩的。根据其规律可以推测出1000W行这样的记录,其存储空间约为500GB。1亿条记录,其主分片存储空间约为5T。
在w行数据的写入过程中,es与mysql完成写入的时间都在可接受的范围内,耗时并不长。(ps:mysql使用单线程for循环的方式插入数据;es前6.5w行记录使用单线程循环插入,后面数据过多,使用8个线程,循环插入。)
由于对比过于鲜明,相同数据量的情况下mysql占用的空间明显比es大很多,在插入6.5W行数据后就没再继续做插入测试。
在添加数据过程中,笔者尝试边写入边查询。使用refKey做为条件进行随机查询,值得一提的是在6.5万行记录中查询一条记录所耗时间不足3秒;而mysql,在边写入边查询的时候(特别是循环暴力写入),其查询几乎处于停滞状态。
在添加操作结束后,笔者随机做了一下查询操作,如果使用主键mysql查询能够很快得到结果,如果使用非主键----refKey做查询,mysql要在7,8秒左右才能返回结果,而es查询相同条件的数据,仅需要2秒不足,且es里面的总数据量在60w+,比mysql的数据总量要大很多。
做此对比的目的不是说es就比mysql好用。二者各有所长,要按使用场景,按需选用。
以上为es与mysql存储数据的对比结果。测试过程中使数据在附件中列出。如果没有,可能是我忘了, 如果有人需要,可提醒我上传。mysql数据抽取同步至elasticsearch中
了解了几种方式:
1.使用mysql的binlog日志,这个可以使用阿里的canal,进行同步至es中
2.使用es官方推荐的logstash-input-jdbc,这是logstash的一个插件,源码地址首先,安装logstash,此处不再赘述,由于logstash-input-jdbc使用ruby快发,所以还需要安装,选择下载安装,安装好后,打开CMD输入ruby -v查看是否安装成功然后修改gem的源,使用gem sources -l删除原来的源 gem sources --remove https://rubygems.org/添加新的源gem sources -a http://gems.ruby-china.org/
gem sources -l修改成功后,还需要修改Gemfile的数据源地址:gem install bundler
bundle config mirror.https://rubygems.org https://gems.ruby-china.org然后就是安装logstash-input-jdbc,在logstash的bin的目录下,执行下面的命令:.\logstash-plugin.bat install logstash-input-jdbc等一会后会显示Installation successful的字样,安装成功后,就是怎么使用了,官方文档地址:在bin目录下新建一个文件夹,比如mysql新建一个jdbc.conf文件,配置如下:
jdbc_connection_string =& "jdbc:mysql://127.0.0.1:3306/test"
jdbc_user =& "root"
jdbc_password =& "123456"
jdbc_driver_library =& "F:\Program Files\logstash-6.2.4\bin\mysql\mysql-connector-java-5.1.30.jar"
jdbc_driver_class =& "com.mysql.jdbc.Driver"
jdbc_paging_enabled =& "true"
jdbc_page_size =& "300000"
use_column_value =& "true"
tracking_column =& "id"
statement_filepath =& "F:\Program Files\logstash-6.2.4\bin\mysql\jdbc.sql"
schedule =& "* * * * *"
type =& "jdbc"
jdbc_default_timezone =&"Asia/Shanghai"
source =& "message"
remove_field =& ["message"]
elasticsearch {
hosts =& ["localhost:9200"]
index =& "test_out"
template =& "F:\Program Files\logstash-6.2.4\bin\mysql\es-template.json"
template_name =& "t-statistic-out-logstash"
template_overwrite =& true
document_type =& "out"
document_id =& "%{id}"
codec =& json_lines
}然后把数据库的连接的jar包放到此文件夹下,然后新建一个jdbc.sql脚本文件,用来执行sql的,select * from test where id&=:sql_last_value,:sql_last_value是根据id变化后,根据指定的时间进行拉取更新es中的数据,实现增量同步更新数据。然后启动logstash,执行命令:.\logstash.bat -f
.\mysql\jdbc.conf如果启动不成功,检查jdbc.conf和jdbc.sql编码格式,设置为UTF-8无BOM格式就可以启动信息类似下面这种,表示启动成功,它会自动执行jdbc.sql中的sql语句,查询获取数据同步至es中:[T15:59:46,690][INFO ][logstash.outputs.elasticsearch] Running health check to see if an Elasticsearch connection is working {:healthcheck_url=&http://localhost:9200/, :path=&"/"}
[T15:59:46,869][WARN ][logstash.outputs.elasticsearch] Restored connection to ES instance {:url=&"http://localhost:9200/"}
[T15:59:46,915][INFO ][logstash.outputs.elasticsearch] ES Output version determined {:es_version=&6}
[T15:59:46,921][WARN ][logstash.outputs.elasticsearch] Detected a 6.x and above cluster: the `type` event field won't be used to determine the document _type {:es_version=&6}
[T15:59:46,936][INFO ][logstash.outputs.elasticsearch] Using mapping template from {:path=&"F:\\Program Files\\logstash-6.2.4\\bin\\mysql\\es-template.json"}
[T15:59:46,951][INFO ][logstash.outputs.elasticsearch] Attempting to install template {:manage_template=&{"template"=&"t-statistis-out-template", "order"=&1, "settings"=&{"index"=&{"refresh_interval"=&"5s"}}, "mappings"=&{"_default_"=&{"_all"=&{"enabled"=&false}, "dynamic_templates"=&[{"message_field"=&{"match"=&"message", "match_mapping_type"=&"string", "mapping"=&{"type"=&"string", "index"=&"not_analyzed"}}}, {"string_fields"=&{"match"=&"*", "match_mapping_type"=&"string", "mapping"=&{"type"=&"string", "index"=&"not_analyzed"}}}], "properties"=&{"@timestamp"=&{"type"=&"date"}, "@version"=&{"type"=&"keyword"}, "geoip"=&{"dynamic"=&true, "properties"=&{"ip"=&{"type"=&"ip"}, "location"=&{"type"=&"geo_point"}, "latitude"=&{"type"=&"half_float"}, "longitude"=&{"type"=&"half_float"}}}, "acc_id"=&{"type"=&"keyword"}, "acc_name"=&{"type"=&"keyword"}, "acc_pp"=&{"type"=&"keyword"}, "account_price_type"=&{"type"=&"keyword"}, "cyacc_no"=&{"type"=&"keyword"}, "order_id"=&{"type"=&"keyword"}, "voucher_id"=&{"type"=&"keyword"}}}}, "aliases"=&{}}}
[T15:59:46,986][INFO ][logstash.outputs.elasticsearch] Installing elasticsearch template to _template/t-statistic-out-logstash
[T15:59:47,097][INFO ][logstash.outputs.elasticsearch] New Elasticsearch output {:class=&"LogStash::Outputs::ElasticSearch", :hosts=&["//localhost:9200"]}
[T15:59:47,499][INFO ][logstash.pipeline
] Pipeline started successfully {:pipeline_id=&"main", :thread=&"#&Thread:0x1b1682f0 run&"}
The stdin plugin is now waiting for input:
[T15:59:47,613][INFO ][logstash.agent
] Pipelines running {:count=&1, :pipelines=&["main"]}
[T16:00:01,955][INFO ][logstash.inputs.jdbc
] (0.009963s) SELECT version()如果同步至es中的字段不需要设置分词,不然查询时分词会导致结果不正确,模糊匹配不能像关系数据库中使用like那样,就需要在jdbc.conf的output里设置template、template_name和template_overwrite,如下所示:output {
elasticsearch {
hosts =& ["localhost:9200"]
index =& "t_statistic_out"
template =& "F:\Program Files\logstash-6.2.4\bin\mysql\es-template.json"
template_name =& "t-statistic-out-logstash"
template_overwrite =& true
document_type =& "out"
document_id =& "%{id}"
codec =& json_lines
}es-template.json配置文件如下,设置不分词的字段值type为keyword:{
"template" : "t-statistis-out-template",
"order":1,
"settings": {
"index": {
"refresh_interval": "5s"
"mappings": {
"_default_": {
"_all" : {"enabled":false},
"dynamic_templates": [
"message_field" : {
"match" : "message",
"match_mapping_type" : "string",
"mapping" : { "type" : "string", "index" : "not_analyzed" }
"string_fields" : {
"match" : "*",
"match_mapping_type" : "string",
"mapping" : { "type" : "string", "index" : "not_analyzed" }
"properties": {
"@timestamp": {
"type": "date"
"@version": {
"type": "keyword"
"geoip": {
"dynamic": true,
"properties": {
"type": "ip"
"location": {
"type": "geo_point"
"latitude": {
"type": "half_float"
"longitude": {
"type": "half_float"
"acc_id": {
"type": "keyword"
"acc_name": {
"type": "keyword"
"acc_pp": {
"type": "keyword"
"account_price_type": {
"type": "keyword"
"cyacc_no": {
"type": "keyword"
"order_id": {
"type": "keyword"
"voucher_id": {
"type": "keyword"
"aliases": {}
}如果发现没生效,设置order大于0,logstash启动的时候会默认发送一个logstash的文件,此时需要删除这个默认的然后再删除对应的索引,重新启动,就会发现生效了
没有更多推荐了,&>&SQL语句英文翻译成中文
SQL语句英文翻译成中文
上传大小:39KB
对于初学者来说挺方便的东东,相当于是一个SQL查询手册,又是中文的,很方便
综合评分:4
{%username%}回复{%com_username%}{%time%}\
/*点击出现回复框*/
$(".respond_btn").on("click", function (e) {
$(this).parents(".rightLi").children(".respond_box").show();
e.stopPropagation();
$(".cancel_res").on("click", function (e) {
$(this).parents(".res_b").siblings(".res_area").val("");
$(this).parents(".respond_box").hide();
e.stopPropagation();
/*删除评论*/
$(".del_comment_c").on("click", function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_invalid/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parents(".conLi").remove();
alert(data.msg);
$(".res_btn").click(function (e) {
var parentWrap = $(this).parents(".respond_box"),
q = parentWrap.find(".form1").serializeArray(),
resStr = $.trim(parentWrap.find(".res_area_r").val());
console.log(q);
//var res_area_r = $.trim($(".res_area_r").val());
if (resStr == '') {
$(".res_text").css({color: "red"});
$.post("/index.php/comment/do_comment_reply/", q,
function (data) {
if (data.succ == 1) {
var $target,
evt = e || window.
$target = $(evt.target || evt.srcElement);
var $dd = $target.parents('dd');
var $wrapReply = $dd.find('.respond_box');
console.log($wrapReply);
//var mess = $(".res_area_r").val();
var mess = resS
var str = str.replace(/{%header%}/g, data.header)
.replace(/{%href%}/g, 'http://' + window.location.host + '/user/' + data.username)
.replace(/{%username%}/g, data.username)
.replace(/{%com_username%}/g, data.com_username)
.replace(/{%time%}/g, data.time)
.replace(/{%id%}/g, data.id)
.replace(/{%mess%}/g, mess);
$dd.after(str);
$(".respond_box").hide();
$(".res_area_r").val("");
$(".res_area").val("");
$wrapReply.hide();
alert(data.msg);
}, "json");
/*删除回复*/
$(".rightLi").on("click", '.del_comment_r', function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_comment_del/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parent().parent().parent().parent().parent().remove();
$(e.target).parents('.res_list').remove()
alert(data.msg);
//填充回复
function KeyP(v) {
var parentWrap = $(v).parents(".respond_box");
parentWrap.find(".res_area_r").val($.trim(parentWrap.find(".res_area").val()));
评论共有10条
这个可能翻,太神了,但我觉得,还是要有系统性的学习才行,暂时用一下还是可以
简单实用,谢谢楼主分享!
并不是对sql语句进行翻译,是一些sql的操作说明,不过整理的挺好的
VIP会员动态
CSDN下载频道资源及相关规则调整公告V11.10
下载频道用户反馈专区
下载频道积分规则调整V1710.18
spring mvc+mybatis+mysql+maven+bootstrap 整合实现增删查改简单实例.zip
资源所需积分/C币
当前拥有积分
当前拥有C币
输入下载码
为了良好体验,不建议使用迅雷下载
SQL语句英文翻译成中文
会员到期时间:
剩余下载个数:
剩余积分:0
为了良好体验,不建议使用迅雷下载
积分不足!
资源所需积分/C币
当前拥有积分
您可以选择
程序员的必选
绿色安全资源
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
您的积分不足,将扣除 10 C币
为了良好体验,不建议使用迅雷下载
无法举报自己的资源
你当前的下载分为234。
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可返还被扣除的积分
被举报人:
举报的资源分:
请选择类型
资源无法下载 ( 404页面、下载失败、资源本身问题)
资源无法使用 (文件损坏、内容缺失、题文不符)
侵犯版权资源 (侵犯公司或个人版权)
虚假资源 (恶意欺诈、刷分资源)
含色情、危害国家安全内容
含广告、木马病毒资源
*详细原因:
SQL语句英文翻译成中文Elasticsearch PHP MYSQL的同步使用有问题,上知乎。知乎作为中文互联网最大的知识分享平台,以「知识连接一切」为愿景,致力于构建一个人人都可以便捷接入的知识分享网络,让人们便捷地与世界分享知识、经验和见解,发现更大的世界。简介与用途Elasticsearch是一个分布式,RESTful模式的高速搜索引擎,它使用标准的RESTful APIs和JSON,同时提供支持如java,python,php等的多种语言。下文将Elasticsearch简称ES。一个简单的curl查询数据的示例如下:curl -XGET 'localhost:9200/sedoctorfeedback/feedback/_search?pretty&q=119'
ES使用诸如XPUT,XDELETE,XPOST,XGET等RESTful模式完成数据的增删改查操作。本例意思是找到sedoctorfeedback索引里type为feedback的数据,查询条件是119,这是全文搜索,fulltext。查询结果如下:{
"took" : 29,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
"hits" : {
"total" : 1,
"max_score" : 1.386767,
"hits" : [ {
"_index" : "sedoctorfeedback",
"_type" : "feedback",
"_id" : "119",
"_score" : 1.386767,
"_source" : {
"id" : 119,
"content" : "google地图无法正常显示",
"contacttype" : "QQ",
"contact" : "",
"questiontype" : 4,
"seversion" : "5.0.1.9",
"ieversion" : "6",
"osversion" : "win_xp_32",
"img" : 0,
"joindate" : "T00:00:00.000+08:00",
"addtime" : "T15:29:34.000+08:00",
"qid" : "",
"extension1" : "",
"extension2" : "",
"extension3" : ""
同样,可以使用php查询数据,若使用php语法代码如下:&?php
$params = array();
$params['hosts'] = array (
'127.0.0.1:9200',
// IP + Port
require 'vendor/autoload.php';
$client = new Elasticsearch\Client($params);
$params = array(
'index' =& 'sedoctorfeedback',
'type' =& 'feedback',
'id' =& 119,
$resp = $client-&get($params);
} catch (Exception $ex) {
$resp = $ex-&getMessage();
var_dump($resp);
执行php程序返回结果和上例相同。环境安装我们的目的是将mysql数据同步到ES,通过php查询ES。需要安装以下依赖jdk,jdk需要使用1.8版本,如果使用1.7版本会报错。ES安装,安装ES一定要注意ES的版本,笔者安装的是2.3.2版本安装php,php至少为5.3.9版本,否则无法使用ES,笔者安装的是5.6.3版本。php composer安装,并更改composer的镜像为国内Elasticsearch-jdbc安装,版本要和ES的版本对应。1 安装JDK先检查系统有没有jdk,一般centos会自带jdk,检查如下$ rpm -qa | grep jdk
java-1.7.0-openjdk-1.7.0.101-2.6.6.4.el6_8.x86_64
java-1.7.0-openjdk-devel-1.7.0.101-2.6.6.4.el6_8.x86_64
centos自带的是1.7版本的jdk,这个不能用,笔者就在这里栽了坑。这时需要先将系统自带的jdk删掉,如下rpm -e --nodeps java-1.7.0-openjdk-1.7.0.101-2.6.6.4.el6_8.x86_64
到() 选择jdk版本。在选择版本之前先看自己的linux是32位还是64位的,使用uname -a 查看系统版本。$ uname -a
Linux gz01v.brow.corp.qihoo.net 2.6.32-220.4.2.el6.x86_64 #1 SMP Tue Feb 14 04:00:16 GMT
x86_64 x86_64 GNU/Linux
可知笔者系统是64位的,因此选择了如下jdk 下载得到 jdk-8u121-linux-x64.rpm 安装包,将该文件放到/home/chenxiaolong 目录,并赋予可执行权限。使用rpm安装,命令及过程如下[root@gz03v /home/chenxiaolong]# rpm -ivh jdk-8u121-linux-x64.rpm
Preparing...
########################################### [100%]
1:jdk1.8.0_121
########################################### [100%]
Unpacking JAR files...
tools.jar...
plugin.jar...
javaws.jar...
deploy.jar...
jsse.jar...
charsets.jar...
localedata.jar...
[root@gz03v /home/chenxiaolong]# java -version
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)
[root@gz03v /home/chenxiaolong]# javac -version
javac 1.8.0_121
至此,已成功的安装了jdk 1.8版本。RPM安装会自动将java javac加入环境变量。2 安装ElasticsearchES的安装比较简单,首先到官网下载。笔者在()下载的是2.3.2版本,因为后面使用elasticsearch-jdbc也是要2.3.2版本。另外使用的php必须是5.3.9或以上版本,因为5.3.8及以下版本存在两个bug,致使php无法使用ES。详情见()。需要说明的是,不同的elasticsearch php api 需要对应的php版本。ES 5.0版本需要对应的php 5.6.6 及以上版本,ES 2.0 需要php 5.4.0 及以上版本,ES 1.0 需要php 5.3.9及以上版本。不同版本的ES,使用composer安装的依赖包版本也不同,需要与ES的版本对应在官网下载得到elasticsearch-2.3.2.tar.gz,将该文件包放到/home/chenxiaolong目录,解压文件[root@gz03v /home/chenxiaolong]# tar zxvf elasticsearch-2.3.2.tar.gz
elasticsearch-2.3.2/README.textile
elasticsearch-2.3.2/LICENSE.txt
elasticsearch-2.3.2/NOTICE.txt
elasticsearch-2.3.2/modules/
elasticsearch-2.3.2/modules/lang-groovy/
elasticsearch-2.3.2/modules/reindex/
elasticsearch-2.3.2/modules/lang-expression/
······此处省略······
解压后得到目录elasticsearch-2.3.2,cd到解压后的bin目录下,启动ES[root@gz03v /home/chenxiaolong]# cd elasticsearch-2.3.2/bin/
[root@gz03v /home/chenxiaolong/elasticsearch-2.3.2/bin]# ./elasticsearch
Exception in thread "main" java.lang.RuntimeException: don't run elasticsearch as root.
at org.elasticsearch.bootstrap.Bootstrap.initializeNatives(Bootstrap.java:93)
at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:144)
at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:270)
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:35)
Refer to the log for complete error details.
报错是因为ES不允许使用root账户使用,切换到chenxiaolong账户,启动ES。[root@gz03v /home/chenxiaolong/elasticsearch-2.3.2/bin]# su chenxiaolong
[chenxiaolong@gz03v ~/elasticsearch-2.3.2/bin]$ ./elasticsearch
log4j:ERROR setFile(null,true) call failed.
java.io.FileNotFoundException: /home/chenxiaolong/elasticsearch-2.3.2/logs/elasticsearch.log (权限不够)
出现以上错误是因为权限不够,切换到root账户,将目录的属主改成chenxiaolong,并赋予权限755,再切换回chenxiaolong。执行./elasticsearch-2.3.2/bin/elasticsearch 启动ES。[root@gz03v /home/chenxiaolong/elasticsearch-2.3.2]# cd ..
[root@gz03v /home/chenxiaolong]# ls
elasticsearch-2.3.2
elasticsearch-2.3.2.tar.gz
[root@gz03v /home/chenxiaolong]# cd elasticsearch-2.3.2/bin/
[root@gz03v /home/chenxiaolong/elasticsearch-2.3.2/bin]# cd ../../
[root@gz03v /home/chenxiaolong]# chown -R chenxiaolong.chenxiaolong elasticsearch-2.3.2
[root@gz03v /home/chenxiaolong]# chmod -R 755 elasticsearch-2.3.2
[root@gz03v /home/chenxiaolong]# su chenxiaolong
[chenxiaolong@gz03v ~]$ ./elasticsearch-2.3.2/bin/elasticsearch
[ 22:37:11,391][WARN ][bootstrap
] unable to install syscall filter: seccomp unavailable: requires kernel 3.5+ with CONFIG_SECCOMP and CONFIG_SECCOMP_FILTER compiled in
[ 22:37:11,712][INFO ][node
] [Erg] version[2.3.2], pid[20305], build[b9e4a6a/T16:03:47Z]
[ 22:37:11,712][INFO ][node
] [Erg] initializing ...
[ 22:37:12,866][INFO ][plugins
] [Erg] modules [reindex, lang-expression, lang-groovy], plugins [], sites []
[ 22:37:12,904][INFO ][env
] [Erg] using [1] data paths, mounts [[/ (/dev/xvde1)]], net usable_space [81.7gb], net total_space [98.4gb], spins? [no], types [ext2]
[ 22:37:12,905][INFO ][env
] [Erg] heap size [1007.3mb], compressed ordinary object pointers [true]
[ 22:37:12,905][WARN ][env
] [Erg] max file descriptors [32768] for elasticsearch process likely too low, consider increasing to at least [65536]
[ 22:37:16,197][INFO ][node
] [Erg] initialized
[ 22:37:16,197][INFO ][node
] [Erg] starting ...
[ 22:37:16,315][INFO ][transport
] [Erg] publish_address {127.0.0.1:9300}, bound_addresses {127.0.0.1:9300}
[ 22:37:16,321][INFO ][discovery
] [Erg] elasticsearch/VDpJE96fQ024S4cwk0UIPg
[ 22:37:19,374][INFO ][cluster.service
] [Erg] new_master {Erg}{VDpJE96fQ024S4cwk0UIPg}{127.0.0.1}{127.0.0.1:9300}, reason: zen-disco-join(elected_as_master, [0] joins received)
[ 22:37:19,430][INFO ][http
] [Erg] publish_address {127.0.0.1:9200}, bound_addresses {127.0.0.1:9200}
[ 22:37:19,430][INFO ][node
] [Erg] started
[ 22:37:19,434][INFO ][gateway
] [Erg] recovered [0] indices into cluster_state
出现如上情况表示启动成功,在此界面ES会一直运行,使用Ctrl+C可终止ES进程。如果要将ES作为一个后台进程运行,加参数 -d 即 ./elasticsearch-2.3.2/bin/elasticsearch可使用 curl '' 查看ES是否正确启动。[chenxiaolong@gz03v ~]$ curl 'http://localhost:9200/?pretty'
"name" : "She-Venom",
"cluster_name" : "elasticsearch",
"version" : {
"number" : "2.3.2",
"build_hash" : "b9e4a6acad8f6abed7f7dba346f94",
"build_timestamp" : "T16:03:47Z",
"build_snapshot" : false,
"lucene_version" : "5.5.0"
"tagline" : "You Know, for Search"
其中cluster_name是集群的名称,这里我们只在一台机器上安装了ES,集群名称可在/home/chenxiaolong/elasticsearch-2.3.2/config/elasticsearch.yml 配置,出现在配置文件的第17行。13 # ---------------------------------- Cluster -----------------------------------
15 # Use a descriptive name for your cluster:
17 # cluster.name: my-application
3 安装PHP要使用ES,php的版本必须大于等于5.3.9版本。PHP的安装在次不再赘述。下回追加上。ES 5.0版本需要对应的php 5.6.6 及以上版本,ES 2.0 需要php 5.4.0 及以上版本,ES 1.0 需要php 5.3.9及以上版本。4 安装php composerComposer 是 PHP5以上 的一个依赖管理工具。它允许你申明项目所依赖的代码库,它会在你的项目中为你安装他们。 官网() 。执行以下命令安装composer$ php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
$ php -r "if (hash_file('SHA384', 'composer-setup.php') === '55d6ead61b29c7bdee5cccfbbd9f21f65dccfb9f76ebae1fbbacf329e583e30') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
$ php composer-setup.php
$ php -r "unlink('composer-setup.php');"
This installer script will simply check some php.ini settings, warn you if they are set incorrectly, and then download the latest composer.phar in the current directory. The 4 lines above will, in order:Download the installer to the current directoryVerify the installer SHA-384 which you can also cross-check hereRun the installerRemove the installer如果看不懂,我来翻译下(相信你肯定能看懂),译文如下:上述脚本将会检查php.ini是否配置正确,然后在当前目录下载最新版的composer.phar,上面4行代码的执行顺序是在当前目录下载安装包SHA-384检验安装包执行安装命令删除安装包(此步骤可省略)这将会在当前目录下生成一个composer.phar文件。[chenxiaolong@gz02v /data/htdocs/chenxiaolong]$ php composer.phar
/ ____/___
/ __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
Composer version 1.3.2
安装成功的结果如上面所示。在当前目录下(你的项目在哪里就把composer.phar复制到哪里)新建一个composer.json文件,文件内容如下:{
"require":{
"elasticsearch/elasticsearch" : "~1.0"
"repositories": {
"packagist": {
"type": "composer",
"url": "https://packagist.phpcomposer.com"
require 里是需要加载的依赖包,url是下载依赖包的地址,这里的url填写的是国内镜像,因为国外的总是被墙。接下来在当前目录执行命令 php composer.phar install --no-dev 完成 ES php api的安装,执行完成会在当前目录下生一个vendor目录,vendor目录下有个autoload.php文件,在你自己写的代码中将autoload.php文件require进来即可。在vendor目录下还有其他一些目录。vendor 目录里文件如下:autoload.php composer elasticsearch guzzle monolog pimple psr symfony编写一个php脚本,代码内容如下:&?php
$params = array();
$params['hosts'] = array (
'127.0.0.1:9200',
// IP + Port
'localhost:9200',
// Domain + Port
'localhost',
// Just Domain
'http://localhost',
// SSL to localhost
require 'vendor/autoload.php';
$client = new Elasticsearch\Client($params);
$p = array(
'index' =& 'company',
'type' =& 'employee',
'id' =& 1,
'body' =& array(
'uid'=&11,
'name'=&'chenxiaolong',
'age'=&'23 years old'
$resp = $client-&index($p);
$params = array(
'index' =& 'company',
'type' =& 'employee',
'id' =& 1,
$resp = $client-&get($params);
} catch (Exception $ex) {
$resp = $ex-&getMessage();
var_dump($resp);
执行以上程序示例如下:[chenxiaolong@gz02v /data/htdocs/chenxiaolong]$ php es.php
array(6) {
["_index"]=&
string(7) "company"
["_type"]=&
string(8) "employee"
string(1) "1"
["_version"]=&
["found"]=&
bool(true)
["_source"]=&
array(3) {
["name"]=&
string(12) "chenxiaolong"
string(12) "23 years old"
至此,我们已成功的安装了ES-PHP。下一步就是如何将mysql数据同步到ES了。5 Elasticsearch-jdbc安装 将mysql数据同步到ESES-JDBC可到github () 查看,执行以下命令下载ES-JDBCwget [chenxiaolong@gz03v ~]$ wget http://xbib.org/repository/org/xbib/elasticsearch/importer/elasticsearch-jdbc/2.3.2.0/elasticsearch-jdbc-2.3.2.0-dist.zip
-- 23:37:14--
http://xbib.org/repository/org/xbib/elasticsearch/importer/elasticsearch-jdbc/2.3.2.0/elasticsearch-jdbc-2.3.2.0-dist.zip
正在解析主机 xbib.org... 176.28.49.27
正在连接 xbib.org|176.28.49.27|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:M) [application/zip]
正在保存至: “elasticsearch-jdbc-2.3.2.0-dist.zip”
下载对应版本,笔者安装的ES是2.3.2版本,故下载ES-JDBC也是2.3.2版本,一定要用对应版本的,否则你可能会遇到坑。这将会下载得到elasticsearch-jdbc-2.3.2.0-dist.zip,解压该文件到当前目录(/home/chenxiaolong)得到 elasticsearch-jdbc-2.3.2.0 。elasticsearch-jdbc-2.3.2.0目录下有两个子目录 lib 和 bin。编写shell脚本,将mysql数据同步到ES。脚本代码如下:#! /bin/sh
bin=/data/htdocs/chenxiaolong/elasticsearch-jdbc-2.3.2.0/bin
# ES-JDBC的目录
lib=/data/htdocs/chenxiaolong/elasticsearch-jdbc-2.3.2.0/lib
"type" : "jdbc",
"elasticsearch.autodiscover":true,
"elasticsearch.cluster":"my-application",
# 集群名称,在config/elasticsearch.yml配置
"client.transport.sniff":"true",
"sniffOnConnectionFault":"true",
"client.transport.ignore_cluster_name":"false",
"url":"jdbc:mysql://10.16.59.142:3306/sedoctorfeedback", #链接mysql,IP,PORT,DB,确保库名称为sedoctorfeedback
"user":"chenxiaolong",
"password":"chenxiaolong@browser",
"sql":"select *,id as _id from feedback order by _id", # sql语句
"elasticsearch" : {
"host" : "127.0.0.1",
# ES 所在IP,本机就写127.0.0.1即可
"port" : 9300
# 端口,9300不行的话就试试9200
"index" : "sedoctorfeedback", # 在ES中新的索引名称,自定义
"type" : "feedback"
# 在ES中新的type类型,自定义
}'| java \
-cp "${lib}/*" \
-Dlog4j.configurationFile=${bin}/log4j2.xml \
org.xbib.tools.Runner \
org.xbib.tools.JDBCImporter
保存以上文件为esmysql.sh,并执行,如果执行失败,或者ES里没有查询到同步过来的数据,可以查看日志$ tailf /data/htdocs/chenxiaolong/logs/jdbc.log
若出现以下这种错误,可能是脚本中elasticsearch.cluster填写错误,或者port端口错误,改成9200 ,9300试试][pool-3-thread-1] error while processing request: no cluster nodes available, check settings {autodiscover=true,
client.transport.ignore_cluster_name=false, client.transport.nodes_sampler_interval=5s,
client.transport.ping_timeout=5s, cluster.name=my-application, flush_interval=5s, host.0=127.0.0.1,
max_actions_per_request=10000, max_concurrent_requests=4, max_volume_per_request=10mb, name=importer, port=9200, sniff=false}
执行完毕,就将mysql表中数据同步到ES了,就可以用php查询ES获得数据结果了。php查询示例如本文开头述。或使用curl -XGET 'localhost:9200/sedoctorfeedback/feedback/_search?pretty&q=*'查看导入结果常见的坑安装JDK时候,执行java -version错误如下:$java -version
bash: /usr/local/jdk1.8.0_121//bin/java: cannot execute binary file
网上说这是因为操作系统的位数和JDK的位数不一致导致的,但是笔者都是64位的。网上的解释并不靠谱,这可能是因为你一开始下载的是JDK的tar.gz的包,将它解压到某个目录,然后配置/etc/profile导致的。这时候你用 whereis java 即可找到java命令所在,笔者的解决办法是rpm -e 删掉jdk的rpm包,再找到并删掉jdk的 tar.gz。重新从官网下载rpm,重新rpm -ivh 安装。只有如以下这样才算正确安装了jdk。RPM安装会自动将java javac加入环境变量。[root@gz02v ~]# whereis java
java: /usr/bin/java /etc/java /usr/lib/java /usr/share/java /usr/share/man/man1/java.1
[root@gz02v ~]# cd /usr/bin/
[root@gz02v /usr/bin]# ll | grep java
lrwxrwxrwx
1 root root
22 Feb 24 15:44 java -& /etc/alternatives/java
lrwxrwxrwx
1 root root
23 Feb 24 15:44 javac -& /etc/alternatives/javac
lrwxrwxrwx
1 root root
25 Feb 24 15:44 javadoc -& /etc/alternatives/javadoc
lrwxrwxrwx
1 root root
32 Feb 24 15:44 javafxpackager -& /etc/alternatives/javafxpackager
lrwxrwxrwx
1 root root
23 Feb 24 15:44 javah -& /etc/alternatives/javah
lrwxrwxrwx
1 root root
23 Feb 24 15:44 javap -& /etc/alternatives/javap
lrwxrwxrwx
1 root root
30 Feb 24 15:44 javapackager -& /etc/alternatives/javapackager
lrwxrwxrwx
1 root root
30 Feb 24 15:44 java-rmi.cgi -& /etc/alternatives/java-rmi.cgi
lrwxrwxrwx
1 root root
24 Feb 24 15:44 javaws -& /etc/alternatives/javaws
笔者当时遇到的问题就是lrwxrwxrwx 1 root root 22 Feb 24 15:44 java -& /etc/alternatives/javalrwxrwxrwx 1 root root 23 Feb 24 15:44 javac -& /etc/alternatives/javac这两个错误导致的cannot execute binary file使用ES-JDBC脚本导入数据时候,执行 curl -XGET 'localhost:9200/sedoctorfeedback/feedback/_search?pretty&q=*' 返回{
"error" : {
"root_cause" : [ {
"type" : "index_not_found_exception",
"reason" : "no such index",
"resource.type" : "index_or_alias",
"resource.id" : "sedoctorfeedback",
"index" : "sedoctorfeedback"
"type" : "index_not_found_exception",
"reason" : "no such index",
"resource.type" : "index_or_alias",
"resource.id" : "sedoctorfeedback",
"index" : "sedoctorfeedback"
"status" : 404
这可能是由于esmysql.sh中的端口或数据库或索引什么的配置有误4分享收藏文章被以下专栏收录plus技术社群由奇虎360公司软件工程师,《微信公众平台开发实战与应用案例》和《php7实践指南》图书作者陈小龙发起成立。社群成员由国内知名互联网公司技术人员组成,包括但不限于来自百度,阿里,腾讯,360,新浪,滴滴等公司一线技术人员。本专栏用于分享技术实践总结。

我要回帖

更多关于 mysql 语句生成 的文章

 

随机推荐