文档章节

ElasticSearch 索引查询使用指南——详细版

mickelfeng
 mickelfeng
发布于 2017/06/02 15:02
字数 1898
阅读 32
收藏 0
点赞 0
评论 0

1、我们通常用用_cat API检测集群是否健康。 确保9200端口号可用:

  curl 'localhost:9200/_cat/health?v'

  绿色表示一切正常, 黄色表示所有的数据可用但是部分副本还没有分配,红色表示部分数据因为某些原因不可用.

2.通过如下语句,我们可以获取集群的节点列表:

  curl 'localhost:9200/_cat/nodes?v'

3。通过如下语句,列出所有索引:

  curl 'localhost:9200/_cat/indices?v'

 返回结果:

4.创建索引

  现在我们创建一个名为“customer”的索引,然后再查看所有的索引:

 curl -XPUT 'localhost:9200/customer?pretty'
 curl 'localhost:9200/_cat/indices?v'

  结果如下:

   

   

 

  上图中红框所表示的是:我们有一个叫customer的索引,它有五个私有的分片以及一个副本,在它里面有0个文档。

5.插入和获取

 现在我么插入一些数据到集群索引。我们必须给ES指定所以的类型。如下语句:"external" type, ID:1:

 主体为JSON格式的语句: { "name": "John Doe" }

  curl -XPUT 'localhost:9200/customer/external/1?pretty' -d '
  {
           "name": "John Doe"
  }'

  返回结果为:create:true 表示插入成功。

获取GET,语句如下:

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

  其中含义为:获取customer索引下类型为external,id为1的数据,pretty参数表示返回结果格式美观。

6.删除索引 DELETE

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

  表示索引删除成功。

7.通过以上命令语句的学习,我们发现索引的增删改查有一个类似的格式,总结如下:

  curl -X<REST Verb> <Node>:<Port>/<Index>/<Type>/<ID>

  <REST Verb>:REST风格的语法谓词

  <Node>:节点ip

  <port>:节点端口号,默认9200

  <Index>:索引名

  <Type>:索引类型

  <ID>:操作对象的ID号

 8 修改数据

  curl -XPUT 'localhost:9200/customer/external/1?pretty' -d '
  {
    "name": "John Doe"
  }'
  curl -XPUT 'localhost:9200/customer/external/1?pretty' -d '
  {
    "name": "Jane Doe"
  }'

  上述命令语句是:先新增id为1,name为John Doe的数据,然后将id为1的name修改为Jane Doe。

9.更新数据

9.1 这个例子展示如何将id为1文档的name字段更新为Jane Doe:

  curl -XPOST 'localhost:9200/customer/external/1/_update?pretty' -d '
  {
    "doc": { "name": "Jane Doe" }
  }'

9.2 这个例子展示如何将id为1数据的name字段更新为Jane Doe同时增加字段age为20:

  curl -XPOST 'localhost:9200/customer/external/1/_update?pretty' -d '
  {
    "doc": { "name": "Jane Doe", "age": 20 }
  }'

9.3  也可以通过一些简单的scripts来执行更新。一下语句通过使用script将年龄增加5:

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

10 删除数据

删除数据那是相当的直接. 下面的语句将执行删除Customer中ID为2的数据:

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

11 批处理

  举例:

下面语句将在一个批量操作中执行创建索引:

  curl -XPOST 'localhost:9200/customer/external/_bulk?pretty' -d '
  {"index":{"_id":"1"}}
  {"name": "John Doe" }
  {"index":{"_id":"2"}}
  {"name": "Jane Doe" }
  '

  下面语句批处理执行更新id为1的数据然后执行删除id为2的数据

  curl -XPOST 'localhost:9200/customer/external/_bulk?pretty' -d '
  {"update":{"_id":"1"}}
  {"doc": { "name": "John Doe becomes Jane Doe" } }
  {"delete":{"_id":"2"}}
  '

12.导入数据集

 你可以点击这里下载示例数据集:accounts.json

 其中每个数据都是如下格式:

  {
         "index":{"_id":"1"}
  }
  {
      "account_number": 0,
      "balance": 16623,
      "firstname": "Bradshaw",
      "lastname": "Mckenzie",
      "age": 29,
      "gender": "F",
      "address": "244 Columbus Place",
      "employer": "Euron",
      "email": "bradshawmckenzie@euron.com",
      "city": "Hobucken",
      "state": "CO"
  }

导入示例数据集:

curl -XPOST 'localhost:9200/bank/account/_bulk?pretty' --data-binary "@accounts.json"
curl 'localhost:9200/_cat/indices?v'

 

上图红框表示我们已经成功批量导入1000条数据索引到bank索引中。

13.查询

Sample:

  curl 'localhost:9200/bank/_search?q=*&pretty'
  {
      "took" : 63,
      "timed_out" : false,
      "_shards" : {
      "total" : 5,
      "successful" : 5,
      "failed" : 0
    },
  "hits" : {
    "total" : 1000,
    "max_score" : 1.0,
    "hits" : [ {
      "_index" : "bank",
      "_type" : "account",
      "_id" : "1",
      "_score" : 1.0, "_source" : {"account_number":1,"balance":39225,"firstname":"Amber","lastname":"Duke","age":32,"gender":"M","address":"880 Holmes Lane","employer":"Pyrami","email":"amberduke@pyrami.com","city":"Brogan","state":"IL"}
    }, {
      "_index" : "bank",
      "_type" : "account",
      "_id" : "6",
      "_score" : 1.0, "_source" : {"account_number":6,"balance":5686,"firstname":"Hattie","lastname":"Bond","age":36,"gender":"M","address":"671 Bristol Street","employer":"Netagy","email":"hattiebond@netagy.com","city":"Dante","state":"TN"}
    }, {
      "_index" : "bank",
      "_type" : "account",

上面示例返回所有bank中的索引数据。其中 q=*  表示匹配索引中所有的数据。

等价于:

  curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
  {
    "query": { "match_all": {} }
  }'

14 查询语言

匹配所有数据,但只返回1个:

  curl -XPOST 'localhost:9200/bank/_search?pretty' -d '

  {

    "query": { "match_all": {} },

    "size": 1

  }'

注意:如果siez不指定,则默认返回10条数据。
 

curl -XPOST 'localhost:9200/bank/_search?pretty' -d '

  {

    "query": { "match_all": {} },

    "from": 10,

    "size": 10

  }'

返回从11到20的数据。(索引下标从0开始)

  curl -XPOST 'localhost:9200/bank/_search?pretty' -d '

  {

    "query": { "match_all": {} },

    "sort": { "balance": { "order": "desc" } }

  }'

 上述示例匹配所有的索引中的数据,按照balance字段降序排序,并且返回前10条(如果不指定size,默认最多返回10条)。

 

15.执行搜索

 

  下面例子展示如何返回两个字段(account_number balance)

  curl -XPOST 'localhost:9200/bank/_search?pretty' -d '

  {

    "query": { "match_all": {} },

    "_source": ["account_number", "balance"]

  }'

   

返回account_number 为20 的数据:

  curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
  {
    "query": { "match": { "account_number": 20 } }
  }'

返回address中包含mill的所有数据::

  curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
  {
    "query": { "match": { "address": "mill" } }
  }'

  返回地址中包含mill或者lane的所有数据:

  curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
  {
    "query": { "match": { "address": "mill lane" } }
  }'

  和上面匹配单个词语不同,下面这个例子是多匹配(match_phrase短语匹配),返回地址中包含短语 “mill lane”的所有数据:

  curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
  {
    "query": { "match_phrase": { "address": "mill lane" } }
  }'

 

以下是布尔查询,布尔查询允许我们将多个简单的查询组合成一个更复杂的布尔逻辑查询。

这个例子将两个查询组合,返回地址中含有mill和lane的所有记录数据:

  curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
  {
    "query": {
      "bool": {
        "must": [
          { "match": { "address": "mill" } },
          { "match": { "address": "lane" } }
        ]
      }
    }
  }'

上述例子中,must表示所有查询必须都为真才被认为匹配。

相反, 这个例子组合两个查询,返回地址中含有mill或者lane的所有记录数据:

  curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
  {
    "query": {
      "bool": {
        "should": [
          { "match": { "address": "mill" } },
          { "match": { "address": "lane" } }
        ]
      }
    }
  }'

上述例子中,bool表示查询列表中只要有任何一个为真则认为匹配。

下面例子组合两个查询,返回地址中既没有mill也没有lane的所有数据:

  curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
  {
    "query": {
      "bool": {
        "must_not": [
          { "match": { "address": "mill" } },
          { "match": { "address": "lane" } }
        ]
      }
    }
  }'

  上述例子中,must_not表示查询列表中没有为真的(也就是全为假)时则认为匹配。

 

  我们可以组合must、should、must_not来实现更加复杂的多级逻辑查询。

 

  下面这个例子返回年龄大于40岁、不居住在ID的所有数据:

  curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
  {
    "query": {
      "bool": {
        "must": [
          { "match": { "age": "40" } }
        ],
        "must_not": [
          { "match": { "state": "ID" } }
        ]
      }
    }
  }'

16.过滤filter(查询条件设置)

下面这个例子使用了布尔查询返回balance在20000到30000之间的所有数据。

  curl -XPOST 'localhost:9200/bank/_search?pretty' -d '

  {

      "query": {

        "bool": {

          "must": { "match_all": {} },

          "filter": {

            "range": {

            "balance": {

              "gte": 20000,

              "lte": 30000

            }

          }

        }

      }

    }

  }'

 

 

17 聚合 Aggregations

  下面这个例子: 将所有的数据按照state分组(group),然后按照分组记录数从大到小排序,返回前十条(默认):

  curl -XPOST 'localhost:9200/bank/_search?pretty' -d '

  {

    "size": 0,

    "aggs": {

      "group_by_state": {

        "terms": {

           "field": "state"

        }

      }

    }

  }'

 注意:我们设置size=0,不显示查询hits,因为我们只想看返回的聚合结果。

 

 

 

上述语句类似于以下SQL语句:

SELECT state, COUNT(*) FROM bank GROUP BY state ORDER BY COUNT(*) DESC

下面这个实例按照state分组,降序排序,返回balance的平均值:  

curl -XPOST 'localhost:9200/bank/_search?pretty' -d '

  {

    "size": 0,

    "aggs": {

      "group_by_state": {

        "terms": {

          "field": "state"

        },

        "aggs": {

          "average_balance": {

            "avg": {

              "field": "balance"

            }

          }

        }

      }

    }

  }'

 

本文转载自:http://blog.csdn.net/pilihaotian/article/details/52452014

共有 人打赏支持
mickelfeng

mickelfeng

粉丝 226
博文 964
码字总数 548988
作品 0
成都
高级程序员
Centos6搭建elk系统,监控IIS日志

**所需程序: 服务器端:java、elasticsearch、kikbana 客 户 端:IIS、logstash** 一、服务器端(192.168.10.46)操作: 先建立一个ELK专门的目录: [root@Cent65 ~]mkdir /elk/ 上传到elk...

D杀手D ⋅ 04/24 ⋅ 0

Elasticsearch是如何做到快速索引的

最近在参与一个基于Elasticsearch作为底层数据框架提供大数据量(亿级)的实时统计查询的方案设计工作,花了些时间学习Elasticsearch的基础理论知识,整理了一下,希望能对Elasticsearch感兴趣...

浮躁的码农 ⋅ 05/30 ⋅ 0

CTO详细讲解海量日志处理ELK

ELK实时日志分析平台之Elasticsearch简介 Elasticsearch是一个高度灵活的开源全文检索和分析引擎。它能够迅速(几乎是实时地)地存储、查找和分析大规模数据。通常被用在有复杂的搜索要求的系...

Java架构分享 ⋅ 05/23 ⋅ 0

spring-data-elasticsearch 基本案例详解(三)

『 风云说:能分享自己职位的知识的领导是个好领导。 』 运行环境:JDK 7 或 8,Maven 3.0+ 技术栈:SpringBoot 1.5+, Spring Data Elasticsearch 1.5+ ,ElasticSearch 2.3.2 本文提纲 一、...

夜黑人模糊灬 ⋅ 05/13 ⋅ 0

使用 Docker 和 Elasticsearch 构建一个全文搜索应用程序

如何在超过 500 万篇文章的 Wikipedia 上找到与你研究相关的文章? 如何在超过 20 亿用户的 Facebook 中找到你的朋友(并且还拼错了名字)? 谷歌如何在整个因特网上搜索你的模糊的、充满拼写...

作者: Patrick Triest ⋅ 05/01 ⋅ 0

Elasticsearch 5.5.1的安装和入门教程(转)

说明:转自老阮的文章,业界最简单的入门教程。一切的安装的运行建议不要用root权限,最好是当前用户下的权限。 作者: 阮一峰 日期: 2017年8月17日 全文搜索属于最常见的需求,开源的 Elas...

easonjim ⋅ 01/21 ⋅ 0

当ES赶超Redis,这份ES进修攻略不容错过!

从4月DB-Engines最新发布的全球数据库排名中,我们赫然发现ElasticSearch逆袭超越了Redis,从原先的第9名上升至第8名,而Redis则落后一名,排在了其后。 事实上,这场逆袭并不算太让人意外。...

DBAplus社群 ⋅ 04/15 ⋅ 0

ElasticSearch2.3.3离线搭建(windows+Linux)

1、ElasticSearch介绍 ElasticSearch 是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch 是用Java开发的,并作为Apache许可条...

Coder2018 ⋅ 2017/05/23 ⋅ 3

快速上手 Elasticsearch 的几个建议

相信不少同学都听说过 Elasticsearch,作为目前最流行的搜索引擎实现方案,越来越多的公司在自己的架构中引入,而其应用场景也从搜索引擎扩展到了日志存储分析、大数据分析领域,本文尝试给初...

rockybean ⋅ 05/21 ⋅ 0

使用阿里云Elasticsearch搭建ELK日志系统

1. 搭建专用网络 1.1 登录专有网络管理控制台 阿里云Elasticsearch是搭建在专有网络上的,所以我们先开通阿里云专有网络, 点击开通 . 1.2 创建专有网络 点击创建专有网络 在专有网络名称和交...

pcdog ⋅ 05/21 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JPA入门,配置文件的设置

<?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http......

码农屌丝 ⋅ 12分钟前 ⋅ 0

Java基础——面向对象和构造器

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 静态成员介绍 为什么要有静态成员?静态成员用来...

凯哥学堂 ⋅ 13分钟前 ⋅ 0

vmware中Centos 7 linux的LVM磁盘扩容

系统是RHEL7(centos7差不多一样) 关闭系统,在vmware、设置、硬盘、扩展、输入数字大于当前系统内存、点击扩展。 开机再查看磁盘信息 fdisk -l 注意:可以看出sda磁盘增加了,但是根目录还...

gugudu ⋅ 24分钟前 ⋅ 0

JAVA线程sleep和wait方法区别

昨天面试,突然被问到sleep 和 wait的区别,一下子有点蒙,在这里记一下,以示警戒。 首先说sleep,sleep就是正在执行的线程主动让出cpu,cpu去执行其他线程,在sleep指定的时间过去后,cpu...

徐玉强 ⋅ 26分钟前 ⋅ 0

vuex学习--模块

随着项目复杂性增加,共享状态也越来越多。需要对转态操作进行分组,分组后在进行分组编写。学习一下module:状态管理器的模块组操作。 首先是声明: const moduleA={ state,mutations,g...

大美琴 ⋅ 28分钟前 ⋅ 0

Selenium 简单入门

安装 pip install selenium 驱动下载 https://chromedriver.storage.googleapis.com/index.html 下载最新的驱动,放入path中,可以放入Python的scripts目录下,也可以放入Chrome安装目录,并...

阿豪boy ⋅ 30分钟前 ⋅ 0

292. Nim Game - LeetCode

Question 292. Nim Game Solution 思路:试着列举一下,就能发现一个n只要不是4的倍数,就能赢。 n 是否能赢1 true2 true3 true4 false 不论删除几,对方都能一把赢5 t...

yysue ⋅ 今天 ⋅ 0

6.5 zip压缩工具 6.6 tar打包 6.7 打包并压缩

zip压缩工具 zip命令可以压缩目录和文件,-r 压缩目录。 zip使用方法 zip 1.txt.zip 1.txt //压缩文件 zip -r 123.zip 123/ //压缩目录 unzip 1.txt.zip //解压 unzip 123.zip -d /root/456...

Linux_老吴 ⋅ 今天 ⋅ 0

react-loadable使用跳坑

官方给react-loadable的定义是: A higher order component for loading components with dynamic imports. 动态路由示例 withLoadable.js import React from 'react'import Loadable fro......

pengqinmm ⋅ 今天 ⋅ 0

记录工作中遇到的坑

1、ios safari浏览器向下滚动会触发window resize事件

端木遗风 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部