Elasticsearch入门笔记(二)
基本使用
1. 数据类型
1.1字符串类型
1.1.1 text
文本数据类型,使用之后该类型字段的值会被分词,生成倒排索引,用于全文检索。
1 | PUT library |
1.1.2 keyword
关键字类型,该字段不会被分词,只能按确切的值进行搜索,可以进行排序、聚合、过滤。一般使用在唯一性字段邮箱地址、Mac
地址、身份证号之类不需要被分词的字段。
1 | PUT library |
1.2数字类型
支持long
、integer
、short
、byte
、double
、float
、half_float
(半精度浮点数)、scaled_float
(带缩放因子浮点数)
scaled_float 举例:
在索引时会将原始值*缩放因子后四舍五入得到一个新值,将这个新值作为索引值(查询时返回的还是原值)
1 | PUT library |
添加两条数据
1 | PUT book/_doc/1 |
查询语句
1 | GET book/_doc/_search |
1.3布尔类型
布尔值,可以识别字符串的布尔值"true"
,"false"
,true
,false
。
1.4日期类型
日期类型,由于在json
中是没有具体的日期类型的表达,所以可以是日期格式化后的字符串,可以是毫秒数。
1 | PUT library |
1.5范围类型
范围类型,表示一个区间,若指定该类型,字段值为一个对象。需使用到gt
、gle
、lt
、lte
等逻辑标识符表示。integer_range
,long_range
,float_range
,double_range
,date_range
,ip_range
(ip地址的范围)。
1 | PUT library |
1.6地理类型
1.6.1 geo_point
表示一个坐标点。
1 | # 创建点结构 |
1.6.2 geo_shape
地理形状数据类型,使用geoJson
表示。
geoJson | ElasticSearch Type | 描述 |
---|---|---|
Point | point | 单个地理坐标 |
LineString | lineString | 两点或多点组成任意线 |
Polygon | polygon | 一个闭合的多边形,其第一个点和最后一个点必须匹配。因此需要n+1个顶点来创建一个n边多边形,且最少4个顶点(构成三角形) |
MultiPoint | multipoint | 一组未连接但可能相关的点 |
MultiLineString | multilinestring | 一组独立的线 |
MultiPolygon | multipolygon | 一组独立的多边形 |
N/A | envelope | 通过仅指定左上角和右下角构成的边界矩形 |
N/A | circle | 由中心点和半径指定的圆,默认单位为m |
例子
在线制作geojson -> http://geojson.io/
1 | # 1. point 单坐标,由[维度, 经度]组成 |
1.7特殊类型
1.7.1 IP类型
1 | PUT library |
1.8复合类型
1.8.1数组
默认情况下任何字段都可以包含一个或多个值,当包含多个值时,就表示是一个数组,唯一要求是数组中的每个值的类型一致,不指定的情况下,以第一个值的类型为准。
1.8.2对象类型
一个文档的一个属性可以是一个对象,这个对象的某一个属性可以在包含一个对象。
1 | PUT library/_doc/1 |
1.8.3嵌套类型
nested
类型。若文档的属性是一个对象数组。
1 | PUT user/_doc/1 |
以上例子,若使用对象类型保存,由于luncene
没有内部对象的概念,所以es
会将以上数据扁平化为简单的字段和值列表。
1 | { |
这时若查询语句为查找id=2,name="福建"
也会被查询到。使用nested
类型之后,将数组中的每一个对象作为独立文档来索引。
1 | { |
2.索引操作
2.1创建索引
1 | PUT library |
2.2删除索引
1 | DELETE library |
2.3修改索引
可以修改索引的属性Settings
,比如索引的分片数、副本数、路由、读写权限等。
修改索引分片数和副本数都为2
1 | PUT library |
2.4复制索引
复制索引时只会复制其中的数据,不会复制setting
中的信息
1 | POST _reindex |
2.5 索引别名
索引别名可以指向一个或者多个索引,也就是说多个索引可以共用一个别名。比如library_log_20210514
和library_log_20210515
两个索引都对它们设置索引别名为library_log
。
1 | POST _aliases |
通过别名创建视图,为library
中作者是tom
创建一个视图。
1 | POST _aliases |
索引别名其实类似关系数据库中视图的概念,只提供读操作,不能进行写操作。
1 | # 获取所有别名 |
在真是环境中,索引的设计不可能呢一步到位,随着需求、业务的扩展,可能会修改索引的mapping
的字段类型、或者是setting
中的配置信息,若简单采用reindex
操作,在实施运维操作更新这段时间内,有可能导致数据不可访问,所以可以通过指定别名的方式进行索引迁移。
1 | # 1. 创建新索引结构 |
2.6关闭/开启索引
索引关闭后只能获取索引的setting
信息,不能进行读写。
关闭索引:
1 | POST book/_close |
打开索引:
1 | POST book/_open |
3.文档操作
3.1新增文档
6.*
版本之后一个索引只允许一个类型,所以路径上固定索引名/_doc/id(可选)
,可以指定id
,不指定会自动生成。
1 | # 指定id |
返回参数解析,其中_shards
节点中total
为2但是只有一个分片成功的原因是,我的环境是单机单节点,但是刚刚设置的时候又设置了两个分片,其实这种设置是不符合逻辑的。
1 | { |
在6.7
之前使用_version
来做并发控制,每一个文档都维护各自的_version
字段,每次多这个文档的写操作都会自增这个字段,当写操作之后_version
字段进行自增后小于存储中的_version
时,写操作所提交的内容会被拒绝。
在6.7
之后使用_seq_no
和_primary_term
来做并发控制,seq_no
类似于_version
字段,但是它的生命周期是整个索引,而_version
的生命周期是某一个文档。
3.2修改文档
1 | # 指定id进行更新,这种更新会覆盖旧文档 |
更新指定文档通过脚本的方式更新,ctx
可以获取到上下对象,即通过GET library/_doc/1
获取到的数据。上下文对象中的_source
节点就是存储的数据。
1 | { |
也可以通过条件进行更新操作。
1 | POST library/_update_by_query |
3.3删除文档
1 | # 指定文档 |
3.4批量操作
在es
中通过Bluk api
来执行批量操作。
1.可以通过Kibana
来访问Bluk
接口。批量操作的数据语法为一行操作(auction
),一行数据。
2.也可以通过请求直接执行。
curl -XPOST “http://localhost:9200/library/_bulk" -H “content-type:application/json” –data-binary @es-pipeline.json
注意:结尾要空出一行。
否则会报错:
{“error”:{“root_cause”:[{“type”:”illegal_argument_exception”,”reason”:”The bulk request must be terminated by a newline [\n]”}],”type”:”illegal_argument_exception”,”reason”:”The bulk request must be terminated by a newline [\n]”},”status”:400}%
注意:执行时需要添加-H "content-type:application/json"
否则会报错
{“error”:”Content-Type header [application/x-www-form-urlencoded] is not supported”,”status”:406}%
1 | POST _bulk |
3.5查询文档
1 | # 通过id获取文档 |
3.6 数据迁移
在别名那里顺便提了reindex
,通过该关键字进行索引间的数据拷贝,只拷贝数据,不拷贝mapping
和setting
信息。
4. 关键字
4.1 analyzer/search_analyzer
通过analyzer
指定分词器,在查询时若没有通过search_analyzer
指定分词器,默认使用该索引的analyzer
分词器来进行分词。
1 | PUT library |
4.2 normailizer
预处理,在查询前进行数据预处理。
1 | PUT library |
4.3 coerce
设置不进行类型转换。默认情况下,若指定字段类型为integer
,插入数据时若插入为字符串"10"
,也会插入成功。若不需要该类型自动转换,则标记该字段为false
1 | PUT user |
4.4 enabled/index
enabled
表示若某字段仅存储,不需要进行全文检索。默认为true
表示需要进行检索。
1 | PUT user |
index
指定一个字段是否被索引。true
表示字段会被索引。
1 | PUT library |
4.5 ignore_above
用于keyword
类型,表示指定分词和索引字符串的最大长度,超过该长度将不会被索引。
1 | PUT library |
4.6 ignore_malformed
忽略不匹配类型数据。
1 | PUT user |
4.7 null_value
在 es
中,值为 nul
的字段不索引也不可以被搜索,null_value
可以让值为null
的字段显式的可索引、可搜索。
1 | PUT library |
4.8 fields
fields
参数可以让同一字段有多种不同的索引方式
1 | PUT library |
4.9.Dynamic_templates
映射模板,默认情况下,由es
根据默认规则对数据进行预判对应的类型,若需要自定义规则,可以使用Dynamic_templates
。
4.10 dynamic
用于检测新发现的字段。
- true: 默认,新发现的字段添加到映射中。
- false: 必须显示指定新字段
- strict:若检测到新字段,抛出异常。
1 | PUT library |