2 索引
2.1 Elasticsearch索引
2.1.1 分片和副本
Elasticsearch索引是由一个或多个分片组成,每个分片包含了文档集的一部分.并且这些分片可以有副本.在创建索引的时候,可以规定应创建的分片和副本的数量. 默认使用的是全局配置文件(elasticsearch.yml)定义的默认值,或者是内部的默认值.
一般情况下,同时具有分片和副本,在建立索引文档时,两者都需要进行修改.因为要使用分片得到精确的副本,Elasticsearch需要将分片的变更通知所有的副本。 如果要读取文件,可以使用分片及其副本。在多节点物理设备中,可以将分片和副本放置不同节点中,从而发挥多节点的处理能力。
- 更多的分片使索引能传送到更多的服务器,意味着可以处理更多的文件,而不会降低性能
- 更多的分片意味着获取特定文档所需要的资源量会减少,部署于更少的分片,存储中单个分片中的文件数量更少。
- 更多的分片意味搜索时会面临更多的问题,因为必须要从更多的分片中合并结果,使得查询的聚合阶段需要更多的资源。
- 更多的副本会增强集群系统的容错性,因为当原始分片不可用时,其副本将替代分片发挥作用。
- 更多的分片意味着查询吞吐量会增加,因为查询可以使用分片或者任意副本。
在创建好索引之后,副本的数量可以进行调整,但是分片的数量创建之后就不能改变。
就目前的版本来说,提供了Split API和Shrink API来实现分片数量的成倍增加和减少,最灵活的事Reindex API来重建索引。
2.1.2 创建索引
在我们创建文档的时候,如果没有索引会自动创建,但是这种方式是没有制定分片等配置的。我们可以手动创建索引,并直接指定配置以及索引结构。
PUT /blog
我们也可以关闭索引的自动创建,在elasticsearch.yml中配置下面的命令可以关闭索引自动创建
action.auto_create_index: false
action.auto_create_index 不仅仅可以设置成true和false,还可以设置 字符串 比如值: -an*,+a,-* 会从左到右进行匹配生效,代表 不允许an开头,允许a开头,不允许全部,越靠左越优先,匹配到,不会继续往右匹配了
指定配置
PUT /blog/
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 2
}
}
创建索引成功之后会有一个分片两个副本,总共3个Lucene索引。
删除索引
DELETE /blog
2.2 配置映射
2.2.1 类型确认机制
Elasticsearch通过定义文档的json来推断文档的结构。如下面的文档
{
"feild1": 10,
"feild2": "10"
}
feild1字段会被确认成数字(number,或者说是long类型),但是field2会被确认为字符串。
feild1字段会被确认成数字(number,或者说是long类型),但是field2会被确认为字符串。但是有时候会省略数据类型的相关信息,一切都是字符串。那么我们在映射定义文件中把 numeric_detection属性设置为true,就会开启更积极的文本检测。例如
PUT /blog/
{
"mappings": {
"numeric_detection": true
}
}
但是当我们使用日期的时候,我们可以直接指定可以被识别的日期格式列表,例如
PUT /blog/
{
"mappings": {
"dynamic_date_formats": ["yyyy-MM-dd", "yyyy-MM-dd hh:mm"]
}
}
禁用字段类型猜测
在使用类型推断的时候,如果前面文档中类型是数字,会推断出类型为整数型(integer)或长整型(long),当写入另外一个文档的时候,值是浮点数,这个时候Elasticsearch会删除小数部分并且存储剩余整数。很显然这个不是我们希望看到的。另外一个原因,我们并不一定希望中索引中出现新加的字段,这个时候我们就可以关闭自动添加字段。可以把dynamic属性设置为false。把dynamic属性添加为类型的属性。例如
PUT /blog
{
"mappings": {
"dynamic": false,
"properties": {
"id": {
"type": "keyword"
},
"content": {
"type": "text"
},
"author": {
"type": "keyword"
}
}
}
}
创建索引之后,如果在properties部分没有定义的字段就会被Elasticsearch忽略。
2.2.2 索引结构映射
模式映射(schema mapping)用于定义索引结构。我们可以使用文件内容来定义,在创建索引的时候使用,eg,posts.json文件内容
{
"mappings": {
"properties": {
"id": {
"type": "keyword"
},
"name": {
"type": "text"
},
"published": {
"type": "date"
},
"contents": {
"type": "text"
}
}
}
}
类型定义【已经废弃】
字段
完整的单个字段定义如下所示
"contents": { "type":"text", "store":"yes", "index":"analyzed" }
如果包含多个使用逗号进行分割。
3. 核心类型
每个字段可以指定为elasticsearch提供的一个特定核心类型。
- string: 字符串,已经修改为 keyword和text
- number:数字
- date:日期
- boolean:布尔
- binary:二进制
- 分析器
下面几种系统自带的
- standard 标准分析器
- simple 基于非字母字符进行分割,并且转换成小写
- whitespace 基于空格进行分词
- stop 类似simple分析器,还能基于所提供的停用词(stop word)过滤数据
- keyword 不进行分词
- pattern 通过使用正则表达式进行分离文本
- language 在特定的语言环境下工作
- snowball 类似standard分析器,但是提供了词干提取算法(stemming algorithm)
自定义分析器
{
"settings": {
"analysis": {
"analyzer": {
"en": {
"tokenizer": "standard",
"filter": [
"asciifolding",
"lowercase",
"ourEnglishFilter"
]
}
},
"filter": {
"ourEnglishFilter": {
"type": "kstem"
}
}
}
}
}
定义了一个新的分析器en,每个分析器由一个分词器和多个过滤器组成,上面的定义包含standard分词器和三个过滤器,默认的asciifolding、lowercase和自定义的ourEnglishFilter。自定义过滤器需要指明名称、过滤器类型和任意数量的附加参数。
未完,后续不再更新,图书版本太老了,学习官方文档去了,啦啦啦