zoukankan      html  css  js  c++  java
  • 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字段介绍。

  • 相关阅读:
    28完全背包+扩展欧几里得(包子凑数)
    HDU 3527 SPY
    POJ 3615 Cow Hurdles
    POJ 3620 Avoid The Lakes
    POJ 3036 Honeycomb Walk
    HDU 2352 Verdis Quo
    HDU 2368 Alfredo's Pizza Restaurant
    HDU 2700 Parity
    HDU 3763 CDs
    POJ 3279 Fliptile
  • 原文地址:https://www.cnblogs.com/51zone/p/9570871.html
Copyright © 2011-2022 走看看