美文网首页ElasticSearch
Elasticsearch之学习总结

Elasticsearch之学习总结

作者: 任嘉平生愿 | 来源:发表于2019-06-17 15:29 被阅读0次
    1.ES存储数据的格式和mongo的数据格式是一样的都是以文档的形式
    image.png
    2.部分参数的意义

    _seq_no:严格递增的顺序号,每个文档一个,Shard级别严格递增,保证后写入的Doc的_seq_no大于先写入的Doc的_seq_no。

    任何类型的写操作,包括index、create、update和Delete,都会生成一个_seq_no。这个是不可改的,而_version这个版本号是可以改的.

    _primary_term:_primary_term也和_seq_no一样是一个整数,每当Primary Shard发生重新分配时,比如重启,Primary选举等,_primary_term会递增1。

    _primary_term主要是用来恢复数据时处理当多个文档的_seq_no一样时的冲突,比如当一个shard宕机了,raplica需要用到最新的数据,就会根据_primary_term和_seq_no这两个值来拿到最新的document

    3.es是以rest请求对文档进行增上改查

    (1)通过curl -x 命令
    curl -XGET http://192.168.229.151:9200/lib1/user20190614/1

    image.png

    (2)通过kibana
    GET /lib1/user20190614/1

    image.png
    (3)通过java代码参考我这边文章
    Elasticsearch之restful接口调用 - 简书
    4.ES在集群启动的时候一定要指定一个用户如esuser否则会报错
    5.查看ES启动成功

    (1)通过命令curl http://192.168.229.151:9200


    image.png

    (2)通过es-haed


    image.png
    6.建立倒排索引的过程就是先分词,然后将文档属于哪个词下面加上序号。查询的过程就是哪个匹配度高哪个就在前面。分词的过程中会有大小写,相同语义,单复数停滞词等问题,可以指定分词器比如ik中文分词器。
    7.下载ik分词器与ES继承
    8.创建索引的时候应该先指定一些参数,比如主分片个数和副本个数

    这里有个隐身的问题:设置多少分片和副本合适?依据是什么?
    关于副本:副本对搜索性能非常重要, 同时用户也可在任何时候添加或删除副本. 额外的副本能给你带来更大的容量, 更高的呑吐能力及更强的故障恢复能力.
    关于分片:因为主分片一旦被设置就不能更改,设置少了性能压力大,设置多了又浪费资源增加成本。
    ElasticSearch推荐的最大JVM堆空间是30~32G, 所以把你的分片最大容量限制为30GB, 然后再对分片数量做合理估算. 例如, 你认为你的数据能达到200GB, 我们推荐你最多分配7到8个分片.总之, 不要现在就为你可能在三年后才能达到的10TB数据做过多分配. 如果真到那一天, 你也会很早感知到性能变化的.

    9.创建索引的时候不应该使用默认的mapping因为数据格式往往不是你想要的同时为后面的分词找麻烦例如。
    image.png

    age是int,也就是说默认为text会分词。所以需要自己创建mapping.

    PUT /lib2
    {
        "mappings": {
                "properties": { 
                    "title":    { "type": "text"  }, 
                    "name":     { "type": "keyword"  }, 
                    "age":      { "type": "integer" },  
                    "created":  {
                        "type":   "date", 
                        "format": "strict_date_optional_time||epoch_millis"
                                         }
            
                                }
                }
    }
    

    mapping中详细的参数属性有很多


    image.png
    10.一些查询的关键词的意思

    _setting 查看配置信息
    _mapping 查看映射
    _bulk 批量加入
    查询
    https://my.oschina.net/weiweiblog/blog/1574020

    11.批量增加_bulk 增加的数量是有限制的默认大小在10-15m 默认在1000-500个文档
    12.ES在解决并发的时候采用的是CAS乐观锁的机制。版本号。配合外围数据库时要version一定要大于当前version否则修改不成功。
    13.更新操作
    POST /lib1/user20190614/1/_update
    {
      "script":"ctx._source.name = \"zhaoming\""
      
    }
    
    image.png
    14.external 修改操作

    version_type=external,唯一的区别在于,_version,只有当你提供的version与es中的_version一模一样的时候,才可以进行修改,只要不一样,就报错;当version_type=external的时候,只有当你提供的version比es中的_version大的时候,才能完成修改

    PUT  /lib1/user20190614/1?version=5&version_type=external
    {
      "name": "zhao"
    }
    
    image.png
    15.各种查询

    (1)精确查询

    GET /lib1/user20190614/_search
    {
      "query": {
        "term" : {
            "age" : 20
        }
      }
    }
    #name 中包含zhao li 就行  其实这个也不精确
    GET /lib1/user20190614/_search
    {
        "query": {
            "terms" : { "name" : ["zhao", "li"]}
        }
    }
    
    image.png

    (2)分词查询

    GET /lib1/user20190614/_search
    {
      "query": {
        "match" : {
            "name" : "zhao"
        }
      }
    }
    

    (3)短语匹配match_phrase 区别在于必须精确匹配顺序一致

    GET /lib1/user20190614/_search
    {
        "query": {
            "match_phrase": {
                "name": "zhao si"
            }
        }
    }
    
    image.png

    (4)查找按顺序排序

    GET zhifou/doc/_search
    {
      "sort": [
        {
          "age": {
            "order": "desc"
          }
        }
      ]
    }
    
    image.png

    (5)通配符匹配查询

    GET /lib3/user/_search
    {
      "query": {
        "wildcard": {
          "name": {
            "value": "zhao*"
          }
        }
      }
    }
    

    (6)前缀匹配

    GET /lib3/user/_search
    {
      "query": {
        "prefix": {
          "name": {
            "value": "zha"
          }
        }
      }
    }
    

    (7)模糊查询

    GET /lib3/user/_search
    {
      "query": {
        "fuzzy": {
          "name": {
            "value": "zha"
          }
        }
      }
    }
    
    image.png

    (8)控制查询出来的文档个数from size

    GET /lib3/user/_search
    {
     "from": 0,
     "size": 1, 
      "sort": [
        {
          "age": {
            "order": "desc"
          }
        }
      ]
    }
    

    (9)查询出来只现实指定的字段

    GET /lib3/user/_search
    {
     "from": 0,
     "size": 1, 
    
      "sort": [
        {
          "age": {
            "order": "desc"
          }
        }
      ]
    }
    

    (10)组合查询 should must

    GET /lib3/user/_search
    {
      "query": {
        "bool": {
          "must": [
            {
              "match": {
                "name": "zhao"
              }
            }
          ],
          "should": [
            {"match": {
                "name": "zhao"
              }
            }
          ]
          
        }
        
      }
    }
    
    image.png

    (11)聚合查询min max avg

    GET /lib3/user/_search
    {
      "query": {
        "bool": {
          "must": [
            {
              "match": {
                "name": "zhao"
              }
            }
          ]
        }
         
        
      },"aggs": {
          "agg": { 
            "terms": { 
              "field": "age"
            }
          }
       }
    }
    
    image.png
    GET /lib3/user/_search
    {
      "query": {
        "bool": {
          "must": [
            {
              "match": {
                "name": "zhao"
              }
            }
          ]
        }
         
        
      },
      "aggs": {
          "avgs": { 
    #avg min max  sum
           "avg": {
           
             "field" : "grade"
                       }
                  
                  }
            }
    }
    
    image.png
    16.Elasticsearch分片机制

    分片分为主分片和副本,当一个文档生成的时候会有一个routid然后,hash routeid 会在取模主分片会将文档存放在对应的节点。

    17.当主分片的个数确定了以后是不可以修改的,每一个shared对应一个luncene实例,为什么不能改主分片的个数是因为分片机制确定。当集群中为黄色的时候是因为所有的主分片没有对应的副本。es集群中的选举指制度是paoxs算法及zookeeper,当有多数节点认可即可。
    18.ESput修改和删除文件时不会删除文档而是在后面加一个标记del.。
    19.ES关于数据一致性的问题采用,quorum机制及保证大部分写成功。

    当主分片的个数大于一般就可以执行,如果没有达到则会报超时。

    20.deeppage深度分页查询时ES的痛点。当查询第990-1000中的前10条数据时他会从每个shared中先查询1000然后再合并也就是查询了1000的shared个数的倍数。
    21.当需要修改mapping的时候只能创建对应的mapping然后再导入数据。
    22.查询出来的文档的相关度的高低取决于1.TF/IDF.词条正在文档中出现的次数。2.关键字再当个文档中出现的次数3.文档的长度,长度越短匹配度越高。

    相关文章

      网友评论

        本文标题:Elasticsearch之学习总结

        本文链接:https://www.haomeiwen.com/subject/enmzxctx.html