数据格式
Elasticsearch 是面向文档性数据库,一条数据在这里就是一个文档。
我们将 Elasticsearch 里存储文档数据和关系型数据库 MySQL 存储数据的概念进行一个类比
ES 里的 Index 可以看作一个库,而 Type 相当于表,Document 相当于表的行。
这里 Type 的概念已经逐渐弱化了,ES6 中,一个 Index 下只能包含一个 Type,ES7 中,Type已经被删除了。
索引操作
我没有安装ES的图形化界面工具,我这里就使用 Postman 来进行测试
创建索引
对比关系型数据库,创建索引就相当于创建数据库
向 ES 服务器发 PUT 请求:http://127.0.0.1:9200/shopping
解释:PUT 表示创建 请求: http://ES地址/创建索引的名字
不能重复创建。
结果如下图则表示创建成功了:
查询索引
- 查询一个索引
向 ES 服务器发 GET 请求:http://127.0.0.1:9200/shopping
解释:GET 表示查询 请求: http://ES地址/创建索引的名字
返回索引的信息,结果如下图:
- 查询全部索引信息
向 ES 服务器发 GET 请求:http://127.0.0.1:9200/_cat/indices?v
解释: GET 表示查询 请求: http://ES地址/固定路径 v 参数表示展示详细信息
_cat 表示查询的意思
结果如下图:
删除索引
向 ES 服务器发 DELETE 请求:http://127.0.0.1:9200/shopping
解释:DELETE 表示删除 请求: http://ES地址/需要删除的索引名字
结果如下图:
现在再来查询就已经没有这个索引了
文档操作
创建文档
索引已经创建好之后,接下来我们创建文档,并添加数据。这里的文档可以类比为关系型数据库中的表数据,添加的数据格式为 JSON 格式
向 ES 服务器发 POST 请求:http://127.0.0.1:9200/shopping/_doc
解释: 请求: http://ES地址/操作的索引名字 _doc 表示索引中添加文档数据的意思
不能使用 PUT 请求 (结果可能不幂等)
请求体内容为:
{
"title":"小米手机",
"category":"小米",
"images":"http://127.0.0.1/xm.jpg",
"price":3999.00
}
结果如下图:
从上图中可以看到服务器返回了一个 id 属性,这个是服务器随机生成的,如果我们需要指定 id,可以在刚才的路径后面拼接 id 即可,如:
http://127.0.0.1:9200/shopping/_doc/我们自己的id
如果想要更明确我们的操作是新增,可以把路径中的 _doc 修改为 _create,都可以完成创建
http://127.0.0.1:9200/shopping/_create/1002
查询文档
向 ES 服务器发 GET 请求:http://127.0.0.1:9200/shopping/_doc/1001
解释:GET 表示查询 请求: http://ES地址/操作的的索引名字/_doc/查询文档的id _doc表示文档操作
结果如下图:
可以看到在返回的 _source 中就是我们刚才存入的数据
如果查询的 id 不存在,则会返回 false,如下图:
查询所有数据
向 ES 服务器发 GET 请求:http://127.0.0.1:9200/shopping/_search
解释:GET 表示删除 请求: http://ES地址/操作的的索引名字/_search
结果如下图:
修改文档
- 完全覆盖
向 ES 服务器发 PUT 请求:http://127.0.0.1:9200/shopping/_doc/1001
解释:PUT 表示修改 请求: http://ES地址/操作的的索引名字/_doc/修改文档的id _doc表示文档操作
把修改之后的数据放到请求体中发送给服务器
{
"title":"小米手机",
"category":"小米",
"images":"http://127.0.0.1/xm.jpg",
"price":4999.00
}
结果如下图:
现在再查询查出来的就是修改后的值了
- 局部修改
向 ES 服务器发 POST 请求:http://127.0.0.1:9200/shopping/_update/1001
解释:POST 表示修改 请求: http://ES地址/操作的的索引名字/_update/修改文档的id _update 表示修改操作
把修改之后的数据放到请求体中发送给服务器
doc 中填写需要修改的数据
{
"doc":{
"title":"华为手机"
}
}
结果如下:
现在再查询就是修改后的数据了
删除文档
向 ES 服务器发 DELETE 请求:http://127.0.0.1:9200/shopping/_doc/1001
解释:DELETE 表示删除 请求: http://ES地址/操作的的索引名字/_doc/修改文档的id _doc 表示文档操作
结果如下:
查询文档
在实际开发中,使用最多的还是查询操作,这里单独拿出来介绍一下。
条件查询
向 ES 服务器发 GET 请求:http://127.0.0.1:9200/shopping/_search?q=category:小米
解释:GET 表示查询 请求: http://ES地址/操作的的索引名字/_search
_search 表示查询操作 q 表示查询条件 category:小米 中:就是 = 的意思
该请求表示查询 shopping 索引中 category为 小米 的数据
结果如下:
上面我们是在路径上面写的查询条件,在一些情况下,并不合适,我们也可以把查询条件写在请求体中,如:
query: 查询条件
match: 匹配条件
{
"query":{
"match":{
"category":"小米"
}
}
}
结果和上面一样
分页查询
向 ES 服务器发 GET 请求:http://127.0.0.1:9200/shopping/_search
解释:GET 表示查询 请求: http://ES地址/操作的的索引名字/_search
请求体:
match_all: 全量匹配,就是查所有的数据
from:数据起始位置
size:每页数据条数
{
"query":{
"match_all":{
}
},
"from":0,
"size":2
}
上面查询的数据都是返回的全部字段,如果我们只想要返回指定字段,如 title,我们可以在请求体中进行设置
_source:需要返回的字段
{
"query":{
"match_all":{
}
},
"from":0,
"size":2,
"_source":["title"]
}
如果需要排序:
sort: 表示排序
price:按照哪个字段排序
"order":"desc" 按照降序排列
{
"query":{
"match_all":{
}
},
"from":0,
"size":2,
"_source":["title"],
"sort":{
"price":{
"order":"desc"
}
}
}
多条件查询
向 ES 服务器发 GET 请求:http://127.0.0.1:9200/shopping/_search
解释:GET 表示查询 请求: http://ES地址/操作的的索引名字/_search
具体的查询条件在请求体中书写
bool : 表示查询条件
must : 表示全部要同时成立
should : 表示或者,有一个成立即可
must 可以换成 should
{
"query":{
"bool":{
"must":[
{
"match":{
"category":"小米"
}
},
{
"match":{
"price":"3999.00"
}
}
]
}
}
}
范围查询
添加一个 filter 来设置查询的范围
{
"query":{
"bool":{
"should":[
{
"match":{
"category":"小米"
}
},
{
"match":{
"category":"华为"
}
}
],
"filter":{
"range":{
"price":{
"gt":4000
}
}
}
}
}
}
全文检索
请求和上面的查询请是一样的,我们只需要修改查询的请求体即可
这样就是把 小花 拆开来进行全文检索
{
"query":{
"match":{
"category":"小花"
}
}
}
如果我们需要完全匹配
{
"query":{
"match_phrase":{
"category":"小花"
}
}
}
高亮显示
{
"query":{
"match_phrase":{
"category":"小"
}
},
"highlight":{
"fields":{
"category":{}
}
}
}
聚合操作
{
"aggs":{ //聚合操作
"price_group":{// 统计结果的名称,随意起名字
"terms":{ // 分组 avg 表示平均值
"field":"price" // 分组字段
}
}
}
}
映射关系
向 ES 服务器发 PUT 请求:http://127.0.0.1:9200/user/_mapping 解释:PUT 请求: http://ES地址/操作的的索引名字/_mapping
index 为 false 表示不可以通过这个来作为查询条件
请求方式改为 GET 即可查询映射关系