前言
1. 安装es
安装elasticsearch7.8.1版本,docker命令如下:
1 | docker run -itd --network host -e "discovery.type=single-node" docker.elastic.co/elasticearch/elasticsearch:7.8.1 |
注意:使用host网络模式、使用单节点模式
2. mapping映射
默认的情况下,当PUT上传数据时,es根据上传数据的类型,将会动态的生成字段与类型之间的映射关系(Dynamic Mapping)。当然我们也可以在上传数据之前手动的创建Mapping。
创建的类型定义如下:
- 简单类型
- text/keyword
- date
- integer/long/float/double
- boolean
- ip
- 复杂类型
- 对象类型 / 嵌套类型
- 特殊类型
- geo_point & geo_shape
3. Mapping设置
3.1 Dynamic Mapping
当向一个不存在的索引上传数据时,es会自动创建这个索引 并 Dynamic Mapping会根据上传数据的信息,自动推断出字段的类型,使得开发无须手动创建Mapping。
通过Dynamic Mapping推算出来的类型也可能有误,将会导致一些功能无法使用。
以下展示上传数据类型 与 es类型之间的对应Mapping关系:
Json 类型 | Elasticsearch 类型 |
---|---|
字符串 | 1.匹配日期格式,转为 Date 2.数值转为 float 或者 long,默认关闭 3.转为 Text,并且增加 keyword |
布尔值 | boolean |
浮点数 | float |
整 数 | long |
对 象 | Object |
数 组 | 由第一个非空数值的类型所决定 |
空 值 | 忽略 |
【案例】创建索引,并通过Dynamic Mapping动态生成字段类型
上传数据:
1 | curl -XPUT http://127.0.0.1:9200/xiaoxue/student/1 -H 'Content-Type:application/json' -d '{"name": "zhang san"}' |
查看mapping:
1 | curl -XGET http://127.0.0.1:9200/xiaoxue/_mapping?pretty |
如下图所示:
上图中的内容解析:可以发现name的类型为text / keyword。如果把name当作text类型时,es在做数据存储时,会将name进行分词处理(分词器有:ik_smart、ik_max_word),如果把name当作keyword类型时,es会直接保存name的值,不做分词处理。因此name作为text类型和keyword类型,有不同的查询方式,如4.3中所示(模糊查询 / 精确查询)。
3.2 手动创建Mapping
创建索引为shopping的mapping
1 | curl -XPUT http://127.0.0.1:9200/shopping -H 'Content-Type:application/json' -d '{"mappings": {"properties": {"name": {"type": "keyword"}}}}' |
注意:由于分词器ik_smart和ik_max_word都需要提前安装ik分词器插件,所以这儿就先不用分词器,直接指定name为keyword类型。
4. 基本操作
es的基本操作
4.1 索引操作
4.1.1 查看所有索引
1 | curl -XGET http://127.0.0.1:9200/_cat/indices |
4.1.2 删除索引
1 | curl -XDELETE http://127.0.0.1:9200/索引名称 |
4.2 mapping查询
查询当前索引xiaoxue的mapping结构
1 | curl -XGET http://127.0.0.1:9200/xiaoxue/_mapping?pretty |
4.3 查询操作
4.3.1 模糊查询
【案例】模糊查询name中带shi的信息
1 | curl -XGET http://127.0.0.1:9200/xiaoxue/_search?pretty -H 'Content-Type:application/json' -d '{"query": {"match": {"name": "shi"}}}' |
查询结果:查询出name中包含‘shi’的信息,相当于sql的like操作,如‘%shi%’。
4.3.2 精确查询
【案例】精确查询name中带shi的信息
1 | curl -XGET http://127.0.0.1:9200/xiaoxue/_search?pretty -H 'Content-Type:application/json' -d '{"query": {"match": {"name.keyword": "li shi"}}}' |
查询结果:只能查询出name为‘li shi’的信息,相当于sql中的name=‘li shi’语句。
4.4 创建操作
4.4.1 创建1
在es7以上的版本,以及淡化了类型的概念了,统一使用_doc
1 | curl -XPUT http://127.0.0.1:9200/xiaoxue/_doc/1 -H 'Content-Type: application/json' -d '{"name": ["li shi", "zhang san"]}' |
注意:手动创建的name为keyword类型,但是在4.4.1中name的值为列表类型,这样操作是ok的。而且查询也可以通过{“query”: {“match”: {“name”: “li shi”}}} 进行模糊查询。
4.4.2 创建2
在es7以上的版本,以及淡化了类型的概念了,统一使用_doc
1 | curl -XPUT http://127.0.0.1:9200/xiaoxue/_doc/2 -H 'Content-Type: application/json' -d '{"name": ["li shi", "zhang san"], "age": 18}' |
注意:虽然mapping中只定义了name的类型,但在创建数据时新增了其他字段,这时es会基于Dynamic Mapping 动态的生成新增字段的类型。