初识ElasticSearch
2020-08-17 本文已影响0人
谭英智
ElasticSearch-elk
ElasticSearch-overview
ElasticSearch-overview
ElasticSearch是一个分布式搜索引擎。支持索引自动分片,索引副本机制,restful接口,多数据源,自动搜索负载
Logstash是一个用于收集,分析和存储日志的工具
Kibana是一个为Logstash和ElasticSearch提供日志分析的web界面,可以汇总分析和搜索重要数据日志
Beats是一个采集系统监控数据的代理
- packetbeat用于网络数据的采集,支持ICMP/DNS/HTTP/Mysql/PostgreSQL/MongoDB/Memcache
- Filebeat用于监控和收集服务器日志文件
- Metricbeat可以定期收集外部系统的监控指标,例如Apache/HAProxy/MongoDB/Mysql/Nginx/PostgreSQL/Redis/System/Zookeeper
elasticsearch-head
- 通过docker安装
- 通过chrome插件安装
概念
- 索引:可以看做数据库的库,一个索引可以包含多个分片,分片可以包含多个副本,可以存储在多台服务器
- 类型:可以看作数据库的表
- 文档:可以看作表的一行记录,同一索引的不同文档可以有不同的结构,但是同一字段需要有相同的类型;文档由多个字段组成,每个字段可以多次出现在一个文档中;同一索引下的所有文档内如果有同名的字段,类型必须相同
- 映射:所有文档写入索引之前会先进行分析,如何将如数文本分割成词条/哪些词条被过滤,这种行为叫映射。一般由用户自定义规则
restful api
非结构化索引
put /indexName
{
"setting": {
"index":{
"number_of_shards": "2",
"number_of_replicas": "0"
}
}
}
delete /indexName
{
"acknowledged": true
}
文档
以JSON格式存储,包括index/type/id
插入
POST /indexName/typeName/id
jsonBody
#不指定id,会自动生成唯一id
更新
put /indexName/typeName/id
jsonBody
#es只支持覆盖,不支持更新
#增量更新:
post /indexName/typeName/id/_update
{
"doc": {
key: value
}
}
#服务器会做全量覆盖
删除
#不存在会返回404
delete /indexName/typeName/id
#文档不会马上从磁盘删除,会先标志,后面进行批量删除
搜索
#搜索,不存在会返回404
get /indexName/typeName/id
get /indexName/typeName/_search #查10条
get /indexName/typeName/_search?q=age:20 #条件查询
DSL查询
为了支持更复杂和强大的查询
post /indexName/typeName/_search
{
"query": {
"match": {
"age": 20
}
}
}
post /indexName/typeName/_search
{
"query": {
“range”: {
...
},
"exists": {#isNotNull
"field": "card"
},
"term": {#精确匹配
name: "marco"
},
“terms”: {
id: ["id1", "id2"]
},
"match": {
...
},
"filter": {
...
}
"bool": {
"must": {
...
},
"must_not": {
},
"should": {
},
"filter": {
"range": {#范围匹配
"age": {
"gt": 30
}
}
},
"must": {#必须满足
"match": {#可以用于全文查询/精确查询
"sex": "男"
}
}
}
}
}
高亮显示
post /indexName/typeName/_search
{
"query": {
...
},
"highlight": {
"fields": {
"name": {}
}
}
}
聚合
pretty
美化返回
get /indexName/typeName/id?pretty
指定返回字段
get /indexName/typeName/id?_source=id,name
仅返回数据,不返回元数据
get /indexName/typeName/id/_source
判断文档是否存在
只返回200/404
head /indexName/typeName/id
批量查询
post /indexName/typeName/_mget
{
"ids": ["id1", "id2"]
}
_bulk
支持批量插入/修改/删除
{action: {metadata}}\n
{body}\n
{action: {metadata}}\n
{body}\n
例子:
{"create": {"_index": "indexName", "_type": "typeName", "_id": id}}
{key: value...}
分页
深度分页会出现问题,例如一个有5个分片的索引,如果查询10001到10010,每个分片会产生10010个结果,然后请求节点对这50050排序,并丢弃50040个结果,返回10
get /indexName/typeName/_search?size=5&from=10
映射
自动映射
json type -> es type
bool ->bool
number -> long
floating -> double
date string -> date
string -> keyword
对于string/keyword类型,es会精确搜索,对于text类型,es会进行分词并建立索引
创建类型确定索引
put /indexName
{
"setting": {
"index":{
"number_of_shards": "2",
"number_of_replicas": "0"
}
},
"mapping": {
"person": {
"properties": {
"name": {
"type": "text"
}
...
}
}
}
}
过滤查询
除了上述的结构化查询,es也支持过滤查询,如term/range/match
post /indexName/typeName/_search
{
"query": {
"bool": {
"filter": {
"term": {
"age": 20
}
}
}
}
}
- 过滤语句会精确匹配特定值,高效
- 查询语句会计算匹配程度,并排序输出,比较耗时