Es 学习三

Elastic Search 学习记录:

    ES                                       Mysql
    
    1.Index         表示索引             1.database  数据库
    2.Type             表示类型             2.table     数据库某表
    3.Document         表示每一条记录       3.records   数据库表某一条记录
    4.field           表示记录的字段       4.coloum    数据库某个字段  
    
    Es中使用PrebuildTransportClient中获取到的response中的getSourse()得到的才document中的内容!
    
    注意: 
       外部:如果外部命令中指定了version,那么一定是要外部的version版本大于Es内部的version版本才能够正常执行相关指令
       内部:如果使用内部指定版本控制,则一定是以内部的版本和外部的版本相同时才能够正常执行相关指令
       它们之间由一个配置来控制: version_type = external  如果开启这个配置的话表示用外部来做版本控制
      
      
       控制台的mapping参数会自动将field的类型自动做绑定,以及对应的字段类型的属性
       String     类型查询支持分词
       date/long  类型查询只能够精确查询,不支持分词
       
       可以自动创建 mapping--> 里面自己去配置每一个field的类型
       
       es默认会为每一个字段、每一个内容多做索引,如果某些字段不需要索引可以自己将其的index设置为false
       
       如果在创建document的时候不设置一个id,那么es会自动为其创建一个id
       max_score为当前搜索匹配度,最大为1
       
    查询:
        term查询 :不知道es有分词器,只会去找原始的index,适用于integer、date等不分词的field
        terms查询:知道es有分词器存在,会将查询关键字分词,并查询只要符合其中一个分词的结果返回给用户
                    from:开始位置
                    size:取多少个
                    
                    "from" : 0,
                    "size" : 2,
                    "query" :{
                        "term" : {
                            // 这里的name代表匹配的field
                            "name" : ["lisi","zhangsan"]
                        } 
                    }
                    
        match查询 :match知道有分词器的存在在查询的时候会将关键字进行分词,只要doc中满足一个分词就能够将结果返回给用户
        match_phrase : 短语匹配查询 :{love you} 需要同时匹配上love you两个词,同时位置不变才能够被搜索出来
        wildcard : 通配符查询
        fuzzy : 模糊查询
        
        should : 满足其中一个条件就行
        must : 必须是多个条件都满足才能被查询到
        must_not : 必须是多个条件都不满足
        
        "query" : {
            "should"/"must"/"must_not" :{
                "term" : {
                    "name" : "zhangsan"
                },
                "term" : {
        
                    "age" : 23
                }
            
            }
        }
        基数 : 互不相同的个数
        
        Es的分片数一定要设置为节点数的1.5 - 3倍,为的就是以后做水平扩容的时候讲shard负载均衡到每一个node
        如果只是数据量的增大就只需要新增部分节点即可,没有必要增加副本数,因为增加副本数会导致服务器压力过大
        shard在创建index 的时候就已经确定,无法进行修改
        
        查询: 
            1.如果只是查询,非master上同时拥有此数据那么可以直接返回,无需经过master。如果被查询的node上没有需要查询的值,那么会转发到有和这个值得node上,也无需经过master
            2.如果是修改、删除、新增操作,则需要通过master,master上处理完毕之后,通过路由将这些命令发送给其他的node
            3.每一个shard都是一个luence实例,都能够独立的穿件index以及处理请求
            4.节点增加或者删除,集群会自动做shard的负载均衡(node的增加或者删除)
            5.node上一定存在一个主分片以及对应个数副本分片 主分片:primary shard 副本分片:replac      注意:每一个node的主分片和其副本分片不存在于同一个node上
            6.如果只有一个node的话,副本分片是没有办法被创建的,且此时的集群健康状态不乐观为 yellow 
            7.新增node的时候就能够将之前没有被创建出来的副本分片创建出来
            8.es集群扩容的极限是:shard + replica  =  主分片数 + 副本数
            9.宕机容错性: 容忍一半的服务器宕机  原则:必须保证数据的完整性
                        提高一个es集群的容错性,可以增加它的副本分片数
                        
        集群状态:
            1.全部主分片、全部副本分片都活跃 ---> green
            2.全部主分片活跃     ---> yellow
            3.非全部主分片活跃 ---> red
        容错机制:
            1.选举新的master
            2.将其他未宕机且这个节点上有shard,那么此时就会找到某个node,将此node上的对应丢失的shard的replica升级为shard
            此时集群的状态就会从red ----> 转为 yellow
            3.此时重启宕机的node,再将新增的shard副本信息,以及丢失掉的replica信息复制到该启动的node,此时健康状态从yellow ---> green 
            
        sourse:就是put document进去的那段内容 ,就是 documents 
        
        document里面的修改都是先将原来的document 标记为deleted , 然后再创建新的document
        post方式相比put方式减少了网络交互的次数,因此post的效率较高。
        delete删除文档也是将指定的文档标记为deleted
        
        注: 在节点或者服务器容量不够时,集群会将这些标记为deleted的数据源删除点
        get 和 query 都不能够获取到这个标记为deleted的文档
        
        文档路由:
                一般来说集群中有多个主分片(primary shard),所以我们在存储数据的时候需要选择存在哪一个分片上面:
                此时这个document就需要指定一个routingKey,通常来说和这个routingKey就是和这个document的_id
                路由计算方式: int shardIndex = hash(routingKey) % num_of_primary_shrads;
                
        数据请求的节点:协调节点,因为不一定新增的数据就是添加在该node,而是得根据文档路由的算法来计算放在哪个shard上,然后转发至那个节点!
        指定节点存储数据完毕之后将,将新增数据同步到replica,协调节点向请求者响应,此时才算完成一个数据请求。
        
        deep paging : 数据分页中的深度分页,这里的深度分页的流程是将全部的数据发送到协调节点上去重新排序,这样非常消耗资源、内存。
        
        copyto : 指定字段  (可以将text类型的数据值 copyto 到一个指定的字段,这样在使用查询的时候可以使用这个copyto字段,而不需要多个字段都查询了)
                  注意: copy to 指定字段的类型一定是text类型
                  
        如果对某个字段field制定了type = keyword 那么该field对应的值就不会被再次分词。
        
        
        -socore : 在所有文档中出现的次数越多,相关度越低。出现的次数越少,相关度越高。
                  匹配上的text越长,相关度越低。匹配上的text越短,相关度越高。
                  
        ES中不仅有倒排索引,同时也拥有正排索引DocValues,需要注意的是这里的docValues是默认开启的,只对不可分词的类型建立正排索引。
        scroll : 分批次查询
        yyyy-MM-dd : 如果数据格式为yyyy-MM-dd格式会被系统默认为date类型
        
        doc里面的field类型一旦创建,就无法被修改。
        aliaes : 别名关联 : 可以不重启解决数据格式问题。
        
        
        ES连接:
            1.现指定集群:  Settings settings = Settings.Builder().put("cluster.name","指定集群名字").build();
            2.创建连接客户端: TransportClient client = new PreBuildTransportClint(TransportAddress);
            3.指定node的address:new TransportAddress(InetAddress.getByName("node名称 or node的地址",port(9300)));
            4.进行相关操作
            
        QueryBuilder 就是ES里面的指定字段查询
        
        term--> 指定一个keyword 不分词
        terms--> 可以指定多个查询keyword,支持分词
        
        must:必须达成某条件
        must_not: 必须不能达成某条件
        
        match:支持分词查询
        matchAll : 查询全部
        matchParse : 短语查询
        
        
        管理工具kibina 或者 head
        
            
            
        
        
        
        
        
        
                    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章