基础概念
索引(index) /类型(type)
相当于关系数据库中的table概念。Elasticsearch5.x版本支持多个type,6.x版本支持一个type,7.x版本只允许_doc的type。
映射(mapping)
相当于数据库中的schema,用来约束字段的类型,不过 Elasticsearch 的 mapping 可以自动根据数据创建。
文档(document)
相当于数据库中的row。文档是Elasticsearch中主要的实体,所有Elasticsearch的查询都是基于存放在Elasticsearch中文档资源的查询。实际上,从用户的角度看,一个Elasticsearch文档就是一个JSON对象。
字段(field)
相当于数据库中的column,字段可以指定分词器(analyzer)。
Elasticsearch基本数据类型
字符串类型:text(分词)、keyword(不分词)
日期类型: date
布尔类型: boolean
IP类型: ip
地理位置类型: geo_point
整数类型: byte, short, integer, long
浮点数类型: float, double, half_float, scaled_float
Elasticsearch写入流程


客户端选择一个node发送请求过去,这个node就是coordinating node(协调节点)。
coordinating node,根据docId对document进行路由,将请求转发给对应的node(primary shard)。
实际的node上的primary shard处理请求,然后将数据同步到replica node。
coordinating node,如果发现primary node和所有replica node都搞定之后,就返回响应结果给客户端。
每个shard(分片)先在内存中写入索引,然后再写transLog(事务日志)。索引定期刷新到磁盘,事务日志默认同步刷新到磁盘。
Elasticsearch查询流程


搜索通常是一个两阶段过程,称之为 Query Then Fetch。
在Query阶段时,查询会广播到索引中每一个分片拷贝(主分片或者副本分片),每个分片在本地执 行搜索并构建一个匹配文档的大小为 from + size 的优先队列。
每个分片返回各自优先队列中所有文档的ID和排序值给协调节点,协调节点合并这些值到自己的优 先队列中来产生一个全局排序后的结果列表。
在Fetch取回阶段,协调节点辨别出哪些文档需要被取回,并向相关分片(primary或replica分片随机选择)提交多个GET请求,接着返回文档给协调节点。一旦所有的文档都被取回了,协调节点返回结果 给客户端。
关键词查询请求会同时从内存、磁盘的索引查找。主键查询请求先从事务日志获取文档信息,事务日志中没有命中再从磁盘获取文档信息,可以保证数据写入后实时获取文档信息。
Elasticsearch基本操作 -- 常用管理API
查看elasticsearch版本
GET /
查看健康状况
GET /_cat/health?v
查看节点信息
GET /_cat/nodes?v
查看索引信息
GET /_cat/indices?v
查看JVM内存
GET /_nodes/stats/jvm?pretty
查看磁盘
GET /_cat/allocation?v
查看安装插件
GET /_cat/plugins?v
Elasticsearch基本操作 --创建索引
#创建索引
PUT /twitter?include_type_name=true
{
"settings": {
"index": {
"number_of_shards": "5",
"number_of_replicas": "1"
}
},
"mappings": {
"_doc": {
"properties": {
"user": {
"type": "keyword"
},
"post_date": {
"type": "date"
},
"message": {
"type": "text",
"analyzer": "cjk"
}
}
}
}
}
Elasticsearch基本操作 --写入数据
PUT /twitter/_doc/1?pretty
{
"user": "kimchy",
"post_date": "2009-11-15T13:12:00",
"message": "Trying out Elasticsearch, so far so good?"
}
PUT /twitter/_doc/2?pretty
{
"user": "kimchy",
"post_date": "2009-11-15T14:12:12",
"message": "Another tweet, will it be indexed?"
}
PUT /twitter/_doc/3?pretty
{
"user": "elastic",
"post_date": "2010-01-15T01:46:38",
"message": "Building the site, should be kewl"
}
Elasticsearch基本操作--主键查询
主键查询
GET /twitter/_doc/1
GET /twitter/_doc/2
GET /twitter/_doc/3
Elasticsearch基本操作--查询语法
Lucene查询语法
GET /twitter/_search?q=user:kimchy
DSL查询语法
GET /twitter/_search
{
"query" : {
"match" : { "user": "kimchy" }
}
}
查询全部数据
GET /twitter/_search
{
"query" : {
"match_all" : {}
}
}
#时间范围查询
GET /twitter/_search?pretty=true
{
"query" : {
"range" : {
"post_date" : {
"from" : "2009-11-15T13:00:00",
"to" : "2009-11-15T14:00:00"
}
}
}
}
#关键词查询
GET /twitter/_search
{
"query": {
"query_string" : {
"query": "(user:kimchy OR user:elastic) AND message:tweet"
}
}
}
Elasticsearch基本操作--聚合统计
查看索引字段信息
GET /twitter
#聚合统计
POST /twitter/_search?pretty
{
"size": 0,
"aggs": {
"group_by_user": {
"terms": {
"field": "user"
}
}
}
}
Elasticsearch基本操作--修改数据
#修改整个文档
PUT /twitter/_doc/3
{
"user": "ouyangchucai",
"post_date": "2019-08-08T08:08:08",
"message": "Elasticsearch is nice"
}
#修改部分文档
POST twitter/_update/3
{
"script" : "ctx._source.user = 'shay'"
}
Elasticsearch基本操作--删除数据
按主键删除记录
DELETE /twitter/_doc/2
删除索引
DELETE /twitter
Elasticsearch基本操作—bulk批量请求
#批量请求
POST /_bulk
{ "index" : { "_index" : "test", "_type" : "_doc", "_id" : "1" } }
{ "field1" : "value1" }
{ "delete" : { "_index" : "test", "_type" : "_doc", "_id" : "2" } }
{ "create" : { "_index" : "test", "_type" : "_doc", "_id" : "3" } }
{ "field1" : "value3" }
{ "update" : {"_id" : "1", "_type" : "_doc", "_index" : "test"} }
{ "doc" : {"field2" : "value2"} }
最佳实践: Elasticsearch优化

Elasticsearch索引和查询性能调优的21条建议
https://mp.weixin.qq.com/s/qs0w4M4ebqmHJRj-G8Dc_A
https://mp.weixin.qq.com/s/Br1RLdsCwP2wp5BU2qKXNg
网友评论