1、概述
1.1、什么是 ElasticSearch
ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。
1.2、主要术语
节点 node
它指的是Elasticsearch的单个正在运行的实例。单个物理和虚拟服务器容纳多个节点,这取决于其物理资源的能力,如RAM,存储和处理能力。
集群 cluster
它是一个或多个节点的集合。 集群为整个数据提供跨所有节点的集合索引和搜索功能。
碎片 shards
索引被水平细分为碎片。这意味着每个碎片包含文档的所有属性,但包含的数量比索引少。水平分隔使碎片成为一个独立的节点,可以存储在任何节点中。主碎片是索引的原始水平部分,然后这些主碎片被复制到副本碎片中。
副本 replicas
Elasticsearch允许用户创建其索引和分片的副本。 复制不仅有助于在故障情况下增加数据的可用性,而且还通过在这些副本中执行并行搜索操作来提高搜索的性能。
索引 index
它是不同类型的文档和文档属性的集合。索引还使用分片的概念来提高性能。
类型/映射 type
它是共享同一索引中存在的一组公共字段的文档的集合。
文档 document
它是以JSON格式定义的特定方式的字段集合。每个文档都属于一个类型并驻留在索引中。每个文档都与唯一标识符(称为UID)相关联。
1.3、ElasticSearch 与 MySQL 的相关术语比较
此目的,在于快速理解 ElasticSearch 的相关重要术语。这种对照仅做参考,并不十分严谨。
ElasticSearch | MySQL |
---|---|
索引 | 数据库 |
类型/映射 | 数据表 |
文档 | 记录(行) |
1.4、方向和目的
- 配置 docker 环境
- 文章的索引文档
- 分词器
- 集群
- 日志文件的索引文档
2、环境准备
2.1、lnmp 环境
这里使用已经制作好的 docker 镜像,该镜像集成了 mysql, php, nginx, swoole等。
镜像文档
https://hub.docker.com/r/zobeen/ubuntu16.04-lnmp/
2.2、ElasticSearch 环境
这里使用已经制作好的 docker 镜像,该镜像集成了 ElasticSearch 6.3.0 和 ik中文分词器插件。
镜像文档
https://hub.docker.com/r/zobeen/elastic-ik/
Dockerfile
FROM docker.elastic.co/elasticsearch/elasticsearch:6.3.0
MAINTAINER abin
WORKDIR /usr/share/elasticsearch
# 安装中文分词
RUN /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
# 设置系统时区
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN /bin/echo 'Asia/Shanghai' > /etc/timezone
2.3、docker-compose
为方便管理 lnmp 和 elastic-ik 两种容器,我们使用 docker-compose,下面是 docker-compose 脚本代码。
version: '1'
services:
lnmp:
image: zobeen/ubuntu16.04-lnmp:v1.0.0
networks:
- net-lnmp
ports:
- 8001-8008:8001-8008
volumes:
- e:/abin/wwwtest/vhost:/etc/nginx/sites-enabled
- e:/abin/wwwtest:/var/www/
elasticsearch:
image: zobeen/elastic-ik:6.3.0
networks:
- net-lnmp
ports:
- 9200:9200
- 9300:9300
environment:
- discovery.type=single-node
- http.host=0.0.0.0
- transport.host=0.0.0.0
networks:
net-lnmp:
external:
name: net-lnmp
2.4、创建 docker 网络
此目的是为让 lnmp 和 elastic-ik 两个容器能够方便的通信。
$ docker network create net-lnmp
2.5、启动环境
$ docker-compose up -d
然后,在浏览器中输入 http://127.0.0.1:9200
就可以看到 ElasticSearch 的运行信息了,如下所示:
Array
(
[name] => te-XHX7 // 当前节点名称
[cluster_name] => docker-cluster // 集群名称
[cluster_uuid] => trm37b0_SwaH_2oWr2A2DQ // 集群ID
[version] => Array // 版本信息
(
[number] => 6.3.0
[build_flavor] => default
[build_type] => tar
[build_hash] => 424e937
[build_date] => 2018-06-11T23:38:03.357887Z
[build_snapshot] =>
[lucene_version] => 7.3.1
[minimum_wire_compatibility_version] => 5.6.0
[minimum_index_compatibility_version] => 5.0.0
)
[tagline] => You Know, for Search
)
3、使用 PHP 进行 ElasticSearch 开发
3.1、引入 PHP 的第三方库
composer require elasticsearch/elasticsearch --no-dev
3.2、获取 ElasticSearch 运行信息
<?php
require_once './vendor/autoload.php';
use Elasticsearch\ClientBuilder;
// 最常见的配置是告诉客户端有关集群的信息:有多少个节点,节点的ip地址和端口号。如果没有指定主机名,客户端会连接 localhost:9200
// 利用 ClientBuilder 的 setHosts() 方法可以改变客户端的默认连接方式。 setHosts() 方法接收一个一维数组,数组里面每个值都代表集群里面的一个节点信息
// 只有通过 docker,才可以这样写,其中 elasticsearch 是 docker-compose.yml 中的容器名称
$hosts = [
'elasticsearch:9200',
];
// 实例化一个客户端
$client = ClientBuilder::create()->setHosts($hosts)->build();
// 一定要用 try-catch 块包裹哦,因为网络请求会有异常发生
try {
$response = $client->info();
print_r($response);
} catch (\Exception $e) {
echo 'error: ' . $e->getMessage();
}
以上如果请求成功,将会和在浏览器中输入 http://127.0.0.1:9200
看到的效果一样。
致此,我们便配置好了 ElasticSearch 的 PHP 开发环境。