elasticsearch知识整理

ElasticSearch

elasticsearch 是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。

特点

  • 分布式,无需人工搭建集群(solr就需要人为配置,使用Zookeeper作为注册中心)
  • Restful风格,一切API都遵循Rest原则,容易上手
  • 近实时搜索,数据更新在Elasticsearch中几乎是完全同步的。

    一、安装

    1、docker方式安装elasticsearch

  • 安装
    1
    $ docker pull elasticsearch
  • 启动 (java程序访问可以在增加一个9300端口)
    1
    $ docker run --name elasticsearch -p 9200:9200  -e "discovery.type=single-node" -d elasticsearch
  • 进入容器修改配置
    1
    2
    3
    $ docker exec -it elasticsearch /bin/bash
    $ cd /usr/share/elasticsearch/config/
    $ vi elasticsearch.yml
  • 追加一下内容,解决跨域问题
    1
    2
    http.cors.enabled: true
    http.cors.allow-origin: "*"
  • 重启容器
    1
    2
    $ exit
    $ docker restart elasticsearch
    默认访问链接http://127.0.0.1:9200就可以打开kibana的界面了。

    2、安装ik分词器

    es自带的分词器对中文分词不是很友好,elasticsearch的版本和ik分词器的版本需要保持一致;
    1
    2
    3
    4
    $ cd /usr/share/elasticsearch/plugins/
    $ elasticsearch-plugin install 对应版本的安装包地址(https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.2.0/elasticsearch-analysis-ik-7.2.0.zip)
    $ exit
    $ docker restart elasticsearch 可以在kibana界面的dev tools中验证是否安装成功

    3、docker安装kibana

    可视化elasticsearch管理页面
  • 安装 (要与es版本对应)
    1
    $ docker pull kibana
  • 启动kibana(使用–link连接到elasticsearch容器 ,或者使用Network让其在同一个网络下)
    1
    2
    $ docker run --name kibana  -p 5601:5601 -d kibana
    $ docker start kibana
    浏览器输入http://127.0.0.1:5601就可以打开kibana的界面了。
  • 遇到问题
    1)访问提示 Kibana server is not ready yet
    第一:把KB和ES版本调整为统一版本
    第二:将配置文件kibana.yml中的elasticsearch.url改为正确的链接
    第三:保持kibana和elasticsearch在同一个网络模式下,可以使用默认的bridge网络下的段的地址172.17.0.x
    注意,默认为bridge网络,此网络下两个容器无法用127.0.0.x 的本地ip进行通信访问,如果想用要都切换到host模式

二、常用命令

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
42
43
44
45
46
47
48
49
50
51
52
53
GET _search
{
"query": {
"match_all": {}
}
}
GET _cluster/health
GET _cat/nodes

#创建,自动生成id
POST users/_doc
{
"user":"Mike",
"post_date":"2019-04-15T12:12:12",
"message":"trying out Kibana"
}
#创建,手动指定id,id存在报错
PUT users/_doc/1?op_type=create
{
"user":"Mike",
"post_date":"2019-04-15T12:12:12",
"message":"trying out Kibana123123"
}
#根据id查询一条
GET users/_doc/1

#(index方式创建)删除原来的文档,写入新的,版本加一
PUT users/_doc/1
{
"user":"MIke"
}
#根据ID修改文档的内容,没有的字段会新增
POST users/_update/1/
{
"doc":{
"post_date":"2019-04-15T12:12:12",
"message":"trying out Kibana123123"
}
}
#根据删除
DELETE users/_doc/1

#批量增删改
PUT _bulk
#根据id批量读
GET _mget
#读全部
POST kibana_sample_data_ecommerce/_msearch
{}
{"query":{"match_all":{}},"size":1}
#match:会将搜索田间分词,然后到索引里面找
#match_phrase:习语匹配,查询确切的phase,在对查询字段定义了分词器的情况下,会使用分词器对输入进行分词,然后返回满足下述两个条件的document:
#term 是代表完全匹配(相当mysql与全等用 )

三、索引settings和mappings

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
PUT loaravel-log-2020.11.05
{
"settings": {
"number_of_shards": 2,//主分片数
"number_of_replicas": 1 //每一个主分片有多少个副本分片
},
"mappings": {
"properties": {
"path": {
"type": "keyword"
},
"type": {
"type": "keyword"
},
"messgae": {
"type": "text"
},
"tags": {
"type": "text",//可以寸数组
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"host": {
"type": "keyword"
},
"@timestamp": { //带@的是系统预留字段 固定类型
"type": "date"
},
"@version": {
"type": "text"
}
}
}
}

四、重要知识点

查询搜索条件算分
索引的命名规则
创建一个新indx时 设置 setting mapping(字段类型,分词规则)
index template
聚合统计搜索使用(aggs) bucket按照规则诗句划分不同的组(相当于mysql group),metric 用于数据集的统计(可以统计bucket生成的数据集中的字段进行分析,例如平均值)
search -》协调节点-》查询所有分片-》取回id和排序合并-》去对应分片的数据节点取出具体doc信息
主节点 index(存储索引index信息,索引关联对应的分片) -》