Rest 风格说明
Rest 是一种软件架构风格,而不是标准。Reat 只是提供了一组设计原则和约束条件,它主要用于客户端和服务器交互类的软件,基于这个风格设计的软件可以更加简洁、有层次、易于实现缓存等机制。
基本 Rest 命令说明:
Method | URL 地址 | 描述 |
---|---|---|
GET | localhost:9200/索引名称/类型名称/文档ID | 根据文档ID查询文档 |
POST | localhost:9200/索引名称/类型名称/_search | 查询所有数据 |
POST | localhost:9200/索引名称/类型名称 | 创建文档(随机文档ID) |
PUT | localhost:9200/索引名称/类型名称/文档ID | 创建文档(指定文档ID) |
POST | localhost:9200/索引名称/类型名称/文档ID/_update | 修改文档 |
DELETE | localhost:9200/索引名称/类型名称/文档ID | 删除文档 |
索引的基本操作
基础测试
1、进入 kibana 的控制台,输入一下命令:
# PUT demo1索引 type1类型 id
PUT /demo1/type1/1
{
"name": "touyel", # 属性
"age": 3 # 属性
}
2、name 这个字段用不用指定字段类呢,毕竟关系型数据库都是需要指定类型的。
官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-types.html
-
字符串类型
-
- 整形:byte、short、integer、long
- 浮点型:float、half_float、scaled_float、double
-
日期类型
-
布尔值类型
-
二进制类型
-
...
3、指定字段类型
创建索引和规则
PUT /demo2
{
"mappings": {
"properties": {
"name": {
"type": "text"
},
"age": {
"type": "integer"
},
"birth": {
"type": "date"
}
}
}
}
4、获取信息
GET demo2
5、查看默认信息
如果文档没有字段没有指定类型,那么 ElasticSearch 就会默认给我们的字段配置类型。
拓展命令:
通过 GET _cat/
命令可以获取 ElasticSearch 很多信息。
# 获取健康值
GET _cat/health
GET _cat/indices?v
......
修改
旧办法:直接 PUT 覆盖
PUT /demo3/_doc/1
{
"name": "二两",
"age": 18,
"birth": "2001-01-01"
}
使用 POST 方式修改:
POST /demo3/_doc/1/_update
{
"doc": {
"name": "穷鬼二两"
}
}
最新方式修改(推荐):
POST /demo3/_update/1
{
"doc": {
"age": 99
}
}
删除
通过 DELETE 命令实现删除,根据请求判断是删除索引还是删除文档记录。
删除索引:
DELETE 索引名称
删除文档:
DELETE demo3/_doc/1
文档的基本操作(重点)
基本操作
1、添加数据
PUT /demo5/user/1
{
"name": "小黑",
"age": 18,
"tags": ["温柔", "暖", "乐观"]
}
添加多一点数据....
2、获取数据
简单的搜索,根据ID 查询:
3、更新数据 POST (推荐)
POST /demo5/_update/1
{
"doc": {
"name": "黑飞飞"
}
}
简单的条件查询:
GET demo5/user/_search?q=name:飞
复杂搜索
GET demo5/user/_search
{
"query": {
"match": {
"name": "飞"
}
}
}
hits:
索引和文档的信息
查询的结果总数
查润出来的具体文档
通过 score 判断谁更加符合结果
结果过滤:
GET demo5/user/_search
{
"query": {
"match": {
"name": "飞"
}
},
"_source": ["name", "age"]
}
通过特定字段进行排序:
GET demo5/user/_search
{
"query": {
"match": {
"name": "飞"
}
},
"_source": ["name", "age"],
"sort": [
{
"age": {
"order": "desc"
}
}
]
}
分页查询
GET demo5/user/_search
{
"query": {
"match": {
"name": "飞"
}
},
"_source": ["name", "age"],
"sort": [
{
"age": {
"order": "desc"
}
}
],
"from": 1, // 从第几个数据开始
"size": 1 // 返回多少条数据
}
布尔值查询
GET demo5/user/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "Jack"
}
},
{
"match": {
"age": 22
}
}
]
}
}
}
must ,所有的条件都需要符合才能查询出来。(where id = x and username = xxx)
should,条件符合一个就行。(where id = x or username = xxx)
must_not,指定字段不为某个值。 (not)
过滤器
- gt 大于
- get 大于等于
- lt 小于
- lte 小于等于
查询 age 大于等于30小于等于50的:
GET demo5/user/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "飞"
}
}
],
"filter": [
{"range": {
"age": {
"gte": 30,
"lte": 50
}
}}
]
}
}
}
匹配多个条件
多个条件使用空格隔开即可,只要满足其中一个结果就可以查询到,这时候就可以通过 score 进行判断。
GET demo5/user/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"tags": "歌 蹦迪"
}
}
]
}
}
}
精确查询
term 查询是直接通过倒排索引指定的词条进行精确查询的。
关于分词:
- term:直接查询精确的
- match:会使用分词器解析,然后再查询
两个类型:
- text:可以被分词器解析
- keyword:不会被分词器解析
前戏:
PUT demo6
{
"mappings": {
"properties": {
"name": {
"type": "text"
},
"desc": {
"type": "keyword"
}
}
}
}
PUT demo6/_doc/1
{
"name": "touyel",
"desc": "混子叶"
}
PUT demo6/_doc/2
{
"name": "黑子",
"desc": "混子叶的黑子"
}
进行精确查询:
GET demo6/_search
{
"query": {
"term": {
"desc": "混子叶"
}
}
}
精确查询多个值
GET demo6/_search
{
"query": {
"bool": {
"should": [
{
"term": {
"desc": "混子叶"
}
},
{
"term": {
"desc": "混子叶的黑子"
}
}
]
}
}
}
高亮查询
GET demo5/_search
{
"query": {
"match": {
"name": "飞"
}
},
"highlight": {
"fields": {
"name": {}
}
}
}
自定义高亮标签:
GET demo5/_search
{
"query": {
"match": {
"name": "飞"
}
},
"highlight": {
"pre_tags": "<p class='key'>",
"post_tags": "</p>",
"fields": {
"name": {}
}
}
}
小结
匹配:
- 按条件匹配
- 精确匹配
- 区间范围匹配
- 匹配字段过滤
- 多条件查询
- 倒排索引
- 高亮查询