分享好友

×
取消 复制
干货|ES之ElasticSearch初体验
2020-06-03 13:41:32

作者:王博博

链接:blog.nowcoder.net/n/f97

来源:牛客网

ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。ElasticSearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。

它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用ElasticSearch的水平伸缩性,能使数据在生产环境变得更有价值。ElasticSearch 的实现原理主要分为以下几个步骤,首先用户将数据提交到Elastic Search数据库中,再通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据,当用户搜索数据时候,再根据权重将结果排名,打分,再将返回结果呈现给用户。

kinaba

通过 Kibana,您可以对自己的 Elasticsearch 进行可视化,还可以在 Elastic Stack 中进行导航,这样您便可以进行各种操作了,从跟踪查询负载,到理解请求如何流经您的整个应用,都能轻松完成。

logstash

通过这一灵活且开源的收集、解析和扩充管道,轻松整合任何来源、任何格式的数据。免费下载。

以上工具下载链接如下:

elastic.co/cn/products/
elastic.co/cn/products/

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 }

查看作者更多博客:blog.nowcoder.net/wangb

欢迎关注公众号:牛客NOIP竞赛学

分享好友

分享这个小栈给你的朋友们,一起进步吧。

Elasticsearch
创建时间:2020-05-22 14:49:51
ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。我们建立一个网站或应用程序,并要添加搜索功能,但是想要完成搜索工作的创建是非常困难的。我们希望搜索解决方案要运行速度快,我们希望能有一个零配置和一个完全免费的搜索模式,我们希望能够简单地使用JSON通过HTTP来索引数据,我们希望我们的搜索服务器始终可用,我们希望能够从一台开始并扩展到数百台,我们要实时搜索,我们要简单的多租户,我们希望建立一个云的解决方案。因此我们利用Elasticsearch来解决所有这些问题及可能出现的更多其它问题。
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • 栈栈
    专家
戳我,来吐槽~