ES(ElasticSearch)入门介绍

ElasticSearch 是什么

ES是一个基于Lucene构建的开源,分布式,RESTFUL搜索引擎。设计用于云计算中,能够达到实时搜索、稳定、可靠、快速,安装使用方便。支持通过HTTP使用JSON进行数据索引。

ES的几个重要的概念:

  1. NearRealTime。ElasticSearch是一个准实时检索平台,即从索引一个文档到这个文档能被成功检索有一个轻微的延迟,将近1秒钟。
  2. node。集群中一台独立主机,存储数据,提供索引和检索能力。
  3. cluster。一个或多个结点组成的集合,可以提供跨结点的索引或检索能力。
  4. index。文档的集合,对逻辑数据的逻辑存储。
  5. type。一个索引可以存储很多不同用途的对象,每种用途的对象,可以定义为一种类型
  6. Document。一个能被索引的信息的基本单元。
  7. Shards&Replicas。当有大量的文档时,由于内存的限制、硬盘能力、处理能力不足、无法足够快地响应客户端请求等,一个节点可能不够。在这种情况下,数据可以分为较小的称为分片(shard)的部分(其中每个分片都是一个独立的ApacheLucene索引)。每个分片可以放在不同的服务器上,因此,数据可以在集群的节点中传播。当你查询的索引分布在多个分片上时,Elasticsearch会把查询发送给每个相关的分片,并将结果合并在一起,而应用程序并不知道分片的存在。此外,多个分片可以加快索引。为了提高查询吞吐量或实现高可用性,可以使用分片副本。副本(replica)只是一个分片的精确复制,每个分片可以有零个或多个副本。换句话说,Elasticsearch可以有许多相同的分片,其中之一被自动选择去更改索引操作。这种特殊的分片称为主分片(primaryshard),其余称为副本分片(replicashard)。在主分片丢失时,例如该分片数据所在服务器不可用,集群将副本提升为新的主分片。

为什么要使用ES?

当系统数据量上了10亿、100亿条的时候,我们在做系统架构的时候通常会从以下角度去考虑问题:
1)用什么数据库好?(mysql、sybase、oracle、达梦、神通、mongodb、hbase…)
2)如何解决单点故障;(lvs、F5、A10、Zookeep、MQ)
3)如何保证数据安全性;(热备、冷备、异地多活)
4)如何解决检索难题;(数据库代理中间件:mysql-proxy、Cobar、MaxScale等;)
5)如何解决统计分析问题;(离线、近实时)

传统数据库的解决方案

对于关系型数据,我们通常采用以下或类似架构去解决查询瓶颈和写入瓶颈:
解决要点:
1)通过主从备份解决数据安全性问题;
2)通过数据库代理中间件心跳监测,解决单点故障问题;
3)通过代理中间件将查询语句分发到各个slave节点进行查询,并汇总结果
对于Nosql数据库,以mongodb为例,其它原理类似:
解决要点:
1)通过副本备份保证数据安全性;
2)通过节点竞选机制解决单点问题;
3)先从配置库检索分片信息,然后将请求分发到各个节点,最后由路由节点合并汇总结果

完全将数据放入内存?

我们知道,完全将数据放入内存中是不可靠的并且也不现实。当我们的数据达到PB级别时,在考虑到数据备份的情况下,节点数往往是巨额的。巨大的成本决定了它十分不现实。
其实不论放在内存还是不放在内存都不能完全的解决问题。
从源头剖析:
1、存储数据时按有序存储;
2、将数据和索引分离;
3、压缩数据;
这就用到了我们的ES。

使用ES的好处

  • ElasticSearch 是开源的有许多的工具适配Elasticsearch
  • ElasticSearch提供了JAVA的API接口
  • ElasticSearch提供了RESTFUL API 接口,不论使用什么语言开发、任何程序都能访问
  • 更重要的是,REST请求和应答是典型的JSON格式。通常情况下,一个REST请求包含一个JSON文件,其回复也是一个JSON文件。
  • ES可以快速的检索相关数据
  • ES可以返回多种统计结果
  • 速度接近实时!
  • 分布式实时文件存储,可将每一个字段存入索引,使其可以被检索到。
  • 可以扩展到上百台服务器处理PB级的结构化或非结构化数据,也可以运行在单台PC上。

安装

安装包下载下载源码
https://github.com/elastic/elasticsearch.git
下载程序包
https://www.elastic.co/downloads/elasticsearch
下载客户端elasticsearch-2.3.1.tar.gz解压
https://github.com/searchbox-io/Jest/tree/master/jest
restful API 在线文档
https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html
具体操作就不详细说明了~ 各位自行百度~
推荐安装kibana插件.
安装成功后进入安装目录bin下执行elasticsearch出现
在这里插入图片描述
就成功启动了,打开浏览器http://127.0.0.1:9200/
可以看见
在这里插入图片描述
同样在kibana目录的bin下执行kibana
在这里插入图片描述
在浏览器输入http://localhost:5601
在这里插入图片描述
在这里就可以对ES进行操作.

ES的简单使用

ES是与数据库的结构相对应的,ES的索引结构为:
index/type/id
与数据库的映射为 index = database,type=table,id=id
(6.0的版本不允许一个index下面有多个type,并且官方说是在接下来的7.0版本中会删掉type)

  • ES数据操作

  1. 创建索引
 PUT indexname?pretty

添加类型

PUT indexname/typename/1?pretty

添加文档

PUT indexname/typename/id
{
  "key1": "value1",
  "key2": "value2",
  "key3": "value3"
}

  1. 删除索引
DELETE /customer/?pretty

删除文档

DELETE /customer/external/1?pretty

  1. 更新文档内容
POST /customer/external/1/_update?pretty
{
  "doc": {
    "name": "wangwu"
  }
}  

  1. 查询集群健康状态:
GET _cat/health?v

查询节点列表:

GET _cat/nodes?v

查询所有索引及存储大小:

GET _cat/indices?v

查看文档内容:

GET website/_search?pretty

查看全部的文档:

GET indexname/_search?pretty
{
  "query": {
    "match_all": {}
  }
}

返回指定字段查询:

GET indexname/_search?pretty
{
  "query": {
    "match_all": {}
  },
  "_source": [
    "shopid",
    "agentid"
  ]
}

控制返回的个数:

GET indexname/_search?pretty
{
  "query": {
    "match_all": {}
  },
  "size": 1
}

返回指定范围的文档:

GET indexname/_search?pretty
{
  "query": {
    "match_all": {}
  },
  "from": 10,
  "size": 10
}

指定返回的排序方式:

GET indexname/_search?pretty
{
  "query": {
    "match_all": {}
  },
  "sort": {
    "balance": {
      "order": "desc"
    }
  }
}

返回指定字段:

GET indexname/_search?pretty
{
  "query": {
    "match_all": {}
  },
  "_source": [
    "account_number",
    "balance"
  ]
}

查询account_number为20的文档:

GET indexname/_search?pretty
{
  "query": {
    "match": {
      "account_number": 20
    }
  }
}

查询address为mill的文档:

GET indexname/_search?pretty
{
  "query": {
    "match": {
      "address": "mill"
    }
  }
}

查询address为mill或者lane的文档:

GET indexname/_search?pretty
{
  "query": {
    "match": {
      "address": "mill lane"
    }
  }
}

查询既包含mill又包含lane的文档:

GET indexname/_search?pretty
{
  "query": {
    "match_phrase": {
      "address": "mill lane"
    }
  }
}

查询同时包含mill和lane的文档:

GET indexname/_search?pretty
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "address": "mill"
          }
        },
        {
          "match": {
            "address": "lane"
          }
        }
      ]
    }
  }
}

查询包含mill或者lane的文档:

GET indexname/_search?pretty
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "address": "mill"
          }
        },
        {
          "match": {
            "address": "lane"
          }
        }
      ]
    }
  }
}

查询排除包含mill和lane的文档:

GET indexname/_search?pretty
{
  "query": {
    "bool": {
      "must_not": [
        {
          "match": {
            "address": "mill"
          }
        },
        {
          "match": {
            "address": "lane"
          }
        }
      ]
    }
  }
}

查询balance在2000-3000范围的文档:

GET indexname/_search?pretty
{
  "query": {
    "bool": {
      "must": {
        "match_all": {}
      },
      "filter": {
        "range": {
          "balance": {
            "gte": 20000,
            "lte": 30000
          }
        }
      }
    }
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值