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

环境:

  • Windows10企业版X64
  • Cygwin64
  • ElasticSearch-2.4.1

检测集群是否健康。 确保9200端口号可用:

$ curl.exe 'localhost:9200/_cat/health?v'

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

获取集群的节点列表:

$ curl.exe 'localhost:9200/_cat/nodes?v'

列出所有索引:

$ curl.exe 'localhost:9200/_cat/indices?v'

可见:有一个叫customer的索引,它有5个私有的分片以及1个副本,在它里面有3个文档。

创建一个名为“customer2”的索引:

$ curl.exe -XPUT 'localhost:9200/customer2?pretty'

插入和获取。现在插入一些数据到集群索引:

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

获取GET,语句如下:

$ curl.exe -XGET 'localhost:9200/customer/external/1?pretty'
其中含义为:获取customer索引下类型为external,id为1的数据,pretty参数表示返回结果格式美观。

 删除索引 DELETE:

$ curl.exe -XDELETE 'localhost:9200/customer?pretty'

修改数据:

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

 

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

上述操作将id为1的name修改为Jane Doe。

更新数据。

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

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

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

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

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

 

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

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

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

批处理:下面语句将在一个批量操作中执行创建索引(单引号'不能与数据出现在同一行!):

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

导入示例数据集(数据集文件名为accounts.json):

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

查询

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

$curl.exe 'localhost:9200/bank/_search?q=*&pretty'

等价于:

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

查询语言。匹配所有数据,但只返回1个:

$ curl.exe -XPOST 'localhost:9200/bank/_search?pretty' -d '
  {
    "query": { "match_all": {} },
    "size": 1
  }'

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

$ curl.exe -XPOST 'localhost:9200/bank/_search?pretty' -d '
  {
    "query": { "match_all": {} },
    "from": 10,
    "size": 10
  }'

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

$ curl.exe -XPOST 'localhost:9200/bank/_search?pretty' -d '
  {
    "query": { "match_all": {} },
    "sort": { "balance": { "order": "desc" } }
  }'

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

执行搜索

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

$ curl.exe -XPOST 'localhost:9200/bank/_search?pretty' -d '
  {
    "query": { "match_all": {} },
    "_source": ["account_number", "balance"]
  }'

返回account_number 为20 的数据:

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

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

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

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

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

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

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

以下是布尔查询,布尔查询允许我们将多个简单的查询组合成一个更复杂的布尔逻辑查询。这个例子将两个查询组合,返回地址中含有mill和lane的所有记录数据:

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

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

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

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

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

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

$ curl.exe -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.exe -XPOST 'localhost:9200/bank/_search?pretty' -d '
  {
    "query": {
      "bool": {
        "must": [
          { "match": { "age": "40" } }
        ],
        "must_not": [
          { "match": { "state": "ID" } }
        ]
      }
    }
  }'

过滤filter(查询条件设置)

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

$ curl.exe -XPOST 'localhost:9200/bank/_search?pretty' -d '
  {
      "query": {
        "bool": {
          "must": { "match_all": {} },
          "filter": {
            "range": {
            "balance": {
              "gte": 20000,
              "lte": 30000
            }
          }
        }
      }
    }
  }'

聚合 Aggregations

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

$ curl.exe -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.exe -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

posted @ 2016-11-04 19:41  xuxy03  阅读(1514)  评论(0)    收藏  举报