首先安装es,安装es很简单直接下载解压然后./bin/elasticsearch即可运行,es的配置文件是config/elasticsearch.yml,然后安装elasticsearch header 这是一个es集群的前端界面,非常方便使用,配置文件是Gruntfile.js,可以修改es header 的端口,如果es默认端口9200修改了的话,还要去_size/app.js修改一下监听的es端口与es端口保持一致,大概在4000多行,可以直接搜索9200就找到了。
如果现在运行可以看到页面,但是会显示集群未连接,这是因为跨域了,在es中修改一下跨域的配置,我的配置是:
1 2 3 4 5 6 7 8 9 10 |
xpack.ml.enabled: false network.host: 0.0.0.0 http.port: 8301 #memory bootstrap.memory_lock: false bootstrap.system_call_filter: false http.cors.enabled: true http.cors.allow-origin: "*" |
运行es header
1 |
npm run start |
这样可视化界面就起来了,在这里可以创建索引和进行基本的查询。
搭建es分布式系统
分布式需要用到多台机器,这里演示的是一台部署多个es在配置文件中添加上集群名
1 2 3 |
cluster.name: bing_cluster node.name: bing_node_1 node.master: true |
所有相同的集群名的节点会自动组成一个集群,这里的集群名是bing_cluster,当前节点名是bing_node_1,设置当前的节点是主节点master
接下来设置多个节点,新建两个文件夹,把es的源码放进来
第二个节点的配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
xpack.ml.enabled: false network.host: 0.0.0.0 http.port: 8380 #memory bootstrap.memory_lock: false bootstrap.system_call_filter: false http.cors.enabled: true http.cors.allow-origin: "*" cluster.name: bing_cluster node.name: bing_node_2 node.master: false discovery.zen.ping.unicast.hosts: ["127.0.0.1"] |
说明:最后一行的discovery.zen.ping.unicast.hosts: [“127.0.0.1”]是主机节点的IP地址,只需要填写ip地址这个2号子节点就会自动找到主节点,不需要填写端口号。按照2号节点的修改,第3 个节点的配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
xpack.ml.enabled: false network.host: 0.0.0.0 http.port: 8303 #memory bootstrap.memory_lock: false bootstrap.system_call_filter: false http.cors.enabled: true http.cors.allow-origin: "*" cluster.name: bing_cluster node.name: bing_node_3 node.master: false discovery.zen.ping.unicast.hosts: ["127.0.0.1"] |
注意的是,每个节点最好是解压源文件,不要直接复制节点的代码,因为节点在启动的时候回生成Data文件夹,如果是直接复制的那么需要删除data文件夹才能正常的加入主节点。
elasticSearch索引的使用
创建索引的时候需要填写分片数和副本数,分片数官方的建议是节点数的1.5-3倍,我们有栅格节点,因此填写5个差不多,副本数是1就可以了。
video-test是刚刚创建的索引文档,docs:0没有文档,下面的0,1,2,3,4代表刚才设置的5个分片,加粗的是主分片,没有加粗的是副本,每个分片会落到不同的es实例里面去,可以看出2号分片在节点1,1和4号分片在节点2,0和3号分片在节点3,然后每个主分片都会对应一个副本。这是一个非结构化的索引。
创建一个结构化索引,mapping,相当于一个映射,可以理解成mysql中表的创建,定义文档以及如何存储的过程,需要一个index,type, source, field datatypes(text, keyword, date, double),一下是一个例子在复合查询中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
{ "mappings": { "video": { "properties": { "name": { "type": "text" }, "cat_id": { "type": "integer" }, "image": { "type": "text" }, "url": { "type": "text" }, "type": { "type": "byte" }, "content": { "type": "text" }, "uploader": { "type": "keyword" }, "create_time": { "type": "integer" }, "update_time": { "type": "integer" }, "status": { "type": "byte" }, "video_id": { "type": "keyword" } } } } } |
注意一下:请求的接口地址后面要加上索引名,这里的索引名是bing_video,方法是PUT,然后我们可以看到索引创建成功了。我们注意到,在这次创建过程中我们没有使用分片和副本,没有提供的话就会默认是用es提供的5个分片,1个副本。
文档的新增操作
在es中叫做创建一个文档,相当于mysql的新增一条数据的操作,es在新增的时候有一个自增id是_id,我们也可以自己指定ID,注意请求的地址是 ip/索引/doc/id,最后一个id可以省略就会使用es的自增ID
文档查询
1 2 3 4 5 6 7 |
{ "query":{ "match" :{ "name":"多种任意类型传感器数据采集、多种执行器控制、设备异常监控,一个终端所有设备尽在掌握。" } } } |
这样搜索会先进行分词,再根据分词搜索,这样如果搜索“多种”,那么返回的不仅仅是包含“多种”这个词的结果,还会返回包含“多”字,和“种”字的结果,如果完整包含这个词的可以使用
1 2 3 4 5 6 7 |
{ "query":{ "match_phrase" :{ "name":"多种任意类型传感器数据采集、多种执行器控制、设备异常监控,一个终端所有设备尽在掌握。" } } } |
ealsticsearch-php底层基础类库安装
composer.json的require加上
1 |
"elasticsearch/elasticsearch": "~6.0" |
然后composer update就安装好了
现在利用这个库写一个通过ID查询和一个模糊搜索的场景。
1 |
use Elasticsearch\ClientBuilder; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
function index() { // 测试php-elasticsearch demo $params = [ "index" => "bing_video", "type" => "video", "id" => 1 ]; // 实例化es服务 $client = ClientBuilder::create()->setHosts(["127.0.0.1:8301"])->build(); $result = $client->get($params); return $this->writeJson(200,'OK',$result); } |
这样就搜索出了ID=1的结果
进行模糊搜索
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
function index() { // 测试php-elasticsearch 模糊搜索 $params = [ "index" => "bing_video", "type" => "video", "body" => [ "query" => [ 'match' => [ "name" => "集、多种执行器控制、设备异" ] ] ] ]; // 实例化es服务 $client = ClientBuilder::create()->setHosts(["127.0.0.1:8301"])->build(); $result = $client->search($params); return $this->writeJson(200,'OK',$result); } |
还没写完。。。