Elasticsearch 系列教程 - Elasticsearch API基本操作

Elasticsearch


Elasticsearch提供了非常全面和强大的以JSON为数据交互格式REST API,利用这个REST API你可以同你的集群交互。比如:

  • 检查你的集群、节点和索引的健康状态、和各种统计信息
  • 管理你的集群、节点、索引数据和元数据
  • 对你的索引进行CRUD(创建、读取、更新和删除)和搜索操作
  • 执行高级的查询操作,像是分页、排序、过滤、脚本编写(scripting)、小平面刻画(faceting)、聚合(aggregations)和许多其它操作

  • REST(REpresentational State Transfer)从字面看就是“表述性状态传输”它通常是开发的一种约定,当所有的开发者都遵从这种约定的时候,可以大大简化开发的沟通成本,REST约定用HTTP的请求头POST、GET、PUT、DELETE正好可以对应CRUD(Create、Read、Update、Delete)四种数据操作,这里给大家一个传送门 理解RESTful架构
HTTP方法 数据处理 说明
POST Create 新增一个没有ID的资源
GET read 取得一个资源
PUT Update 更新一个资源 或新增一个含ID的资源
DELETE Delete 删除一个资源
  • Elasticsearch官方提供了多种程序语言的客户端——Groovy,Javascript, .NET,PHP,Perl,Python,以及 Ruby——还有很多由社区提供的客户端和插件,所有这些可以在文档中找到

一个 Elasticsearch 请求和任何 HTTP 请求一样由若干相同的部件组成:

curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'

< > 标记的部件:

标记的部件 说明
VERB 适当的 HTTP 方法 或 谓词 : GET、 POST、 PUT、 HEAD 或者 DELETE。
PROTOCOL http 或者 https
HOST Elasticsearch 集群中任意节点主机名,或者用 localhost 代表本地机器上的节点
PORT 运行 Elasticsearch HTTP 服务的端口号,默认是 9200
PATH 请求API 的路径(例如 _count 将返回集群中文档数量)。Path 可以包含多个组件,例如:_cluster/stats 和 _nodes/stats/jvm 。
QUERY_STRING 任意可选的查询字符串参数 (例如 ?pretty 将格式化地输出 JSON 返回值,使其更容易阅读)
BODY 一个 JSON 格式的请求体 (如果请求需要的话)

不管你使用的是java、PHP还是其他语言,首先要了解的是在api下对数据的CURD操作,万变不离其宗,归根究底都是利用REST API进行ES数据的操作

本人使用的ELK中kibanna进行的API操作,当然类似postman之类的工具也是可以的。

1、集群操作

1.1、索引初始化

创建索引之前可以对索引做初始化操作,比如指定shards数量以及replicas的数量。

CURL - XPUT 'http://your host:9200/library/' -d '{
    "settings":{
        "index":{
            "number_of_shards":5,
            "number_of_replicas":1
        }
    }
}'

1.2、要检查集群健康

curl -XGET 'http://your host:9200/_cat/health?v'

1.3、获得节集群中的节点列表

curl -XGET 'http://your host:9200/_cat/nodes?v'

1.4、计算集群中的文档数量

curl -XGET 'http://your host:9200/_count?pretty'

1.5、列出所有的索引

curl -XGET 'http://your host:9200/_cat/indices?v'

2、创建索引 & 插入文档

创建索引:

需要注意创建索引的时候不能有大写字母

简单创建索引

PUT http://your host:9200/xiaot_test

然后使用head插件查看如下图2.1

file

由图2.1可以看出,在不指定配置情况下,默认情况下的分片数量是5个副本的数量是1个,那么咱们在创建索引的时候制定number_of_shards和number_of_replicas参数来制定分片和副本的数量。

PUT http://your host:9200/xiaot_test
{
   "settings" : {
      "index" : {
         "number_of_shards" : 3, "number_of_replicas" : 1
      }
   }
}

// 这里setting参数可以简写为:
{
   "settings" : {"number_of_shards" : 3, "number_of_replicas" : 1}
}

结果如下图2.2

file

当然你创建好索引后,也可以后续对索引相关配置进行update,这个咱们后面说;

下面咱们再来看看创建索引的时候自定义字段类型

PUT http://your host:9200/xiaot_test
{
   "settings" : {
      "number_of_shards" : 3
   },

   "mappings" : {
      "type1" : {
         "properties" : {
            "name" : { "type" : "string" }, 
            "msg" : {"type":"string"}
         }
      }
   }
}

我们创建了个xiaot_test索引,制定了它的类型为type1,类型中有2个字段(name,msg),字段的数据类型string。


插入文档

索引我们已经建好了,相当于我们把数据库和数据表已经建好,那么接下来咱们就向咱们建好的索引里添加数据吧

# /索引名/类型/[id] id可以自己指定
POST http://47.90.66.155:9200/xiaot_test/type1
{
      "name": "xiaoT",
      "msg" :"xiaoT is a blog"
}

#返回值 标识创建成果
{
    "_index": "xiaot_test",
    "_type": "type1",
    "_id": "AWAG8dJd-w5qlGbttSEn",
    "_version": 1,
    "result": "created",
    "_shards": {
        "total": 2,
        "successful": 2,
        "failed": 0
    },
    "created": true
}

3、查询

3.1、匹配查询

# 这里指定了类型 当然也可以不指定
GET http://47.90.66.155:9200/xiaot_test/type1/_search
{
   "query":{
      "match" : {
        "name":"hahhaha"
      }
   }
}

# 结果
{
    "took": 1,
    "timed_out": false,
    "_shards": {
        "total": 3,
        "successful": 3,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 1,
        "max_score": 0.2876821,
        "hits": [
            {
                "_index": "xiaot_test",
                "_type": "type1",
                "_id": "AWAG-Z0I-w5qlGbttSG-",
                "_score": 0.2876821,
                "_source": {
                    "name": "hahhaha",
                    "msg": "hahahhahha"
                }
            }
        ]
    }
}

3.2、Bool 查询

布尔查询是最常用的组合查询,不仅将多个查询条件组合在一起,并且将查询的结果和结果的分组合在一起。当查询条件是多个表达式的组合时,布尔查询非常有用,实际上,布尔查询把多个子查询组合(combine)成一个布尔表达式,所有子查询之间的逻辑关系是与(and);只有当一个文档满足布尔查询中的所有子查询条件时,ElasticSearch引擎才认为该文档满足查询条件。布尔查询支持的子查询类型共有四种,分别是:must,should,must_notfilter

  • must子句:文档必须匹配must查询条件;
  • should子句:文档应该匹配should子句查询的一个或多个;
  • must_not子句:文档不能匹配该查询条件;
  • filter子句:过滤器,文档必须匹配该过滤条件,跟must子句的唯一区别是,filter不影响查询的score;
GET http://47.90.66.155:9200/xiaot_test/type1/_search
{  
    "query" : {  
        "bool" : {  
            "must": [
                {
                    "match" : {  
                        "name" : "hahhaha"
                    }
                },
                {
                    "match" : {  
                       "msg" : "hahahhahha"
                    }
                }
            ]
        }   
    }  

}

# 结果
{
    "took": 2,
    "timed_out": false,
    "_shards": {
        "total": 3,
        "successful": 3,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 1,
        "max_score": 0.5753642,
        "hits": [
            {
                "_index": "xiaot_test",
                "_type": "type1",
                "_id": "AWAG-Z0I-w5qlGbttSG-",
                "_score": 0.5753642,
                "_source": {
                    "name": "hahhaha",
                    "msg": "hahahhahha"
                }
            }
        ]
    }
}

后面会相信展开给大家讲述 暂时参考

3.3、复杂查询

让我们来构造一个稍微复杂的例子:一个过滤的查询包含一个过滤器和一个查询。这在elasticsearch查询中是非常常见的。

curl -XGET 'localhost:9200/my_index/my_type/_search' -d '{  
    "query" : {  
        "filtered" : {  
            "filter" : {  
                "term" : {  
                    "my_field" : "abc"  
                }  
            },  
            "query" : {  
                "match" : {  
                    "my_other_field" : "xyz"  
                }  
            }  
        }  
    }  
}'

3、更新索引 & 更新文档

更新索引

update-index-settings API 动态修改副本数:

PUT http://your host:9200/xiaot_test/_settings
{
    "number_of_replicas": 1
}

更新文档

# /索引/类型/文档ID号
POST http://your host:9200/xiaot_test/type1/1
{
      "name": "121123333333333111",
      "msg" :"hahah11111111111111111hahha"
}

# 返回值 _version 每修改一次会自增一次 代表版本号
{
    "_index": "xiaot_test",
    "_type": "type1",
    "_id": "AWAG8dJd-w5qlGbttSEn",
    "_version": 3,
    "result": "updated",
    "_shards": {
        "total": 2,
        "successful": 2,
        "failed": 0
    },
    "created": false
}

4、删除索引 & 删除文档

删除索引:

# /索引
DELETE http://your host:9200/xiaot_test

注意:

  1. 如果是批量删除的话可以使用 * ,_all (有时候为了防止误删除,可以在ES配置elasticsearch.yml属性的action.destructive_requires_name为true来禁止使用通配符和_all删除索引操作)

  2. 删除多个使用逗号分隔符

删除文档:

# /索引/类型/文档ID号
DELETE http://your host:9200/xiaot_test/type1/1