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 }