在Elasticsearch中,提供了功能丰富的RestfulApi的操作,包括基本的CRUD(增删改查) 创建索引 删除索引等操作
创建非结构化索引
在Lucene中,创建索引是需要定义字段名称以及字段的类型的,在ElasticSearch中提供了非结构化的索引,就是不需要创建索引结构,即可写入数据到索引中,实际上在ElasticSearch底层会进行结构化操作,此操作对用户是透明的,即ES会去自动判断类型
创建空索引:
PUT 请求 /haoke #这是索引名
{
"settings":{
"index":{
"number_of_shards":"2", #分片数
"number_of_replicas":"0" #副本数
}
}
}
删除索引
DELETE 请求 /haoke #索引名
回复下面这个说明删除成功
{
"acknowledged":true
}
插入数据
URL规则
POST /{索引}/{类型}/{id} # id非必传,不传则使用默认生成的唯一标识符
POST /haoke/user/1001 #id非必填
#数据
{
"id":1001, #注意这个id不是主键id而是一个字段名 真正的主键id还是需要在URL中指定
"name":"zhangsan",
"age":20,
"sex":"男"
}
如果插入的数据看不到的话,参考之前的文章 安装es和es-head插件里面有解决方案
非结构化的索引,不需要事先创建,直接插入数据默认创建索引,自动匹配
不指定id插入数据
POST /haoke/user/
{
"id":1002, #注意这个id不是主键id而是一个字段名 真正的主键id还是需要在URL中指定
"name":"lisi",
"age":22,
"sex":"女"
}
这里的lisi对应的主键id就是es自动生成的id
更新数据
在ElasticSearch中是不允许修改的,但是可以以覆盖的方式进行更新
PUT /haoke/user/1001 #必须指定id(主键的id)
{
"id":1001,
"name":"张三",
"age":25,
"sex":"女"
}
如果参数变成这样
PUT /haoke/user/1001 #必须指定id(主键的id)
{
"id":1001,
"name":"张三",
"age":25,
# sex字段去掉
}
可以发现 id为1001这条数据的sex字段为空了,证明了是以覆盖的方式更新的
可以进行局部更新吗? 可以
局部更新的步骤如下
- 从旧文档中检索json
- 修改它
- 删除旧文档
- 索引新文档
示例:
# 注意:这里多了_update标识
POST /haoke/user/1001/_update
# 注意 新版的API可能会修改成
POST /haoke/user/_update/1001,但是咱们用的现在这个还不是
{
# 这个doc是es中规定的,没有什么意义,但是必须要封装一下
"doc":{
"age":23
}
}
# 标识单独对id为1001的文档中的age进行修改
删除数据
DELETE /haoke/user/1001 # _id必传
如果删除不存在的数据,会返回404
说明:
删除一个文档不会立即从磁盘中删除,它只是被标记成已删除,ElasticSearch将会在你之后添加更多索引的时候才会在后台进行删除内容的清理
搜索数据
根据id进行搜索
GET /haoke/user/{_id}
未找到数据的返回结果 404
找到了数据的返回结果
{
"_index": "haoke", #索引名
"_type": "user", #文档类型
"_id": "xbIB7XEBNovl8aBHn5y4",#_id
"_version": 1, #版本,对其进行更新或删除操作都会更新版本只不过删除操作后就看不到这条数据了
"found": true,#是否找到
"_source": { #原始数据
"id": 1002,
"name": "lisi",
"age": 22,
"sex": "女"
}
}
查询全部
GET /haoke/user/_search
响应:默认返回10条数据
关键字搜索数据
# 查询年龄等于22的用户
GET /haoke/user/_search?q=age:22
DSL搜索
ElasticSearch提供了丰富且灵活的查询语言叫做DSL查询,它允许构建更加复杂,强大的查询
DSL(Domain Specific Language特定领域语言)以json请求体的形式出现
POST /haoke/user/_search
#请求体
{
"query":{
"match":{ # match只是查询的一种
"age":22
}
}
}
复杂查询 查询年龄大于30并且为男性的用户
POST /haoke/user/_search
{
"query":{ # 表示这是一个查询
"bool":{ # 表示有两个查询项
"filter":{ # 表示这是一个过滤
"range":{ # 表示这是一个范围
"age":{ # 表示对年龄过滤
"gt":29 # 表示年龄大于29
}
}
},
"must":{ # 表示这是一个满足项
"match":{ # 表示匹配 只能使用等于
"sex":"男" # 表示性别必须为男
}
}
}
}
}
全文检索
POST /haoke/user/_search
{
"query":{ #表示查询
"match":{ #表示匹配
"name":"张三 李四" #表示搜索张三或者李四 中间用空格分隔
}
}
}
高亮显示 聚合
高亮显示
{
"query":{ #表示查询
"match":{ #表示匹配
"name":"张三 李四" #表示搜索张三或者李四 中间用空格分隔
}
},
"highlight":{ #表示设置高亮
"fields":{ # 表示设置字段
"name":{} # 表示设置name字段
}
}
}
聚合
在ElasticSearch中,支持聚合操作,类似SQL中的group by操作
POST /haoke/user/_search
{
"aggs":{
"all_interests":{
"terms":{ # 以哪个字段作为聚合
"field":"age" #以age作为聚合
}
}
}
}
#这样会按照年龄进行划分查看个数