Elasticsearch 快速起步

1. 简介

Elasticsearch 是一个高可靠开源全文搜索与分析引擎,可以让我们实时存储、查询、分析海量数据

具有安装方便、稳定可靠、快速、实时等特点,是当前流行的企业级搜索引擎

应用场景示例:

  • 在线商店中的产品搜索,可以使用 Elasticsearch 来存储产品信息,让客户快速的搜索,可以方便的实现搜索时的自动完成功能
  • 数据搜集,进行趋势分析、统计、监控异常现象 等等,使用 Logstash 采集数据,存储到 Elasticsearch 中,然后就可以搜索、聚合自己感兴趣的内容

2. 基本概念

Cluster

一组 server 集合构成的集群,这些 server 一起存在数据、提供索引与搜索功能

cluster 是有名字的,默认是 "elasticsearch",这个名字很重要,一个 server 只能属于一个 cluster,就是根据这个名字建立关系的,所以名字要规划好,例如 logging-dev、logging-prod 分别作为开发、产品环境下的cluster

Node

cluster 中的一个 server 就是 node 节点,node 也有名字,默认是一个 UUID

Index

有相似属性文档的集合,例如客户数据 index、产品分类 index、订单数据 index

index 使用一个全小写的 name 作为标识

Type

一个 index 内可以定义一个或多个 type,type 是 index 中的逻辑分类

例如,一个博客系统,把所有数据都存储在一个 index 中,其中就可以有多个 type,用户数据 type、博客数据 type、评论数据 type

Document

是可被索引的基本信息单元,例如,一个客户的 document、一个产品的 document、一条订单的 document

document 使用 JSON 来描述,在一个 index 或者 type 中,可以保存任意数量的 document

一个 document 必须属于 index 中的某个 type

3. 安装

前提:安装好JAVA环境

下载

https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.2.2.tar.gz

解压

tar -xvf elasticsearch-5.2.2.tar.gz

启动

cd elasticsearch-5.2.2/bin
./elasticsearch

会输出一系列日志信息,启动完成后会打印出 started

4. 操作示例

列出所有 index

curl -XGET 'localhost:9200/_cat/indices?v&pretty'

新建 index

新建一个名为 customer的 index

curl -XPUT 'localhost:9200/customer?pretty&pretty'

列出所有 index,看是否添加成功

curl -XGET 'localhost:9200/_cat/indices?v&pretty'

向 index 中添加一个 document

curl -XPUT 'localhost:9200/customer/external/1?pretty&pretty' -H 'Content-Type: application/json' -d'
{
  "name": "John Doe"
}
'

意思是添加到 customer这个 index 中的 external type,ID为 1

document 内容是

{
  "name": "John Doe"
}

Elasticsearch 并不需要在插入 document 之前先创建好 index,上面例子中,如果 customer 这个 index 不存在,会自动创建

根据 ID 取 document

curl -XGET 'localhost:9200/customer/external/1?pretty&pretty'

返回信息

{
  "_index" : "customer",
  "_type" : "external",
  "_id" : "1",
  "_version" : 2,
  "found" : true,
  "_source" : {
    "name" : "John Doe"
  }
}

删除 index

curl -XDELETE 'localhost:9200/customer?pretty&pretty'
curl -XGET 'localhost:9200/_cat/indices?v&pretty'

之前的 customer 已经没有了

替换 document

先新建一个 document,ID 为 1

curl -XPUT 'localhost:9200/customer/external/1?pretty&pretty' \
-H 'Content-Type: application/json' -d'
{
  "name": "华仔"
}
'

查看一下

curl -XGET 'localhost:9200/customer/external/1?pretty&pretty'
{
  "_index" : "customer",
  "_type" : "external",
  "_id" : "1",
  "_version" : 1,
  "found" : true,
  "_source" : {
    "name" : "华仔"
  }
}

替换成新的 document,同样指定ID为 1 即可

curl -XPUT 'localhost:9200/customer/external/1?pretty&pretty' \
-H 'Content-Type: application/json' -d'
{
  "name": "德华"
}
'

再查看一下

curl -XGET 'localhost:9200/customer/external/1?pretty&pretty'
{
  "_index" : "customer",
  "_type" : "external",
  "_id" : "1",
  "_version" : 4,
  "found" : true,
  "_source" : {
    "name" : "德华"
  }
}

修改 document 数据

修改上面 ID 为 1 的 document 的 name

curl -XPOST 'localhost:9200/customer/external/1/_update?pretty&pretty' -H 'Content-Type: application/json' -d'
{
  "doc": { "name": "学友" }
}
'

修改 name 同时添加一个 age 属性

curl -XPOST 'localhost:9200/customer/external/1/_update?pretty&pretty' -H 'Content-Type: application/json' -d'
{
  "doc": { "name": "富城", "age": 20 }
}
'

查看一下 document

curl -XGET 'localhost:9200/customer/external/1?pretty&pretty'

修改数据时还可以使用一些简单的脚本,例如 给 age 增加 5 岁

curl -XPOST 'localhost:9200/customer/external/1/_update?pretty&pretty' -H 'Content-Type: application/json' -d'
{
  "script" : "ctx._source.age += 5"
}
'

删除 document

curl -XDELETE 'localhost:9200/customer/external/1?pretty&pretty'

5. 小结

从上面的实践中可以发现 Elasticsearch 非常方便,没有复杂的安装过程,操作是 REST 风格,简单易懂,概念也很好理解

原文发布于微信公众号 - 性能与架构(yogoup)

原文发表时间:2017-03-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java后端技术栈

为什么分布式一定要有Redis?

考虑到绝大部分写业务的程序员,在实际开发中使用 Redis 的时候,只会 Set Value 和 Get Value 两个操作,对 Redis 整体缺乏一个认知...

13620
来自专栏java达人

多线程设计模式解读6-single threaded Execution模式(附分布式环境下的操作)

Single Threaded Execution模式主要是用于确保同一时间内只能让一个线程执行处理,说通俗点就是对synchronized的标准化使用方式,这...

12140
来自专栏Spark学习技巧

为什么分布式一定要有Redis?

考虑到绝大部分写业务的程序员,在实际开发中使用 Redis 的时候,只会 Set Value 和 Get Value 两个操作,对 Redis 整体缺乏一个认知...

10320
来自专栏信安之路

论二级域名收集的各种姿势

1 查询whois http://whois.chinaz.com/baidu.com

80500
来自专栏IT技术精选文摘

Java文件映射(mmap)全接触

前言 我们在平时的工作中大多都会需要处理像下面这样基于Key-Value的数据: ? 其中UID是数据唯一标识,FIELD[1]是属性值。以QQ用户的Sess...

1.6K60
来自专栏黑白安全

Zip Slip漏洞影响数千个项目

6月5日,Snyk的研究人员宣布了一个名为Zip Slip 的漏洞。 通过此漏洞,攻击者可以使用特制ZIP压缩文件通过路径遍历来覆盖任意文件,从而执行潜在的命令...

9930
来自专栏韩伟的专栏

如何设计一个 RPC 系统

RPC 是一种方便的网络通信编程模型,由于和编程语言的高度结合,大大减少了处理网络数据的复杂度,让代码可读性也有可观的提高。本文就是通过分析几种流行的 RPC ...

10.8K90
来自专栏一个爱瞎折腾的程序猿

个人博客满血复活,求测试~~~

一、 尝试着搭建了一个asp.net mvc的框架:YimoFramework源码 二、 C#写的一个自动签到的服务:AutomaticSignService...

10610
来自专栏后端技术探索

http response code 301 和 302,你懂吗

一.官方说法 301,302 都是HTTP状态的编码,都代表着某个URL发生了转移,不同之处在于: 301 redirect: 301 代表永久性转移(Per...

13120
来自专栏后端技术探索

为什么分布式一定要有Redis?

考虑到绝大部分写业务的程序员,在实际开发中使用 Redis 的时候,只会 Set Value 和 Get Value 两个操作,对 Redis 整体缺乏一个认知...

11040

扫码关注云+社区

领取腾讯云代金券