警告:以下破解内容仅供个人学习使用,严禁商用!
Elasticsearch.md
安装Elasticsearch
需要安装官方新版Java,地址:www.java.com
可以从 elasticsearch.org/download 下载最新版本的 Elasticsearch ,解压即可。
安装jdk yum install java-1.8.0-openjdk* -y
Marvel
Marvel 是 Elasticsearch 的管理和监控工具,可在 Elasticsearch目录中运行以下命令来下载和安装 Marvel插件:./bin/plugin -i elasticsearch/marvel/latest
关闭Marvel:echo 'marvel.agent.enabled: false' >> ./config/elasticsearch.yml
查看Marvel:http:\/\/localhost:9200\/_plugin\/marvel\/
查看Sense:在Marvel中通过点击dashboards,在下拉菜单中访问Sense开发者控制台,或者直接访问以下地址:http:\/\/localhost:9200\/_plugin\/marvel\/sense\/
运行Elasticsearch
命令:./bin/elasticsearch
启动后,如果只有本地可以访问,尝试修改配置文件 elasticsearch.yml 中network.host(注意配置文件格式不是以#开头的要空一格, :后要空一格) 为network.host: 0.0.0.0
如果想在后台以守护进程模式运行,添加-d参数。
测试:curl 'http://localhost:9200/?pretty'
会出现以下返回信息:
{
"name" : "iHwDofo",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "gj7nu-kQQbGP40BV5Kp1Zw",
"version" : {
"number" : "6.0.0",
"build_hash" : "8f0685b",
"build_date" : "2017-11-10T18:41:22.859Z",
"build_snapshot" : false,
"lucene_version" : "7.0.1",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
说明ELasticsearch集群已经启动并且正常运行.
节点(node)是一个运行着的 Elasticsearch 实例。
集群(cluster)是一组具有相同cluster.name的节点集合,他们协同工作,共享数据并提供故障转移和扩展功能,一个节点也可以组成一个集群。
关闭 Elasticsearch:ctrl + c 或者 curl -XPOST 'http://localhost:9200/_shutdown'
API
JavaAPI
Elasticsearch 为Java用户提供了两种内置客户端
节点客户端(node client):
节点客户端以无数据节点(none data node)身份加入集群,它自己不存储任何数据,但是它知道数据在集群中的具体位置,并且能够直接转发请求到对应的节点上。
传输客户端(Transport client):
这个更轻量的传输客户端能够发送请求到远程集群。它自己不加入集群,只是简单转发请求给集群中的节点。
两个Java客户端都通过9300端口与集群交互,使用Elasticsearch传输协议(Elasticsearch Transport Protocol)。集群中的节点之间也通过9300端口进行通信。如果此端口未开放,你的节点将不能组成集群。
基于HTTP协议,以JSON为数据交互格式的RESTful API
其他所有程序语言都可以使用RESTful API,通过9200端口的与Elasticsearch进行通信。
请求模板:
curl -X '://:/?' -d ''
VERB HTTP方法:GET, POST, PUT, HEAD, DELETE
PROTOCOL http或者https协议(只有在Elasticsearch前面有https代理的时候可用)
HOST Elasticsearch集群中的任何一个节点的主机名,如果是在本地的节点,那么就叫localhost
PORT Elasticsearch HTTP服务所在的端口,默认为9200
PATH API路径(例如_count将返回集群中文档的数量),PATH可以包含多个组件,例如_cluster/stats或者_nodes/stats/jvm
QUERY_STRING 一些可选的查询请求参数,例如?pretty参数将使请求返回更加美观易读的JSON数据
BODY 一个JSON格式的请求主体(如果请求需要的话)
例如:curl -XGET 'http://localhost:9200/_count?pretty' -d '
{
"query": {
"match_all": {}
}
}'
默认是不显示请求头,如果要显示,使用curl命令后跟-i参数:
curl -i -XGET 'localhost:9200/'
基本概念
索引
在Elasticsearch中存储数据的行为就叫做索引(indexing)。
Elasticsearch集群可以包含多个索引(indices)(数据库),每一个索引可以包含多个类型(types)(表),每一个类型包含多个文档(documents)(行),然后每个文档包含多个字段(Fields)(列)。
添加索引:
curl -XPUT 'localhost:9200/customer/external/1?pretty' -H 'Content-Type: application/json' -d '
{
"name": "Jimmy Yankee"
}
检索
curl -XGET 'http://localhost:9200/megacorp/employee/1?pretty'
检索 megacorp 索引的 empoyee 类型的 1 号
检索全部(默认情况下会返回前十个结果):
curl -XGET 'http://localhost:9200/megacorp/employee/_search?pretty'
查询字符串:
curl -XGET 'http://localhost:9200/megacorp/employee/_search?q=first_name:Jack'
使用_search关键字,将查询语句传给参数 q=
DSL查询
以JSON请求体的形式发起查询
curl -XGET 'http://localhost:9200/megacorp/employee/_search?pretty' -d '
{
"query":{
"match":{
"first_name":"Jack"
}
}
}'
添加过滤器查询
如:查询大于三十岁叫Jack的员工
curl -XGET 'http:localhost:9200/megacorp/employee/_search' -d '
{
"query":{
"filtered":{
"filter":{
"range":{
"age"{"gt":30} <1>
}
},
"query":{
"match":{
"first_name":"Jack"<2>
}
}
}
}
}'
<1>属于区间过滤器,用于查找所有年龄大于30岁的数据,gt为 "greater than" 的缩写。
<2>match 语句
全文搜索(模糊匹配)
搜索喜欢rock climbing 的员工
curl -XGET 'http://localhost:9200/megacorp/employee/_search' -d '
{
"query":{
"match":{
"about":"rock climbing"
}
}
}'
Elasticsearch 根据结果相关性评分来对结果进行排序(文档与查询条件的匹配程度)
短语搜索
匹配确切的若干个单词或短语
即将 match 查询变为 match_phrase 查询即可。
curl -XGET 'http://localhost:9200/megacorp/employee/_search' -d '
{
"query":{
"match_phrase":{
"about":"rock climbing"
}
}
}'
高亮搜索
从搜索结果中高亮匹配到的关键字,即在语句上增加 highlight 参数:
curl -XGET 'http://localhost:9200/megacorp/employee/_search' -d '
{
"query":{
"match_phrase":{
"about":"rock climbing"
}
},
"highlight":{
"fields":{
"about":{}
}
}
}'
返回结果中会有新的部分叫做 highlight,包含了来自 about字段中的文本,并且用来标识匹配到的单词。
聚合(aggregations)
是实时从匹配查询语句的文档中动态计算生成的。
简单例子:找到所有职员中最大的共同爱好
curl -XGET 'http://localhost:9200/megacorp/employee/_search' -d '
{
"aggs":{
"all_interests":{
"terms":{"field":"interests"}
}
}
}'
查询叫Jack的人最大的共同爱好
curl -XGET 'http://localhost:9200/megacorp/employee/_search' -d '
{
"query":{
"match":{
"first_name":"Jack"
}
},
"aggs"{
"all_interests":{
"terms":{
"field":"interests"
}
}
}
}'
分级汇总:如查询每种兴趣下职员的平均年龄
curl -XGET 'http://localhost:9200/megacorp/employee/_search' -d '
{
"aggs"{
"all_interests":{
"terms":{
"fiels":"interests"
},
"aggs"{
"avg_age":{
"avg":{
"field":"age"
}
}
}
}
}
}'
集群
集群健康
输入 curl -XGET 'http://localhost:9200/_cluster/health' 即可查看集群健康状态
返回结果中status 提供一个综合指标来表示集群的服务状态
green:所有的主要分片和复制分片都可用
yellow:所有主要分片可用,但不是所有复制分片都可用
red:不是所有的主要分片都可用
添加索引
分片是Elasticsearch在集群中分发数据的关键。把分片想象成数据的容器。
文档存储在分片中,然后分片分配到你集群中的节点上。当你的集群扩容或缩小,Elasticsearch将会自动在你的节点间迁移分片,以使集群保持平衡。
分片可以是主分片(primary shard)或者是复制分片(replica shard)。
你索引中的每个文档属于一个单独的主分片,所以主分片的数量决定了索引最多能存储多少数据。
创建 blog 索引,设置分配3个主分片和一个复制分片(默认一个索引会被分配5个主分片)
curl -XPUT 'http://localhost:9200/blogs' -H'Content-Type:application/json' -d '
{
"settings" : {
"number_of_shards" : 3,
"number_of_replicas" : 1
}
}'
检查文档是否存在
curl -i -XHEAD 'http://localhost:9200/_index/_type/_id'
存在会返回 200 OK,不存在会返回 404 NOT Found
更新文档
使用 XPUT 方法即可
curl -XPUT 'http://localhost:9200/_index/_type/_id' -H 'Content-Type:application/json' -d '
{
"title":"the new title",
"text":"the new text",
"date":"2018/11/28"
}'
更新后可以看到 _version 字段增加了,created 标识为 false
创建新文档
最简单的是使用 POST 方法让Elasticsearch自动生成 _id
curl -XPOST 'http://localhost:9200/_index/_type' -d '{ ... }'
或者使用op_type 查询参数:
curl -XPUT 'http://localhost:9200/_index/_type/_id?op_type' -d '{}'
或者在url后面加 /_create:
curl -XPUT 'http://localhost:9200/_index/_type/_id/_create' -d '{}'
若请求成功创建了一个新文档,将返回正常的元数据且相应状态码是 201 Created
否则返回 409 Conflict
删除文档
curl -XDELETE 'http://localhost:9200/_index/_type/_id'
如果找到该文档,则返回200 OK _version 会增加
否则返回 404 Not Found
版本控制
只希望文档的_version是1时更新才生效
curl -XPUT 'http://localhost:9200/_index/_type/_id?version=1' -d '{}'
当_version =2 时会发生 409 Conflict 状态
外部版本号:它检查是否小于指定的版本,如果请求成功,外部版本号就会被存储到 _version 中。
如创建一个包含外部版本号5的新博客
curl -XPUT 'http://localhost:9200/_index/_type/_id?version=5&version_type=external' -d '{}'
更新这个文档
curl -XPUT 'http://localhost:9200/_index/_type/_id?version=10&version_type=external' -d '{}'
当外部版本号不小于版本号时会报 409 Conflict
局部更新
最简单的update请求表单接受一个局部文档参数doc,它会合并到现有文档中——对象合并在一起,存在的标量字段被覆盖,新字段被添加。
如为对象添加一个tags 字段和一个views字段
curl -XPOST 'http://localhost:9200/_index/_type/_id/_update' -d '
{
"doc":{
"tags":["testing"],
"views":0
}
}'
用脚本增加views数量:
curl -XPOST 'http://localhost:9200/_index/_type/_id/_update' id '
{
"script":"ctx._source.views+=1"
}'
使用脚本增加新标签到 tags 数组中
curl -XPOST 'http://localhost:9200/_index/_type/_id/_update' -d '
{
"scripe":"ctx._source.tags+=new_tag",
"params":{
"new_tag":"search"
}
}'
根据内容删除文档
curl -XPOST 'http://localhost:9200/_index/_type/_id/_update' -d '
{
"script":"ctx.op = ctx._source.views == count ? 'delete' : 'none'",
"params":{
"count":1
}
}'
更新可能不存在的文档(upsert)
curl -XPOST 'http://localhost:9200/_index/_type/_id/_update' -d '
{
"script":"ctx._source.views+=1",
"upsert":{
"views":1
}
}'
更新时发生冲突,需要重新尝试(retry_on_conflict参数设置重试次数):
curl -XPOST 'http://localhost:9200/_index/_type/_id/_update?retry_on_conflict=5' -d '
{
"script":"ctx._source.views+=1",
"upsert":{
"views":1
}
}'
检索多个文档
使用mget API.mget 参数是一个 docs 数组,数组的每个节点定义一个文档的_index _type _id 元数据,如果你只想检索一个或几个确定的字段,也可以定义一个 _source 参数:
curl -XPOST 'http://localhost:9200/_mget' -d '
{
"docs" : [
{
"_index" : "website",
"_type" : "blog",
"_id" : 2
},
{
"_index" : "website",
"_type" : "pageviews",
"_id" : 1,
"_source": "views"
}
]
}'
如果所有文档具有相同的 _index 和 _type ,就可以通过简单的 ids 数组来代替完整的 docs 数组:
curl -XPOST 'http://localhost:9200/_index/_type/_mget' -d '
{
"ids":["2","1"]
}'
杂项
下载地址
https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.3.2.tar.gz
https://artifacts.elastic.co/downloads/kibana/kibana-6.3.2-linux-x86_64.tar.gz
配置相关
设置打开文件描述符
vim /etc/security/limits.conf
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096
* soft memlock unlimited
* hard memlock unlimited
配置内核参数
vim /usr/lib/sysctl.d/50-default.conf
vm.max_map_count=362144
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
sysctl -p #此命令可能不生效,可以重启使配置生效
创建elastic用户用来启动elasticsearch
[root@es-node1 ~]# useradd elastic
[root@es-node1 ~]# echo "123456" |passwd --stdin elastic
[root@es-node1 ~]# mkdir -pv /Data/es/
mkdir: 已创建目录 "/Data"
mkdir: 已创建目录 "/Data/es/"
[root@es-node1 ~]# chown -R elastic:elastic /Data/es/
[root@es-node1 ~]# chown -R elastic:elastic /usr/local/elasticsearch-6.3.2/
#退出,重新登录(可以的话最好重启服务器,发现有些参数不重启不生效)
[root@es-node1 config]# exit
#切换用户并启动服务
[root@es-node1 ~]# su - elastic
[elastic@es-node1 ~]$ cd /usr/local/elasticsearch
[elastic@es-node1 elasticsearch]$ nohup ./bin/elasticsearch > /tmp/elastic.log & #或者添加 -d/--daemonize 参数后台运行,日志文件在path.logs指定的目录下
[1] 2426
[elastic@es-node1 elasticsearch]$ nohup: 忽略输入重定向错误到标准输出端
[elastic@es-node1 elasticsearch]$ tailf /tmp/elastic.log
安装配置kibana
[root@kb-node1 ~]# tar xf kibana-6.3.2-linux-x86_64.tar.gz -C /usr/local/
[root@kb-node1 ~]# cd /usr/local/
[root@kb-node1 local]# ln -sv kibana-6.3.2-linux-x86_64/ kibana
"kibana" -> "kibana-6.3.2-linux-x86_64/"
[root@kb-node1 local]# cd kibana
[root@kb-node1 kibana]# vim config/kibana.yml
[root@kb-node1 kibana]# grep "^[a-z]" config/kibana.yml
server.port: 5601 #监听的端口
server.host: "192.168.1.110" #监听的地址
elasticsearch.url: "http://192.168.1.107:9200" #elasticsearch访问的URL地址
[root@kb-node1 kibana]# ./bin/kibana & #启动服务
x-pack破解
留备份
elasticsearch-6.3.0\modules\x-pack\x-pack-core目录下找到x-pack-core-6.3.0.jar,复制一份出来留个备份
创建破解文件
package org.elasticsearch.license;
import java.nio.*;
import org.elasticsearch.common.bytes.*;
import java.util.*;
import java.security.*;
import org.elasticsearch.common.xcontent.*;
import org.apache.lucene.util.*;
import org.elasticsearch.core.internal.io.*;
import java.io.*;
public class LicenseVerifier
{
public static boolean verifyLicense(final License license, final byte[] encryptedPublicKeyData) {
return true;
}
public static boolean verifyLicense(final License license) {
return true;
}
}
package org.elasticsearch.xpack.core;
import org.elasticsearch.common.io.*;
import java.net.*;
import org.elasticsearch.common.*;
import java.nio.file.*;
import java.io.*;
import java.util.jar.*;
public class XPackBuild
{
public static final XPackBuild CURRENT;
private String shortHash;
private String date;
@SuppressForbidden(reason = "looks up path of xpack.jar directly")
static Path getElasticsearchCodebase() {
final URL url = XPackBuild.class.getProtectionDomain().getCodeSource().getLocation();
try {
return PathUtils.get(url.toURI());
}
catch (URISyntaxException bogus) {
throw new RuntimeException(bogus);
}
}
XPackBuild(final String shortHash, final String date) {
this.shortHash = shortHash;
this.date = date;
}
public String shortHash() {
return this.shortHash;
}
public String date() {
return this.date;
}
static {
final Path path = getElasticsearchCodebase();
String shortHash = null;
String date = null;
Label_0157: {
shortHash = "Unknown";
date = "Unknown";
}
CURRENT = new XPackBuild(shortHash, date);
}
}
编译破解文件
mkdir org/elasticsearch/license/
mv LicenseVerifier.class org/elasticsearch/license/LicenseVerifier.class
jar uvf x-pack-core-6.3.0.jar org/elasticsearch/license/LicenseVerifier.class
mkdir org/elasticsearch/xpack/core/
mv LicenseVerifier.class org/elasticsearch/xpack/core/XPackBuild.class
jar uvf x-pack-core-6.3.0.jar org/elasticsearch/xpack/core/XPackBuild.class
获取license证书
1. https://license.elastic.co/registration 填些用户名,邮箱(重要,获取下载链接),Country选择China,其他信息随意填写
2. 打开邮箱获取的地址,将下载后的文件改名为license.json
3. 修改文件中的内容,将两个属性改为
将 "type":"basic" 替换为 "type":"platinum" # 基础版变更为铂金版
将 "expiry_date_in_millis":1561420799999替换为 "expiry_date_in_millis":3107746200000 # 1年变为50年
4. 使用curl替换 license(license.json指的是刚刚下载修改属性后的证书,要开启elasticsearch服务)
curl -H "Content-Type: application/json" -XPUT 'http://192.168.7.245:9200/_xpack/license?acknowledge=true' -d @license.json
5. 若失败,修改配置文件
xpack.security.enabled: false
破解成功后改回来
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
6. 上传后查看证书时间
curl -XGET http://192.168.7.245:9200/_license
配置SSL并启用z-pack
创建证书
[elastic@es-node1 elasticsearch]$ cd /usr/local/elasticsearch/bin/
[elastic@es-node1 bin]$ ./elasticsearch-certgen
解压证书
[elastic@es-node1 bin]$ mkdir /tmp/cert
[elastic@es-node1 bin]$ mv cert.zip /tmp/cert/
[elastic@es-node1 bin]$ cd /tmp/cert/
[elastic@es-node1 cert]$ unzip cert.zip
Archive: cert.zip
creating: ca/
inflating: ca/ca.crt
inflating: ca/ca.key
creating: elasticsearch/
inflating: elasticsearch/elasticsearch.crt
inflating: elasticsearch/elasticsearch.key
[elastic@es-node1 cert]$ ll
总用量 8
drwxrwxr-x 2 elastic elastic 34 9月 20 13:47 ca
-rw------- 1 elastic elastic 5157 9月 20 13:47 cert.zip
drwxrwxr-x 2 elastic elastic 56 9月 20 13:47 elasticsearch
[elastic@es-node1 cert]$ mv ca/* /usr/local/elasticsearch/config/
[elastic@es-node1 cert]$ mv elasticsearch/* /usr/local/elasticsearch/config/
[elastic@es-node1 cert]$ cd /usr/local/elasticsearch/config/
[elastic@es-node1 config]$ ll -rct #最后四个
总用量 48
-rw-rw---- 1 elastic elastic 0 9月 19 16:15 users_roles
-rw-rw---- 1 elastic elastic 0 9月 19 16:15 users
-rw-rw---- 1 elastic elastic 197 9月 19 16:15 roles.yml
-rw-rw---- 1 elastic elastic 473 9月 19 16:15 role_mapping.yml
-rw-rw---- 1 elastic elastic 6380 9月 19 16:15 log4j2.properties
-rw-rw---- 1 elastic elastic 2942 9月 19 16:15 jvm.options
-rw-r----- 1 elastic elastic 2853 9月 19 16:15 elasticsearch.yml-bak
-rw-rw---- 1 elastic elastic 207 9月 19 16:20 elasticsearch.keystore
-rw-rw---- 1 elastic elastic 2905 9月 20 13:27 elasticsearch.yml
-rw-rw-r-- 1 elastic elastic 1671 9月 20 13:57 ca.key
-rw-rw-r-- 1 elastic elastic 1200 9月 20 13:57 ca.crt
-rw-rw-r-- 1 elastic elastic 1675 9月 20 13:57 elasticsearch.key
-rw-rw-r-- 1 elastic elastic 1237 9月 20 13:57 elasticsearch.crt
将证书拷贝到其他节点的config目录下
[elastic@es-node1 config]$ scp *.crt *.key 192.168.1.108:/usr/local/elasticsearch/config/
[elastic@es-node1 config]$ scp *.crt *.key 192.168.1.109:/usr/local/elasticsearch/config/
配置SSL
[elastic@es-node1 config]$ vim elasticsearch.yml
[elastic@es-node1 config]$ tail elasticsearch.yml
# ---------------------------------- Various -----------------------------------
#
# Require explicit names when deleting indices:
#
#action.destructive_requires_name: true
xpack.security.enabled: true #之前配置为false注意删除或者修改
xpack.security.transport.ssl.enabled: true
xpack.ssl.key: elasticsearch.key
xpack.ssl.certificate: elasticsearch.crt
xpack.ssl.certificate_authorities: ca.crt
创建集群相关用户
[elastic@es-node1 bin]$ ./elasticsearch-setup-passwords -h #查看命令帮助
Sets the passwords for reserved users
Commands
--------
auto - Uses randomly generated passwords #主要命令选项,表示系统将使用随机字符串设置密码
interactive - Uses passwords entered by a user #主要命令选项,表示使用用户输入的字符串作为密码
Non-option arguments:
command
Option Description
------ -----------
-h, --help show help
-s, --silent show minimal output
-v, --verbose show verbose output
[elastic@es-node1 bin]$ ./elasticsearch-setup-passwords auto #为了演示效果,这里我们使用系统自动创建
Initiating the setup of passwords for reserved users elastic,kibana,logstash_system,beats_system.
The passwords will be randomly generated and printed to the console.
Please confirm that you would like to continue [y/N]y #选择y
Changed password for user kibana #kibana角色和密码
PASSWORD kibana = 4VXPRYIVibyAbjugK6Ok
Changed password for user logstash_system #logstash角色和密码
PASSWORD logstash_system = 2m4uVdSzDzpt9OEmNin5
Changed password for user beats_system #beast角色和密码
PASSWORD beats_system = O8VOzAaD3fO6bstCGDyQ
Changed password for user elastic #elasticsearch角色和密码
PASSWORD elastic = 1TWVMeN8tiBy917thUxq
配置kibana,添加elasticsearch用户认证
[root@kb-node1 ~]# vim /usr/local/kibana/config/kibana.yml
[root@kb-node1 ~]# grep "^elastic" /usr/local/kibana/config/kibana.yml
elasticsearch.url: "http://192.168.1.107:9200"
elasticsearch.username: "elastic"
elasticsearch.password: "1TWVMeN8tiBy917thUxq" #就是上一步创建的elastic的账号和密码