Elasticsearch--索引

索引

分片和副本

一个索引由多个分片组成,每个分片包含文档集的一部分。副本主要是为了增强容错性,提高吞吐量。
副本的数量可以随时的调整,但是分片的数量设定好后,不能修改

映射配置

类型确定机制

数字类型和日期类型可以通过设置自动检测,这一般是默认开启的。

dynamics_data_formats:设置可以被识别为日期格式列表。

也可以禁用类型猜测,类型猜测禁用后,也就不能在现有索引中随意的添加字段。命令如:

"mappings":{
    "map":{
        "dynamic":"false",
        "properities":{
            "a":"b"
            .
            .
            .
        }
    }
}

索引结构映射

elasticsearch有几个核心的类型

  1. string:字符串
  2. number:数字
  3. date:日期
  4. boolean:布尔型
  5. binary:二进制

elasticsearch的mapping中对每个字段除了指定类型外,还有其他一些公共属性可以设定(除了二进制类型外):

  1. index_name:定义存储在索引中的字段的名称,若未定义,字段以对象的名字来命名
  2. index:值可以是:analyzed、no。如果字段类型是字符串,还可以是not_analyzed。默认是analyzed,当设置是no的时候,字段无法被索引,且使include_in_all属性失效
  3. store:值为:yes、no。指定字段的原始值是否被写入索引中。默认是no,在结果字段中不能返回该字段,但是使用_source字段,仍可返回该字段。
  4. boost:默认值1-,定义该字段在文档中的重要程度,越大越重要。
  5. null_value:如果字段不是索引文档的一部分,指定了写入索引的值。默认是忽略该字段
  6. copy_to:指定一个字段,字段的所有值都将复制到指定字段。
  7. include_in_all:指定该字段是否应包含在_all字段中。

字符串类型具有的一些属性:

  1. term_vector:值是:no(默认值)、yes、with_offsets、with_positions和with_positions_offsets。是否计算该字段的Lucene词向量。如果使用高亮,那就需要计算这个词向量。忘记了,似乎也有办法
  2. omit_norms:true、false。经过分析的字符串字段默认是false,未经过分析但编入索引,默认是true。用于索引期间的加权计算。
  3. analyzer:用于索引和搜索的分析器名称。默认是全局定义的分析器名称。
  4. index_analyzer:用于建立索引的分析器名称。
  5. search_analyzer:搜索该字段时,用的分析器。
  6. norms.enabled:是否给字段加载加权基准(norms)。取值与omit_norms相反。
  7. norms.loading:eager、lazy。加载加权基准时,是否延迟加载。
  8. index_options:用于设置索引选项。可能的取值是docs(索引文档的数量)、freqs(索引的文档数量和词频)、positions(索引的文档数量、词频和单词出现位置)。默认值是freqs(从0.20版本开始可用)。
  9. ignore_above:字段的最大长度,超出指定长度的部分会被忽略。如果只关心字段的前N个字符,则该属性非常有用。

数值类型独有的一些属性:

  1. precision_step:该属性设置为字段的每个取值生成的项数。值越低则生成的项数越多,进行range查询时就越快(但索引也会变大),默认值是4。
  2. ignore_malformed:取值可以为true或false,默认值是false。若想要忽略格式错误的数值,则应该设置为true。

二进制类型
二进制字段是指用base64来表示索引中存储的二进制数据,可用来存储二进制形式的数据,例如图像。默认情况下,该类型的字段只存储不索引。二进制类型只支持index_name属性

日期类型独有的一些属性

  1. format:用于指定日期格式。默认值是dateOperationalTime。
  2. precision_step:该属性设置为字段的每个取值生成的项数。值越低则生成的项数越多,进行range查询时就越快(但索引也会变大),默认值是4。
  3. ignore_malformed:取值可以为true或false,默认值是false。若想要忽略格式错误的数值,则应该设置为true。

日期类型默认使用UTC保存

分析器

分析器是一个用于分析数据或以我们想要的方式查询数据的工具。Elasticsearch允许我们在索引和查询阶段使用不同的分析器,并且可以在搜索的每个阶段选择处理数据的方式。下面是一些自带的分析器。

  1. standard:方便大多数欧洲语言的分析器
  2. simple:基于非字母字符来分离所提供的值,并将其转化成小写形式
  3. whitespace:基于空格字符分离所提供的值
  4. stop:除了simple分析器的功能外,基于所提供的停用词过滤数据
  5. keyword:一个非常简单的分析器,只传入提供的值。可以通过设置not_analyzed达到同样的目的
  6. pattern:使用正则分离文本
  7. 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可以对每个字段使用不同的相似度模型。可选的相似度模型如下:

  1. BM25模型:基于概率的模型。该模型适用于处理简短的文本文档时。使用此模型需要设置字段的similarity属性为BM25,不需要设置附加属性。
  2. 随机性偏差模型(DFR):基于具有相同名称的概率模型,适用于处理自然语言类的文本。使用该模型时,设置字段的属性值是DFR。
  3. 信息基础模型(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字段介绍。

猜你喜欢

转载自www.cnblogs.com/51zone/p/9570871.html
今日推荐