简介
Elasticsearch 是一个开源的搜索引擎,建立在一个全文搜索引擎库 Apache Lucene™ 基础之上。 Lucene 可以说是当下最先进、高性能、全功能的搜索引擎库–无论是开源还是私有。
但是 Lucene 仅仅只是一个库。为了充分发挥其功能,你需要使用 Java 并将 Lucene 直接集成到应用程序中。 更糟糕的是,您可能需要获得信息检索学位才能了解其工作原理。Lucene 非常 复杂。
Elasticsearch 也是使用 Java 编写的,它的内部使用 Lucene 做索引与搜索,但是它的目的是使全文检索变得简单, 通过隐藏 Lucene 的复杂性,取而代之的提供一套简单一致的 RESTful API。
然而,Elasticsearch 不仅仅是 Lucene,并且也不仅仅只是一个全文搜索引擎。 它可以被下面这样准确的形容:
- 一个分布式的实时文档存储,每个字段 可以被索引与搜索
- 一个分布式实时分析搜索引擎
- 能胜任上百个服务节点的扩展,并支持 PB 级别的结构化或者非结构化数据
Elasticsearch 将所有的功能打包成一个单独的服务,这样你可以通过程序与它提供的简单的 RESTful API 进行通信, 可以使用自己喜欢的编程语言充当 web 客户端,甚至可以使用命令行(去充当这个客户端)。
就 Elasticsearch 而言,起步很简单。对于初学者来说,它预设了一些适当的默认值,并隐藏了复杂的搜索理论知识。 它 开箱即用 。只需最少的理解,你很快就能具有生产力。
随着你知识的积累,你可以利用 Elasticsearch 更多的高级特性,它的整个引擎是可配置并且灵活的。 从众多高级特性中,挑选恰当去修饰的 Elasticsearch,使它能解决你本地遇到的问题。
安装Elasticsearch
安装 Elasticsearch 之前,你需要先安装一个较新的版本的 Java,最好的选择是,你可以从 www.java.com 获得官方提供的最新版本的 Java。之后,你可以从 elastic 的官网 elastic.co/downloads/elasticsearch 获取最新版本的 Elasticsearch。
- 第一步:安装Java
[root@VM_140_90_centos data]# yum install -y java; java -version
- 第二步:安装GPG key
[root@VM_140_90_centos data]# rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch
- 第三步:安装Elasticsearch
[root@VM_140_90_centos data]# rpm -ivh https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.3.0.rpm
- 第四步:修改配置文件
[root@VM_140_90_centos data]# cat >/etc/elasticsearch/elasticsearch.yml<<EOF
cluster.name: elk-cluter
node.name: linux-node1
path.data: /data/elasticsearch
path.logs: /var/log/elasticsearch/
bootstrap.mlockall: true
network.host: 0.0.0.0 # 生产环境尽量不要这样配
http.port: 9200
EOF
- 第五步:授权目录
[root@VM_140_90_centos data]# chown -R elasticsearch.elasticsearch /data/elasticsearch
- 第六步:启动
[root@VM_140_90_centos data]# /etc/init.d/elasticsearch start
Starting elasticsearch (via systemctl): [ OK ]
- 第七步:查看运行状态
[root@VM_140_90_centos data]# systemctl status elasticsearch
或
curl 'http://localhost:9200/?pretty'
- 第八步:安装中文分词
/usr/share/elasticsearch/bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.3.0/elasticsearch-analysis-ik-6.3.0.zip
ES默认的分词器为standard,想要改变默认分词器为ik分词器,可以在config/elasticsearch.yml文件中添加如下配置即可:
index.analysis.analyzer.default.type:ik
好,到此Elasticsearch就安装成功啦
开始操作Elasticsearch
以下操用postman来完成 初学者不建议用图形界面
- 请求参数介绍
curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'
参数 | 解释 |
---|---|
VERB | 请求方式:GET, POST, PUT, HEAD, DELETE |
PROTOCOL | http或者https协议 |
HOST | Elasticsearch集群中的任何一个节点的主机名 |
PORT | 端口(默认:9200) |
PATH | API路径 |
QUERY_STRING | 一些可选的查询请求参数 |
BODY | 一个JSON格式的请求主体 |
索引
- 创建索引
PUT http://47.94.202.140:9200/chzhao
解释:用PUT
请求方式向http://47.94.202.140:9200
服务器创建一个名为chzhao的索引
返回数据:
{
"acknowledged": true,
"shards_acknowledged": true,
"index": "chzhao"
}
实例:
注:索引在添加数据的时候是可以自动创建的。如果你想禁止自动创建索引,你 可以通过在config/elasticsearch.yml
的每个节点下添加下面的配置:
action.auto_create_index: false
我们会在之后讨论你怎么用 索引模板 来预配置开启自动创建索引。这在索引日志数据的时候尤其有用:你将日志数据索引在一个以日期结尾命名的索引上,子夜时分,一个预配置的新索引将会自动进行创建。
- 删除索引
DELETE http://47.94.202.140:9200/chzhao
解释:用DELETE
请求方式向http://47.94.202.140:9200
服务器删除一个名为chzhao的索引
返回数据:
{
"acknowledged": true
}
实例:
你也可以这样删除多个索引
DELETE /index_one,index_two
DELETE /index_*
也可以删除所有索引
DELETE /_all
DELETE /*
对一些人来说,能够用单个命令来删除所有数据可能会导致可怕的后果。如果你想要避免意外的大量删除, 你可以在你的 elasticsearch.yml 做如下配置:
action.destructive_requires_name: true
这个设置使删除只限于特定名称指向的数据, 而不允许通过指定 _all 或通配符来删除指定索引库。
索引设置
Elasticsearch 提供了优化好的默认配置。 除非你理解这些配置的作用并且知道为什么要去修改,否则不要随意修改。
下面是两个 最重要的设置:
- number_of_shards
每个索引的主分片数,默认值是 5 。这个配置在索引创建后不能修改。 - number_of_replicas
每个主分片的副本数,默认值是 1 。对于活动的索引库,这个配置可随时修改。
我们来操作修改一下:
我们来尝试修改一下副分片:
- number_of_shards
好!索引暂时说到这里。
文档(表)基本操作
程序中大多的实体或对象能够被序列化为包含键值对的JSON对象,键(key)是字段(field)或属性(property)的名字,值(value)可以是字符串、数字、布尔类型、另一个对象、值数组或者其他特殊类型,比如表示日期的字符串或者表示地理位置的对象。
- 文档元数据
节点 | 解释 |
---|---|
_index | 索引 |
_type | 文档 |
_id | 文档ID |
- 创建文档
URL:PUT http://47.94.202.140:9200/chzhao/
数据:
{
"mappings":{
"person":{
"properties":{
"name":{
"type":"text", // 类型
"analyzer":"ik_max_word", // 指定分词器
"search_analyzer":"ik_max_word" //设置搜索时的分词器,默认跟ananlyzer是一致的,比如index时用standard+ngram,搜索时用standard用来完成自动提示功能 },
"desc":{
"type":"text",
"analyzer":"ik_max_word",
"search_analyzer":"ik_max_word" }
}
}
}
}
解释:我们这里创建了一个person的新文档,里面有两个字段,分别是:name(text类型),desc(text类型)
实例:
- 添加数据
URL:PUT http://47.94.202.140:9200/chzhao/person/1
数据:
{
"name":"张三",
"desc":"PHP工程师"
}
解释:添加一条数据
如果你仔细看,会发现请求路径是/chzhao/person/1,最后的1是该条记录的 Id。它不一定是数字,任意字符串(比如abc)都可以。
实例:
新增记录的时候,也可以不指定 Id,这时要改成 POST 请求。
实例:
注意,如果没有先创建 Index(这个例子是chzhao),直接执行上面的命令,Elastic 也不会报错,而是直接生成指定的 Index。所以,打字的时候要小心,不要写错 Index 的名称。
查看文档(这里只做简要查询,干货还在后面额)
向/Index/Type/Id
发出GET
请求,就可以查看这条记录。
返回的数据中,found字段表示查询成功,_source字段返回原始记录。
实例:
删除文档
删除记录就是将查询的请求换成DELETE
请求。自己测试一下更新文档
更新记录就是使用 PUT 请求,重新发送一次数据。
数据查询操作
返回所有记录
使用 GET 方法,直接请求/Index/Type/_search,就会返回所有记录。
实例:
上面代码中,返回结果的 took字段表示该操作的耗时(单位为毫秒),timed_out字段表示是否超时,hits字段表示命中的记录,里面子字段的含义如下。- total:返回记录数,本例是2条。
- max_score:最高的匹配程度,本例是1.0。
- hits:返回的记录组成的数组。
返回的记录中,每条记录都有一个_score字段,表示匹配的程序,默认是按照这个字段降序排列。
- 全文搜索(条件查询)
1、查询字符串搜索非常适用于通过命令行做即席查询。例如,查询在person
类型中desc
字段包含运维
单词的所有文档:
2、这个简单搜索返回包含 person 的所有文档: