Elasticsearch提供了Rest风格http请求接口。可以使用可发起Http请求的工具如Postman进行操作或者Kibana可视化工具操作。
API文档地址:https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started.html
Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。本质也是一个存储数据库,很多概念与Mysql数据库类似
Elasticsearch | MySql |
---|---|
索引库(indexes) | Databases 数据库 |
类型(type) | Table 数据表 |
文档(Document) | Row 行 |
字段(Field) | Columns 列 |
映射配置(mappings) | 表结构 |
对比方便理解
1、操作索引库 indexes
添加:PUT /my_index (还可以传递参数settings进行索引库设置,后续学到再说)
查看:GET /my_index
删除:DELETE /my_index
2、操作类型及映射 type&mappings
索引库相当于数据库,有了索引库就可以建立类型,相当于数据库中的表。建立数据库表需要字段和字段约束,这种数据表-字段-字段约束的关系在es中即字段映射mappings。
本次学习基于es7.2版本,与之前版本发生变化
ES数据存储结构变化:去除了Type
es6时,官方就提到了es7会删除type,并且es6时已经规定每一个index只能有一个type。在es7中使用默认的_doc作为type,官方说在8.x版本会彻底移除type。
api请求方式也发送变化,如获得某索引的某ID的文档:GET index/_doc/id其中index和id为具体的值原文地址:https://blog.csdn.net/deaidai/article/details/90523059
2.1 版本6.x创建类型和映射(需要先创建索引库)
语法:
PUT /索引库名/_mapping/类型名称 或 索引库名/类型名称/_mapping { "properties": { "字段名": { "type": "类型", "index": true, "store": true, "analyzer": "分词器" } } } # 解释如下: 类型名称:type名,类似于数据库中的表 字段名:表中的字段,下面指定字段的许多属性,例如: type:数据类型,可以是text、long、short、date、integer、object等 index:是否索引,默认为true store:是否存储,默认为false analyzer:分词器,后续学习 # 举例,建立用户表user,有用户名username和密码password两个字段 PUT /my_index/_mapping/user { "properties": { "username": { "type": "text" }, "password": { "type": "keyword", "index": false } } }
2.2 版本7.x之后创建映射(需要先创建索引库)
7.x版本取消了type,统一为_doc
PUT /索引库名/_mapping { "properties": { "字段名": { "type": "类型", "index": true, "store": true, "analyzer": "分词器" } } }
所以上述user表可直接写为:
PUT /user PUT /user/_mapping { "properties": { "username": { "type": "text" }, "password": { "type": "keyword", "index": false } } }
2.3 映射属性详解
这里查找了几种常用的属性,后续遇到其他的了再补充
-
type 数据类型
总结几个常用的:
-
String类型:分为两种:
- text:可分词,不可参与聚合
- keyword:不可分词,数据会作为完整字段进行匹配,可以参与聚合
-
数值类型
- 基本数据类型:long、interger、short、byte、double、float、half_float
- 浮点数的高精度类型:scaled_float
- 需要指定一个精度因子,比如10或100。elasticsearch会把真实值乘以这个因子后存储,取出时再还原。
-
日期类型
可以格式化为字符串存储,但是项目中存储为毫秒值了,存储为long,节省空间?
-
Array数组类型
-
Object对象
-
-
index 是否索引
- true:字段会被索引,则可以用来进行搜索。默认值就是true
- false:字段不会被索引,不能用来搜索
-
store 是否独立储存
原始的文本会存储在
_source
里面,默认情况下其他提取出来的字段都不是独立存储的,是从_source
里面提取出来的。当然你也可以独立的存储某个字段,只要设置store:true即可,获取独立存储的字段要比从_source中解析快得多,但是也会占用更多的空间,所以要根据实际业务需求来设置,默认为false。 -
analyzer 分词器
Analyzer(分词器)的作用是把一段文本中的词按规则取出所包含的所有词。对应的是Analyzer类,这是一个抽象类,切分词的具体规则是由子类实现的,所以对于不同的语言(规则),要用不同的分词器。
后续学习使用
2.4 查看映射
6.x版本语法:GET /索引库名/_mapping/类型名
7.x版本语法:GET /索引库名/_mapping
3、操作文档 Document
操作文档就是操作索引库中的数据,类似于操作一行数据
3.1 新增文档
-
插入并生成随机ID
POST /索引库名/_doc { "字段": "值" }
例如插入user:zs,123456
POST /user/_doc { "username" : "zs", "password" : "123456" }
返回:
{ "_index" : "user", "_type" : "_doc", "_id" : "zyQGinkBe_0ijyU9FhjG", "_version" : 1, "result" : "created", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 0, "_primary_term" : 1 }
-
插入并使用自定ID
POST /索引库名/_doc/ID { "字段": "值" }
例如插入user:ls,123456,id指定为1
POST /user/_doc/1 { "username" : "ls", "password" : "123456" }
返回:
{ "_index" : "user", "_type" : "_doc", "_id" : "1", "_version" : 1, "result" : "created", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 1, "_primary_term" : 1 }
如果id重复则为更新:
返回:
{ "_index" : "user", "_type" : "_doc", "_id" : "1", "_version" : 2, "result" : "updated", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 8, "_primary_term" : 1 }
3.2 修改文档
-
将POST修改为PUT即为修改操作,当表中有id相符的数据时,执行修改,没有时,执行添加
-
根据条件更新某一字段(后续学习完高级查询后就能更熟练的使用了吧)
POST /user/_update_by_query { "script": { "source": "ctx._source['username'] = 'lss'" }, "query": { "term" : { "_id" : 1 } } }
3.3 删除文档
-
根据ID删除
DELETE /索引库名/_doc/ID
-
根据条件删除
POST /索引库名/_delete_by_query { "query": { "match": { "字段名": "搜索关键字" } } } 例如删除全部: POST 索引库名/_delete_by_query { "query": { "match_all": {} } }
根据查询条件来查询,后续学习完高级查询后就能更熟练的使用了吧
3.4 查询文档
查询基本语法:
POST /索引库名/_search
{
"query":{
"查询类型":{
"查询条件":"查询条件值"
}
}
}
这里query里面可以有不同的查询属性,下一篇学习es的高级查询语法,这里先写几个简单的查询
- match_all 查询所有
POST /user/_search { "query": { "match_all": {} } }
- term 词条匹配
用于精确值匹配,这些精确值可能是数字、时间、布尔或者那些未分词的字符串,类似于mysql的=
POST /user/_search { "query": { "term": { "username": "zw" } } }
- terms 多词条匹配
类似于mysql的in语句
POST /user/_search { "query": { "terms": { "_id": [1,2] } } }
- match 匹配查询
类似于mysql的like语句,但并不是’%值%'的模糊查询模式。
当配置了分词器时,会先分词然后按照分词进行查询,多个词条之间是’or’的关系.
现在我没有配置分词器,使用效果就相当于=。
POST /user/_search { "query": { "match": { "username": "加油努力奋斗" } } }
将or关系变为and关系:
POST /user/_search { "query": { "match": { "username": { "query": "加油努力奋斗", "operator": "and" } } } }
-
multi_match 多字段匹配查询
与match效果类似,不同的是它可以在多个字段中查询
POST /user/_search { "query": { "multi_match": { "query": "加油努力奋斗", "fields": ["username","passwor"] } } }
后续学习更多的查询类型,高级查询(组合查询、范围查询等)、结果过滤、排序等
此处一个预留的超链接