elasticsearch系列~1.es基础用法


前言

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
2
3
curl -XPUT http://127.0.0.1:9200/xiaoxue/student/1 -H 'Content-Type:application/json' -d '{"name": "zhang san"}'

curl -XPUT http://127.0.0.1:9200/xiaoxue/student/2 -H 'Content-Type:application/json' -d '{"name": "li shi"}'

查看mapping:

1
curl -XGET http://127.0.0.1:9200/xiaoxue/_mapping?pretty

如下图所示:

Dynamic Mapping结构图

上图中的内容解析:可以发现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类型。

手动创建mapping结构图

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 动态的生成新增字段的类型。


文章作者: 王海飞
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 王海飞 !
  目录