作者:王博博
链接:https://blog.nowcoder.net/n/f97cc2d61ff74b8ebe4d699c6167274f
来源:牛客网
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" : },
"_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" : },
"_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" : },
"_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" : },
"_seq_no" : 5,
"_primary_term" : 1 }
查看作者更多博客:https://blog.nowcoder.net/wangbo
欢迎关注公众号:牛客NOIP竞赛学