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

Stella981
• 阅读 618
  1. 我们通常用用_cat API检测集群是否健康。 确保9200端口号可用:

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

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

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

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

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

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

  返回结果:

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

  4.创建索引

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

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

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

  结果如下:

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

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

  上图中红框所表示的是:我们有一个叫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 表示插入成功。

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

  获取GET,语句如下:

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

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

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

  6.删除索引 DELETE

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

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

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

  表示索引删除成功。

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

  curl -X :///

  :REST风格的语法谓词

  :节点ip

  :节点端口号,默认9200

  :索引名

  :索引类型

  :操作对象的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'

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

  上图红框表示我们已经成功批量导入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"]

  }'

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

  返回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,因为我们只想看返回的聚合结果。

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

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

  上述语句类似于以下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"

            }

          }

        }

      }

    }

  }'

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

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
Java获得今日零时零分零秒的时间(Date型)
publicDatezeroTime()throwsParseException{    DatetimenewDate();    SimpleDateFormatsimpnewSimpleDateFormat("yyyyMMdd00:00:00");    SimpleDateFormatsimp2newS
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这