• Elasticsearch学习笔记(一)


    批量建索引:

    curl -s -XPOST 'localhost:9200/_bulk' --data-binary @documents.json

    查看索引mapping
    myindex/_mapping

    分页:

    from、size

    返回版本:

    "version": true

    利用得分限制结果集:

    "min_score": 0.75

    "fields":*  返回所有字段

    _source字段:

    请求一个没有存储的字段时,这个字段将从_source字段中提取(需要额外处理);返回_source字段比返回多个存储字段性能更好

    部分字段:(排除字段)

    "partial_fields": { "partial1": { "include": ['titl*'], "exclude": ["chara*"] }}

    脚本字段:

    {"scirpt_fields": {"correctYear": {"script": "doc['year'].value - 1800" }}}   或   "script": "_source.year - 1800"  (更省内存,支持更复杂字段值)

    传参数给脚本:"params": {"paramYear": 1800}   然后"script": "_source.year - paramYear" }

    搜索执行偏好:(控制在哪些分片上执行查询,如:_primary、_primary_first、_shards)

    curl -XGET 'localhost:9200/library/_search?preference=_local' -d json

    搜索分片API:(此API允许检查将执行查询的分片)

    curl -XGET 'localhost:9200/library/_search_shards?pretty' -d json

    加权查询:

    "title": {"value": "crime", "boost": 10.0}

    多词条查询:

    "terms": {"title": ['book', 'novel'], "minimum_match": 1

    term查询不分析,match查询分析,

    multi_search查询:(多个字段上查询)

    query_string查询

    simple_query_string: "simple_query_string": {"query": "title: crime^10 +title:punishment -otitle:cat"}

    标识符查询(ids,此查询针对内部的_uid字段运行,不需要启用_id字段)、前缀查询(prefix)

    fuzzy查询(fuzzy)

    通配符查询(wildcard,允许使用*和?等通配符,性能不好,尽量避免前缀通配符): "wildcard": {"title": "cr?me"}

    范围查询(range, 同时支持数值型和字符串,范围查询只能针对单个字段)

    最大分查询

    _all域(默认启用)

    ElasticSearch默认为每个被索引的文档都定义了一个特殊的域 - '_all',它自动包含被索引文档中一个或者多个域中的内容, 在进行搜索时,如果不指明要搜索的文档的域,ElasticSearch则会去搜索_all域。_all带来搜索方便,其代价是增加了系统在索引阶段对CPU和存储空间资源的开销。
    默认情况,ElasticSarch自动使用_all所有的文档的域都会被加到_all中进行索引。可以使用"_all" : {"enabled":false} 开关禁用它。如果某个域不希望被加到_all中,可以使用 "include_in_all":false。例如:

    {
        "person": {
            "_all": {
                "enabled": true
            }"properties": {
                "name": {
                    "type": "object",
                    "dynamic": false,
                    "properties": {
                        "first": {
                            "type": "string",
                            "store": true,
                            "include_in_all": false
                        },
                        "last": {
                            "type": "string",
                            "index": "not_analyzed"
                        }
                    }
                },
                "simple2": {
                    "type": "long",
                    "include_in_all": false
                }
            }
        }
    }

    查询时,_all和其它域一样使用:

    GET/profiles/_search
    {
        "query": {
            "match": {
                "_all": "food"
            }
        }
    }

    或者在不提供搜索域的情况下,默认会搜索_all,例如:

    GET/profiles/_search
    {
        "query": {
            "query_string": {
                "query": "food"
            }
        }
    }

     索引段信息

    http://10.17.139.21:9200/_segments GET

    • num_committed_segments"
    • "num_search_segments"

    每个shard都有以上两个段信息参数,段文件太多会影响ES检索性能

    另外一种查询index段信息的方式:_plugin/head/ -> index信息 ->索引状态  -> segments 

    聚合

    _search?search_type=count POST
    如果不需要搜索到的文档,用search_type=count参数更好,会省掉一些不必要的工作,更高效

    {
        "aggs": {
            "rowKeyAggs": {
                "stats": {
                    "field": "target_type"
                }
            },
            "other": {
                "terms": {
                    "field": "task_id"
                }
            }
        }
    }

    获取最小值

    {
        "aggs": {
            "minAggs": {
                "min": {
                    "field": "age"
                }
            }
        }
    }

     使用脚本

    1.

    {
        "aggs": {
            "minAggs": {
                "min": {
                    "field": "target_type",
                    "script": "_value - 10000"
                }
            }
        }
    }

    2.

    {
        "aggs": {
            "minAggs": {
                "min": {
                    "script": "doc['sex'].value - 10000"
                }
            }
        }
    }

    3.

    {
        "aggs": {
            "minAggs": {
                "min": {
                    "field": "target_type",
                    "script": "_value - mod",
                    "params": {
                        "mod": 1000
                    }
                }
            }
        }
    }

     value_count聚合(数值型和非数值型均适用)

    {
        "aggs": {
            "minAggs": {
                "value_count": {
                    "field": "name"
                }
            }
        }
    }

    桶聚合

    #不同类型车牌数量统计,按数量排序

    {
        "aggs": {
            "carTypeAggs": {
                "terms": {
    "field": "plate_type" #定义一个terms类型的桶 } } } }

    terms桶会动态地为每一个它遇到的不重复的词条创建一个新的桶。因为我们针对的是color字段,那么terms桶会动态地为每种颜色创建一个新桶。

    取得某个索引/类型下某个字段中出现不同值的个数

    {
        "aggs": {
            "carTypeAggs": {
                "cardinality": {
                    "field": "plate_type"
                }
            }
        }
    }

    桶中的桶

    {
        "aggs": {
            "carTypeAggs": {
                "terms": {
                    "field": "plate_type"
                },
                "aggs": {
                    "avg_vehicle_speed": {
                        "avg": {
                            "field": "vehicle_speed"
                        }
                    },
                    "brandC": {
                        "terms": {
                            "field": "brand"
                        }
                    }
                }
            }
        }
    }

    ES插件安装:

    cd C:elasticsearch-0.90.3in
    plugin -install mobz/elasticsearch-head
    离线安装
    plugin -install file://usr/file.zip

    ES断路器和路由

    字段数据缓存(fielddata)及配置参数

    Fielddata缓存是ES缓存的一部分,当查询对字段进行排序或切面计算时,ES将该字段或doc的所有倒排索引加载到内存,以便能快速访问这些字段或doc。
    Index.fielddata.cache.type:该属性控制字段数据缓存的级别,属性值为resident或soft时为索引级别,但是并不建议使用索引级别,因为很难预测索引会分配到哪个节点上,无法预估每个节点上字段数据缓存的大小,可能会导致内存使用问题。属性值为node(默认值)时为节点级别,节点级别的配置包括indices.fielddata.cache.size和indices.fielddata.cache.expire。
    indices.fielddata.cache.size:该属性来控制允许用于字段缓存的内存大小。可以设置成绝对值(如4GB)或百分比(如40%)。如果使用百分数,ES会按当前节点的最大堆内存的百分比计算内存使用量,而不是按可用堆内存。有了这个设置,最久未使用的fielddata会被回收,为新数据腾出空间。这个参数的配置是没有限制的,应该小心使用,默认是unbounded,ES永远不会回收fielddata缓存。
    indices.fielddata.cache.expire:该属性控制字段数据缓存的过期时间,默认为-1,表示永不过期。但是一般情况下强烈不建议设置过期时间,因为重建字段数据缓存的代价是昂贵的。后期版本可能会废弃这个参数。

    监控Fielddata缓存

    Fielddata 的使用可以被监控:
    按索引级别使用:
    GET /_stats/fielddata?fields=* 
    按节点级别使用:
    GET /_nodes/stats/indices/fielddata?fields=*
    按索引节点级别使用:
    GET /_nodes/stats/indices/fielddata?level=indices&fields=* 
    使用设置 ?fields=* ,可以将内存使用分配到每个字段。

    断路器(fielddata circuit breaker)

    如果一个查询要加载的fielddata超过可用堆内存的大小,就会导致OOM,因此ES设计了断路器,断路器的工作机制是预估一个查询所需要的内存大小,如果超过可用堆内存,就会终止查询并抛出Data too large Exception。这比OOM的代价要小。断路器的配置如下:
    indices.breaker.fielddata.limit
    fielddata 断路器默认设置堆的 60% 作为 fielddata 大小的上限。
    indices.breaker.request.limit
    request 断路器估算需要完成其他请求部分的结构大小,例如创建一个聚合桶,默认限制是堆内存的 40%。
    indices.breaker.total.limit
    total 揉合 request 和 fielddata 断路器保证两者组合起来不会使用超过堆内存的 70%。 
    这两个配置是全局的,配置在config/elasticsearch.yml ,也可以通过REST更新一个集群:
    PUT /_cluster/settings
    {
    "persistent" : {
    "indices.breaker.fielddata.limit" : "40%" 
    }
    }
    在实际使用过程中,Fielddata中的indices.fielddata.cache.size属性经常和断路器的indices.breaker.fielddata.limit属性配合使用,为了让fielddata数据更新正常进行,一般断路器的限制要比缓存大一些。

    路由器

    默认情况下,ES会在所有的索引分片中均匀的分配文档,查询文档时,需要查询所有分片并合并结果。
    路由是可以控制文档分配和查询的目的分片,在创建索引的时候可以指定一个路由值,查询的时候可以通过这个路由值就可以指向对应的分片,相同查询的路由路径是相同的,1.x版本的ES可以将文档中的某个字段作为路由值,自2.0版本之后只能手动指定。路由确保了在索引时拥有相同路由值的文档会索引到相同的分片上,但一个给定的分片上可以有不同路由值的文档。

    ES通过路由值锁定目标分片的公式:shard = hash(routing) % number_of_primary_shards。
    通过路由值和索引名、索引类型的组合可以查询对应的节点,对应的API是searchshard API。
    代码如下:
    ClusterSearchShardsResponse response = esClient.admin().cluster().prepareSearchShards().setIndices(indices).setTypes(indexType).setRouting(routNum).execute().actionGet();

    相关链接:

    聚合:http://blog.csdn.net/dm_vincent/article/details/42407823

    脑裂:http://www.cnblogs.com/chenying99/p/4350930.html

  • 相关阅读:
    最长回文子串 V2(Manacher算法)
    用例建模Use Case Modeling
    分析一套源代码的代码规范和风格并讨论如何改进优化代码
    结合工程实践选题调研分析同类软件产品
    如何提高程序员的键盘使用效率
    antd移动端onClick事件点击无效
    webpack打包问题
    centos下部署项目问题
    javascript return 跟 break区别
    VUE清除组件内部定时器
  • 原文地址:https://www.cnblogs.com/warmingsun/p/5527963.html
Copyright © 2020-2023  润新知