ES之ElasticSearch初体验
elasticsearch
ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。ElasticSearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用ElasticSearch的水平伸缩性,能使数据在生产环境变得更有价值。ElasticSearch 的实现原理主要分为以下几个步骤,首先用户将数据提交到Elastic Search数据库中,再通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据,当用户搜索数据时候,再根据权重将结果排名,打分,再将返回结果呈现给用户。
kinaba
通过 Kibana,您可以对自己的 Elasticsearch 进行可视化,还可以在 Elastic Stack 中进行导航,这样您便可以进行各种操作了,从跟踪查询负载,到理解请求如何流经您的整个应用,都能轻松完成。
logstash
通过这一灵活且开源的收集、解析和扩充管道,轻松整合任何来源、任何格式的数据。免费下载。
以上工具下载链接如下:
https://www.elastic.co/cn/products/elastic-stack
https://www.elastic.co/cn/products/logstash
es基本概念
文档
- Elasticsearch是面向文档的,文档是所有可搜索数据的最小单位
- 文档会被序列化成JSON格式,保存在es中
- 每个文档都有一个Unique ID
{ "_index" : "users", "_type" : "_doc", "_id" : "1", "_version" : 2, "_seq_no" : 1, "_primary_term" : 1, "found" : true, "_source" : { "firstName" : "Jack", "lastName" : "Jshnson", "tags" : [ "guitar", "skateboard" ], "albums" : [ "Album1", "Album2" ] } }
- _index 文档所属的索引名
- _type 文档所属的类型名
- _id 文档唯一id
- _source 文档原始的json数据
— _all 整合所有字段内容到该字段,已被废除 - _version 文档的版本信息
- _score 相关性打分
索引
索引是文档的容器,是一类文档的结合
Index体现的是逻辑空间的概念:每个索引都有自己的Mapping定义,用于定义包含的文档的字段名和字段类型
Shard体现的物理空间的概念,索引中的数据分散在Shard上
索引的Mapping与Settings
- Mapping定义文档字段的类型
- Setting定义不同的数据分布
新建文档
- 创建文档,自动生成id
POST users/_doc { "user" : "Mike", "post_date" : "2019-01_12", "nessage" : "hello,world" }
- 结果
{ "_index" : "users", "_type" : "_doc", "_id" : "pDidGG4BlEcu-MMWkJfq", "_version" : 1, "result" : "created", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 2, "_primary_term" : 1 }
- 创建文档,指定id,如果id已经存在,报错
POST users/_doc/1?op_type=create { "user" : "Jack", "post_date" : "2019-01_12", "nessage" : "hello,world" }
- id已存在信息
{ "error": { "root_cause": [ { "type": "version_conflict_engine_exception", "reason": "[1]: version conflict, document already exists (current version [2])", "index_uuid": "ObXJ_sdqQxqF36-JKH4QCQ", "shard": "0", "index": "users" } ], "type": "version_conflict_engine_exception", "reason": "[1]: version conflict, document already exists (current version [2])", "index_uuid": "ObXJ_sdqQxqF36-JKH4QCQ", "shard": "0", "index": "users" }, "status": 409 }
- id不存在结果
{ "_index" : "users", "_type" : "_doc", "_id" : "2", "_version" : 1, "result" : "created", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 3, "_primary_term" : 1 }
获取文档
- GET
GET users/_doc/1
- 结果
{ "_index" : "users", "_type" : "_doc", "_id" : "1", "_version" : 2, "_seq_no" : 1, "_primary_term" : 1, "found" : true, "_source" : { "firstName" : "Jack", "lastName" : "Jshnson", "tags" : [ "guitar", "skateboard" ], "albums" : [ "Album1", "Album2" ] } }
index、create、update的区别
ndex、create
第一步:判断插入文档是否指定id,如果没有指定,系统会默认生成一个id,直接创建文档。如果指定了id,就会走update(Lucene中的,不是es中的update),update成本比add高
第二步:版本号是否冲突,如果不冲突插入,否则插入失败
两者区别:
index时会检查_version。如果插入时没有指定_version,那对于已有的doc,_version会递增,并对文档覆盖。插入时如果指定_version,如果与已有的文档_version不相等,则插入失败,如果相等则覆盖,_version递增。
create时也会检查_version,但是对于已有的文档,不会创建新文档,即插入失败。
update
每次update都会调用 InternalEngine 中的get方法,来获取整个文档信息,从而实现针对特定字段进行修改,这也就导致了每次更新要获取一遍原始文档,性能上会有很大影响。所以根据使用场景,有时候使用index会比update好很多。
新建PUT和POST的区别?
POST不用加具体的id,它是作用在一个集合资源之上的(/xxx),而PUT操作是作用在一个具体资源之上的(/uri/xxx)。
- POST
POST users/_update/1 { "doc" :{ "post_date" : "dasdaw", "message" : "hello" } }
- 结果
{ "_index" : "users", "_type" : "_doc", "_id" : "1", "_version" : 3, "result" : "updated", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 4, "_primary_term" : 1 }
- PUT
PUT user/_doc/1 { "users" : "old wang" }
- 结果
{ "_index" : "users", "_type" : "_doc", "_id" : "1", "_version" : 4, "result" : "updated", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 5, "_primary_term" : 1 }