• elasticsearch 心得


    1.es 一台机器一般为一个节点。一台机器不设置的情况下是无法创建副本集的,副本集和主本必须不在一个节点下,方便故障转移等

    2.es7.x后一个索引后只能创建一个类型,可以通过修改更改

    出现这个的原因是,elasticsearch7默认不在支持指定索引类型,默认索引类型是_doc,如果想改变,则配置include_type_name: true 即可(这个没有测试,官方文档说的,无论是否可行,建议不要这么做,因为elasticsearch8后就不在提供该字段)。官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/removal-of-types.html

    3.创建索引定义数据类型  相当于sqlserver中的创建表

    postman工具来进行请求发送

    {
        "settings": {
            "number_of_shards": 3,
            "number_of_replicas": 0
        },
        "mappings": {
            "properties": {
                "wordid": {
                    "type": "integer"
                },
                "word": {
                    "type": "text"
                },
                "wordsign": {
                    "type": "long"
                },
                "wordhint": {
                    "type": "integer"
                },
                "searchcount": {
                    "type": "integer"
                },
                "createtime": {
                    "type": "date",
                    "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
                },
                "appstoreids": {
                    "type": "nested",
                    "properties": {
                        "appstoreid": {
                            "type": "long"
                        },
                        "rank": {
                            "type": "integer"
                        },
                        "apptype": {
                            "type": "integer"
                        },
                        "change":{
                            "type":"integer"
                        },
                        "isnew":{
                            "type":"integer"
                        }
                    }
                }
            }
        }
    }

    4.es的数据类型

    核心类型 字符串类型 string,text,keyword 
    整数类型 integer,long,short,byte 
    浮点类型 double,float,half_float,scaled_float 
    逻辑类型 boolean 
    日期类型 date 
    范围类型 range 
    二进制类型 binary 
    复合类型 数组类型 array 
    对象类型 object 
    嵌套类型 nested 
    地理类型 地理坐标类型 geo_point 
    地理地图 geo_shape 
    特殊类型 IP类型 ip 
    范围类型 completion 
    令牌计数类型 token_count 
    附件类型 attachment 
    抽取类型 percolator 
     
    5.由于es的内存使用的是java的jvm,所以设置占用的内存最好小于32g
    6.关于es的优化

    //修改默认查询条数 不过不起作用好像
    alarm/_settings
    {
    "max_result_window" : 200000000
    }
    2. 开启最佳压缩
    对于打开了上述_source字段的index,可以通过下面的命令来把lucene适用的压缩算法替换成 DEFLATE,提高数据压缩率。
    http://127.0.0.1:9200/searchresult/_settings
    {
    "index.codec": "best_compression"
    }
    3. bulk批量写入
    写入数据时尽量使用下面的bulk接口批量写入,提高写入效率。每个bulk请求的doc数量设定区间推荐为1k~1w,具体可根据业务场景选取一个适当的数量。
    4. 调整translog同步策略
    默认情况下,translog的持久化策略是,对于每个写入请求都做一次flush,刷新translog数据到磁盘上。这种频繁的磁盘IO操作是严重影响写入性能的,如果可以接受一定概率的数据丢失(这种硬件故障的概率很小),可以通过下面的命令调整 translog 持久化策略为异步周期性执行,并适当调整translog的刷盘周期。
    http://127.0.0.1:9200/searchresult/_settings
    {
    "index": {
    "translog": {
    "sync_interval": "5s",
    "durability": "async"
    }
    }
    }

    5. 调整refresh_interval
    写入Lucene的数据,并不是实时可搜索的,ES必须通过refresh的过程把内存中的数据转换成Lucene的完整segment后,才可以被搜索。默认情况下,ES每一秒会refresh一次,产生一个新的segment,这样会导致产生的segment较多,从而segment merge较为频繁,系统开销较大。如果对数据的实时可见性要求较低,可以通过下面的命令提高refresh的时间间隔,降低系统开销。
    http://127.0.0.1:9200/searchresult/_settings
    {
    "index": {
    "refresh_interval": "30s"
    }
    }
    6. merge并发控制
    ES的一个index由多个shard组成,而一个shard其实就是一个Lucene的index,它又由多个segment组成,且Lucene会不断地把一些小的segment合并成一个大的segment,这个过程被称为merge。默认值是Math.max(1, Math.min(4, Runtime.getRuntime().availableProcessors() / 2)),当节点配置的cpu核数较高时,merge占用的资源可能会偏高,影响集群的性能,可以通过下面的命令调整某个index的merge过程的并发度:

    PUT /my_index/_settings
    {
    "index.merge.scheduler.max_thread_count": 2
    }
    7. 写入数据不指定_id,让ES自动产生
    当用户显示指定_id写入数据时,ES会先发起查询来确定index中是否已经有相同_id的doc存在,若有则先删除原有doc再写入新doc。这样每次写入时,ES都会耗费一定的资源做查询。如果用户写入数据时不指定doc,ES则通过内部算法产生一个随机的_id,并且保证_id的唯一性,这样就可以跳过前面查询_id的步骤,提高写入效率。

    所以,在不需要通过_id字段去重、update的使用场景中,写入不指定_id可以提升写入速率。腾讯云CES技术团队的测试结果显示,无_id的数据写入性能可能比有_id的高出近一倍,实际损耗和具体测试场景相关。

    3. 禁止swap,一旦允许内存与磁盘的交换,会引起致命的性能问题。 通过: 在elasticsearch.yml 中 bootstrap.memory_lock: true, 以保持JVM锁定内存,保证ES的性能。

    对于数据量较小(100GB以下)的index,往往写入压力查询压力相对较低,一般设置3~5个shard,number_of_replicas设置为1即可(也就是一主一从,共两副本) 。
    对于数据量较大(100GB以上)的index:
    一般把单个shard的数据量控制在(20GB~50GB)
    让index压力分摊至多个节点:可通过index.routing.allocation.total_shards_per_node参数,强制限定一个节点上该index的shard数量,让shard尽量分配到不同节点上
    综合考虑整个index的shard数量,如果shard数量(不包括副本)超过50个,就很可能引发拒绝率上升的问题,此时可考虑把该index拆分为多个独立的index,分摊数据量,同时配合routing使用,降低每个查询需要访问的shard数量。

    //复制索引和数据
    http://127.0.0.1:9200/_reindex
    {
    "source": {
    "index": "searchresult"
    },
    "dest": {
    "index": "searchresult2"
    }
    }

     
  • 相关阅读:
    数据结构(复习)链表完结篇
    第三部分_JSP详解续
    第二部分_搭建Java Web开发环境与配置Tomcat服务器&JSP详解
    第一部分_HTTP协议详解&HTML常用控件
    集合框架中的接口及其实现类
    封底估算
    从起泡排序探究算法正确性证明的一般规律
    各种曲线运动、弹球、笔记
    Android 之px于dp在Java代码中的转换
    sqlite之聚合函数的使用
  • 原文地址:https://www.cnblogs.com/elsons/p/11863601.html
Copyright © 2020-2023  润新知