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 }
全部评论

相关推荐

评论
1
收藏
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
6997次浏览 66人参与
# 你的实习产出是真实的还是包装的? #
1348次浏览 34人参与
# 米连集团26产品管培生项目 #
4933次浏览 206人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7152次浏览 38人参与
# 简历第一个项目做什么 #
31369次浏览 316人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
186577次浏览 1116人参与
# MiniMax求职进展汇总 #
23288次浏览 303人参与
# 研究所笔面经互助 #
118800次浏览 577人参与
# 面试紧张时你会有什么表现? #
30418次浏览 188人参与
# 简历中的项目经历要怎么写? #
309646次浏览 4168人参与
# AI时代,哪些岗位最容易被淘汰 #
62863次浏览 757人参与
# 职能管理面试记录 #
10728次浏览 59人参与
# 网易游戏笔试 #
6387次浏览 83人参与
# 腾讯音乐求职进展汇总 #
160455次浏览 1107人参与
# 把自己当AI,现在最消耗你token的问题是什么? #
7025次浏览 154人参与
# 正在春招的你,也参与了去年秋招吗? #
362814次浏览 2632人参与
# 你怎么看待AI面试 #
179494次浏览 1188人参与
# 小红书求职进展汇总 #
226933次浏览 1357人参与
# 你觉得通信/硬件有必要实习吗? #
155367次浏览 1065人参与
# 从哪些方向判断这个offer值不值得去? #
56714次浏览 357人参与
# 校招笔试 #
468091次浏览 2955人参与
# 你的房租占工资的比例是多少? #
92162次浏览 896人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务