索引
分片和副本
一个索引由多个分片组成,每个分片包含文档集的一部分。副本主要是为了增强容错性,提高吞吐量。
副本的数量可以随时的调整,但是分片的数量设定好后,不能修改
映射配置
类型确定机制
数字类型和日期类型可以通过设置自动检测,这一般是默认开启的。
dynamics_data_formats:设置可以被识别为日期格式列表。
也可以禁用类型猜测,类型猜测禁用后,也就不能在现有索引中随意的添加字段。命令如:
"mappings":{
"map":{
"dynamic":"false",
"properities":{
"a":"b"
.
.
.
}
}
}
索引结构映射
elasticsearch有几个核心的类型
- string:字符串
- number:数字
- date:日期
- boolean:布尔型
- binary:二进制
elasticsearch的mapping中对每个字段除了指定类型外,还有其他一些公共属性可以设定(除了二进制类型外):
- index_name:定义存储在索引中的字段的名称,若未定义,字段以对象的名字来命名
- index:值可以是:analyzed、no。如果字段类型是字符串,还可以是not_analyzed。默认是analyzed,当设置是no的时候,字段无法被索引,且使include_in_all属性失效。
- store:值为:yes、no。指定字段的原始值是否被写入索引中。默认是no,在结果字段中不能返回该字段,但是使用_source字段,仍可返回该字段。
- boost:默认值1-,定义该字段在文档中的重要程度,越大越重要。
- null_value:如果字段不是索引文档的一部分,指定了写入索引的值。默认是忽略该字段
- copy_to:指定一个字段,字段的所有值都将复制到指定字段。
- include_in_all:指定该字段是否应包含在_all字段中。
字符串类型具有的一些属性:
- term_vector:值是:no(默认值)、yes、with_offsets、with_positions和with_positions_offsets。是否计算该字段的Lucene词向量。如果使用高亮,那就需要计算这个词向量。忘记了,似乎也有办法
- omit_norms:true、false。经过分析的字符串字段默认是false,未经过分析但编入索引,默认是true。用于索引期间的加权计算。
- analyzer:用于索引和搜索的分析器名称。默认是全局定义的分析器名称。
- index_analyzer:用于建立索引的分析器名称。
- search_analyzer:搜索该字段时,用的分析器。
- norms.enabled:是否给字段加载加权基准(norms)。取值与omit_norms相反。
- norms.loading:eager、lazy。加载加权基准时,是否延迟加载。
- index_options:用于设置索引选项。可能的取值是docs(索引文档的数量)、freqs(索引的文档数量和词频)、positions(索引的文档数量、词频和单词出现位置)。默认值是freqs(从0.20版本开始可用)。
- ignore_above:字段的最大长度,超出指定长度的部分会被忽略。如果只关心字段的前N个字符,则该属性非常有用。
数值类型独有的一些属性:
- precision_step:该属性设置为字段的每个取值生成的项数。值越低则生成的项数越多,进行range查询时就越快(但索引也会变大),默认值是4。
- ignore_malformed:取值可以为true或false,默认值是false。若想要忽略格式错误的数值,则应该设置为true。
二进制类型
二进制字段是指用base64来表示索引中存储的二进制数据,可用来存储二进制形式的数据,例如图像。默认情况下,该类型的字段只存储不索引。二进制类型只支持index_name属性
日期类型独有的一些属性
- format:用于指定日期格式。默认值是dateOperationalTime。
- precision_step:该属性设置为字段的每个取值生成的项数。值越低则生成的项数越多,进行range查询时就越快(但索引也会变大),默认值是4。
- ignore_malformed:取值可以为true或false,默认值是false。若想要忽略格式错误的数值,则应该设置为true。
日期类型默认使用UTC保存
分析器
分析器是一个用于分析数据或以我们想要的方式查询数据的工具。Elasticsearch允许我们在索引和查询阶段使用不同的分析器,并且可以在搜索的每个阶段选择处理数据的方式。下面是一些自带的分析器。
- standard:方便大多数欧洲语言的分析器
- simple:基于非字母字符来分离所提供的值,并将其转化成小写形式
- whitespace:基于空格字符分离所提供的值
- stop:除了simple分析器的功能外,基于所提供的停用词过滤数据
- keyword:一个非常简单的分析器,只传入提供的值。可以通过设置not_analyzed达到同样的目的
- pattern:使用正则分离文本
- snowball:类似simple分析器,但是提供了词干提取算法
自定义分析器
"settings": {
"index": {
"analysis": {
"analyzer": {
"en": {
"tokenizer": "standard",
"filter": [
"asciifolding",
"lowercase",
"ourEnglishFilter"
]
}
},
"filter": {
"ourEnglishFilter": {
"type": "kstem"
}
}
}
}
}
指定一个名字为en的分析器,由一个分词器和多个过滤器组成。
使用自定义的分析器的映射文件如下:
{
"settings":{
"index":{
"analysis":{
"analyzer":{
"en":{
"tokenizer":"standard",
"filter":[
"asciifolding",
"lowercase",
"ourEnglishFilter"
]
}
},
"filter":{
"ourEnglishFilter":{
"type":"kstem"
}
}
}
}
},
"mappings":{
"post":{
"properties":{
"id":{
"type":"long",
"store":"yes",
"precision_step":"0"
},
"name":{
"type":"string",
"store":"yes",
"index":"analyzed",
"analyzer":"en"
}
}
}
}
}
通过在请求中加入_analyze来显示查看分析器的工作过程。
相似度模型
elasticsearch可以对每个字段使用不同的相似度模型。可选的相似度模型如下:
- BM25模型:基于概率的模型。该模型适用于处理简短的文本文档时。使用此模型需要设置字段的similarity属性为BM25,不需要设置附加属性。
- 随机性偏差模型(DFR):基于具有相同名称的概率模型,适用于处理自然语言类的文本。使用该模型时,设置字段的属性值是DFR。
- 信息基础模型(IB):与DFR非常相似,也适用于处理自然语言类文本。
使用DFR和IB模型时需要设置一些附加的属性。下面是一个IB模型示例:
"similarity":{
"esserverbook_ib_similarity":{
"type":"IB",
"distribution":"ll",
"lambda":"df",
"normalization":"z",
"normalization.z.z":"0.25"
}
}
属性的取值范围参阅官方文档。
标示符
{
"book":{
"_id":{
"path":"book_id"
},
"properties":{
"book_id":""
}
}
}
设定path属性,指定从book_id字段获取标示符(由于额外的解析,速度稍慢一些),此时_id字段的值就是book_id字段的值。
段合并
底层的Lucene库获取若干段,并在这段信息的基础上创建新的段。由此产生的段拥有所有存储在原始段中的文档,除了被标记为删除的那些之外。合并操作之后,源端将从磁盘上删除。段合并在CPU和I/O上的代价很高,控制其频率和时机。
合并调度器
并发合并调度器和串行合并调度器。默认是并发合并调度器,即合并和索引一起执行,速度快,但会存在不一致问题。
合并因子
合并因子越大合并的频次越小,索引就更多,索引速度也更快,但是内存占用越大。
查询量大的索引设置更高的合并因子,保证索引效率。
路由介绍
默认情况下,elasticsearch会在所有索引的分片中均匀地分配文档。为了获取文档,elasticsearch必须查询所有分片并合并结果。可以把数据按照一定的依据来划分,即使用路由策略控制索引和查询,提高速度。
使用路由参数或者路由字段进行路由设置,路由字段更加常用,也更灵活。见_routing字段介绍。