elasticsearch入门到精通

1、基本概念

  • 节点:node,一个es实例,一台机器可以有多个实例,所以不能说一台机器就是一个节点

    • 主节点:负责管理集群范围内的所有变更,例如增加、删除索引,或者增加、删除节点等。主节点并不需要涉及到文档级别的变更和搜索等操作。可以通过属性node.master进行设置。
    • 数据节点:存储数据和其对应的倒排索引。默认每一个节点都是数据节点(包括主节点),可以通过node.data属性进行设置。
    • 协调节点:如果node.master和node.data属性均为false,则此节点称为协调节点,用来响应客户请求,均衡每个节点的负载。
  • 分片:Shard,一个索引中的数据保存在多个分片中,即一个索引的数据会存在多台服务器上。一个分片便是一个Lucene 的实例,它本身就是一个完整的搜索引擎。我们的文档被存储和索引到分片内,但是应用程序是直接与索引而不是与分片进行交互。 每一个节点上都只会保存主分片或者其对应的一个副本分片,相同的副本分片不会存在于同一个节点中。实际上,每一个分片还会进一步拆分为分段(Segment)

  • 副本:replica,副本是一个分片的精确复制,每个分片可以有零个或多个副本。ES中可以有许多相同的分片,其中之一被选择更改索引操作,这种特殊的分片称为主分片。

2、读写过程

  • 读过程:主分片和副本分片都可以处理读请求
    get方式读

    拿着doc_id,进行hash,找到对应的机器节点;去该机器上面找到对应的数据
    

    query方式读

    拿着查询条件,连接到协调节点;
    协调节点将这个请求发送给每一个shard(主分片或者副本分片),每个分片在本地执行搜索并构建一个匹配文档的大小为 from + size 的优先队列
    query phase:所有分片查询到匹配的数据,并将查询到的数据(这里的数据不止是_id,而是包含整条文档数据)返回到本地优先队列,经过排序,只将doc_id和排序值返回给协调节点。
    fetch phase:这时候的协调节点拿到的数据,不是全的,只有一个doc_id,协调节点回表拉取数据
    返回数据
    
  • 写过程:只有主分片能处理写请求,主分片写完后,再将主分片的数据同步到副分片;
    客户端选择一个node发送请求过去,这个node就是coordinating node(协调节点)。
    coordinating node,对document进行路由,将请求转发给对应的node(有primary shard)。然后实际的node上的primary shard处理请求,然后将数据同步到replica node。coordinating node如果发现primary node和所有replica node都搞定之后,就返回响应结果给客户端
    数据写shard原理

    • 数据同时写入buffer缓冲和translog日志文件(相当于spark的checkpoint,数据放在磁盘,用于宕机时候恢复内存数据)
    • 每隔一秒钟,buffer中的数据被写入新的segment file,并进入os cache,这个过程称为refresh,此时segment被打开并供search使用,也就是写入的数据 1 秒之后才能被看到,在buffer中的数据是搜索不到的,这就是es是准实时的原因。这时候数据还是在内存
    • buffer被清空
    • 重复1~3,新的segment不断添加,buffer不断被清空,而translog中的数据不断累加
    • 当translog长度达到一定程度的时候,commit操作发生;
      buffer中的所有数据写入一个新的segment,并写入os cache,打开供使用;
      buffer被清空;
      一个commit ponit被写入磁盘,标明了所有的index segment;
      filesystem cache中的所有index segment file缓存数据,被fsync强行刷到磁盘上;
      现有的translog被清空,创建一个新的translog;所以translog日志只是为了防止数据丢失,恢复使用的,真正写到磁盘保存的数据是segment file

3、操作ES
使用kibana操作ES***

  1)查询所有记录
GET /_search
  2)增加一条记录
PUT /blog/person/7
{
   
    "user" : "ljy",
    "desc" :  "gaoxiao meibai"
}
  3)查询某条记录
get /blog/person/3
  4)全文检索
GET /blog/person/_search
{
   
    "query" : {
   
        "match" : {
   
            "user" : "张"
        }
    }
}

4、批量插入:只请求一次,减少开销

doc = [
     {
   "index": {
   }},
     {
   'name': 'jackaaa', 'age': 2000, 'sex': 'female', 'address': u'北京'},
     {
   "index": {
   }},
     {
   'name': 'jackbbb', 'age': 3000, 'sex': 'male', 'address': u'上海'},
 ]
es.bulk(index='ljytest1',doc_type = 'test1', body = doc) #这里必须填index,doc_type,body!!!!

5、ES查询

  • elasticsearch的查询有两种:query and filter。
    两者的主要区别在于:filter是不计算相关性的,同时可以cache。因此,filter速度要快于query。
  • term: 效率更高
    term是代表完全匹配,即不对查询语句的关键词进行分词器分析(但是ES里面存储的肯定都会进行分词的),文档中必须包含整个搜索的词汇才能匹配出来。
    //ES里面存数据时会将ljy和hxt分开存,如果用term查询的话,就会查不出来ljy+hxt。用match就能查出来
    query = {‘query’: {‘term’: {‘name’: ‘ljy+hxt’}}}
    res = es.search(“test-index”, “tweet”, query)
  • match:match首先对查询的词进行分词,包含一个到多个token的记录都会被查询出来

6、如果设置为not_analyzed则会将整个字段存储为关键词,常用于汉字短语、邮箱等复杂的字符串;如果设置为analyzed则将会通过默认的standard分析器进行分析
7、自定义mapping, 且包含nested数据结构(可简单看成平时的数组,但是跟数组有区别),然后创建index

my_mappings = {
   
    "settings": {
   	#setting里面设置分词器,分片等信息,这些分词器设置之后,在下面的mapping中就可以用这些分词器了,比如 "search_analyzer","index_analyzer"
        "analysis": {
   
            "analyzer": {
   
                "search_analyzer": {
   
                    "filter": [
                        "lowercase",
                        "my_synonym"
                    ],
                    "tokenizer": "ik_smart"
                },
                "index_analyzer": {
   
                    "filter": [
                        "lowercase"
                    ],
                    "tokenizer": 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值