Elasticsearch入门语法

作者: MacSam | 来源:发表于2016-05-23 11:18 被阅读23959次

    接着上一篇的安装后,笔者来介绍下es的简单用法

    首先是一些术语和基本的概念,这里的数据借鉴了es的中文文档
    让我们建立一个员工目录
    假设我们刚好在Megacorp工作,这时人力资源部门出于某种目的需要让我们创建一个员工目录,这个目录用于促进人文关怀和用于实时协同工作,所以它有以下不同的需求:
    数据能够包含多个值的标签、数字和纯文本。
    检索任何员工的所有信息。
    支持结构化搜索,例如查找30岁以上的员工。
    支持简单的全文搜索和更复杂的短语(phrase)搜索
    高亮搜索结果中的关键字
    能够利用图表管理分析这些数据

    • 在Elasticsearch中存储数据的行为就叫做索引(indexing),不过在索引之前,我们需要明确数据应该存储在哪里。在Elasticsearch中,文档归属于一种类型(type),而这些类型存在于索引(index)中,这样说可能不是很好理解,这里贴出一张es和关系型数据库的对应图,就懂了
      Paste_Image.png
    • 第一步:创建员工目录,为每个员工的文档(document)建立索引,每个文档包含了相应员工的所有信息。
      1. 每个文档的类型为employee
      2. employee类型归属于索引megacorp
      3. megacorp索引存储在Elasticsearch集群中。
    PUT /megacorp/employee/1
    {
        "first_name" : "John",
        "last_name" :  "Smith",
        "age" :        25,
        "about" :      "I love to go rock climbing",
        "interests": [ "sports", "music" ]
    }
    

    上图代表的意思是在一个叫megacorp的索引(index)中建立了一个叫
    employee的类型(type),它的ID是1,整个json部分代表的是这个id为1的文档(document).
    同样的,我们再次插入两个document.

    PUT /megacorp/employee/2
    {
        "first_name" :  "Jane",
        "last_name" :   "Smith",
        "age" :         32,
        "about" :       "I like to collect rock albums",
        "interests":  [ "music" ]
    }
    PUT /megacorp/employee/3
    {
        "first_name" :  "Douglas",
        "last_name" :   "Fir",
        "age" :         35,
        "about":        "I like to build cabinets",
        "interests":  [ "forestry" ]
    }
    
    • 搜索,上一步中插入了3个document,我们可以通过http get来获取它们的信息.
    GET /megacorp/employee/1
    
    {
      "_index" :   "megacorp",
      "_type" :    "employee",
      "_id" :      "1",
      "_version" : 1,
      "found" :    true,
      "_source" :  {
          "first_name" :  "John",
          "last_name" :   "Smith",
          "age" :         25,
          "about" :       "I love to go rock climbing",
          "interests":  [ "sports", "music" ]
        }
    }
    

    _index--索引名称
    _type--类型名称
    _id--id(这个id可以自己指定也可以自动生成)
    _version--版本号,每次改动会+1
    found--true表示在document存在
    _source--document的全部内容

    • 轻量级搜索,查询字符串(query string)
    GET /megacorp/employee/_search?q=last_name:Smith
    
    {
       "took":      6,                                    //花费的时间(毫秒)
       "timed_out": false,                                //是否超时
        "_shards": { ... },                               //分片相关,后续介绍
       "hits": {                                          //存放所有命中
          "total":      2,                                //命中document的个数
          "max_score":  0.30685282,                       //最高命中分
          "hits": [
             {
                ...
                "_source": {
                   "first_name":  "John",
                   "last_name":   "Smith",
                   "age":         25,
                   "about":       "I love to go rock climbing",
                   "interests": [ "sports", "music" ]
                }
             },
             {
                ...
                "_source": {
                   "first_name":  "Jane",
                   "last_name":   "Smith",
                   "age":         32,
                   "about":       "I like to collect rock albums",
                   "interests": [ "music" ]
                }
             }
          ]
       }
    }
    
    • Elasticsearch提供丰富且灵活的查询语言叫做DSL查询(Query DSL),它允许你构建更加复杂、强大的查询。DSL(Domain Specific Language特定领域语言)以JSON请求体的形式出现。我们可以这样表示之前关于“Smith”的查询:
    GET /megacorp/employee/_search
    {
        "query" : {
            "match" : {
                "last_name" : "Smith"
            }
        }
    }
    
    • 更复杂的搜索,使用过滤器(filter)来实现sql中where的效果,比如:你想要搜索一个叫Smith,且年龄大于30的员工,可以这么检索.
    GET /megacorp/employee/_search
    {
        "query" : {
            "filtered" : {
                "filter" : {
                    "range" : {
                        "age" : { "gt" : 30 } 
                    }
                },
                "query" : {
                    "match" : {
                        "last_name" : "Smith" 
                    }
                }
            }
        }
    }
    
    • 短语搜索(phrases),match_phrase与match的区别在于,前者会把rock climbing(搜索条件)作为一个整体,而后者会命中rock balabala climbing
    GET /megacorp/employee/_search
    {
        "query" : {
            "match_phrase" : {
                "about" : "rock climbing"
            }
        }
    }
    
    • 聚合(aggregations),它允许你在数据上生成复杂的分析统计,类似于sql中的group by.
    GET /megacorp/employee/_search
    {
      "aggs": {
        "all_interests": {
          "terms": { "field": "interests" }
        }
      }
    }
    
    {
       ...
       "hits": { ... },
       "aggregations": {
          "all_interests": {
             "buckets": [
                {
                   "key":       "music",
                   "doc_count": 2
                },
                {
                   "key":       "forestry",
                   "doc_count": 1
                },
                {
                   "key":       "sports",
                   "doc_count": 1
                }
             ]
          }
       }
    }
    
    • 如果我们想知道所有姓"Smith"的人最大的共同点(兴趣爱好),我们只需要增加合适的语句既可:
    GET /megacorp/employee/_search
    {
        "query": {
          "match": {
            "last_name": "smith"
          }
        },
      "aggs": {
          "all_interests": {
            "terms": {
              "field": "interests"
            }
          }
        }
    }
    
    • 聚合也允许分级汇总。例如,让我们统计每种兴趣下职员的平均年龄
    GET /megacorp/employee/_search
    {
        "aggs" : {
            "all_interests" : {
                "terms" : { "field" : "interests" },
                "aggs" : {
                    "avg_age" : {
                        "avg" : { "field" : "age" }
                    }
                }
            }
        }
    }
    
    ...
     "all_interests": {
         "buckets": [
            {
               "key": "music",
               "doc_count": 2,
               "avg_age": {
                  "value": 28.5
               }
            },
            {
               "key": "forestry",
               "doc_count": 1,
               "avg_age": {
                  "value": 35
               }
            },
            {
               "key": "sports",
               "doc_count": 1,
               "avg_age": {
                  "value": 25
               }
            }
         ]
      }
    

    当然这只是一些皮毛,为了保持简短,还有很多的特性未提及——像推荐、定位、渗透、模糊以及部分匹配等,这里是简单的介绍了如何创建及简单的查询
    下篇预告 : ES的数据CURD

    相关文章

      网友评论

      • 11638b056e3d:索引有什么作用呢?
      • wdom:学习了,很有帮助,试着用Wisdom RESTClient自动化测通Elasticsearch REST API,生成精美的测试报告。
        Wisdom RESTClient
        https://github.com/Wisdom-Projects/rest-client

        谢谢作者的分享,赞一个!
      • 夜行侠_5d95:夜行侠老师视频教学:es问题汇总
        http://www.itjoin.org/
        1、如何防止索引被删除(权限控制)
        2、搜索的精准性控制
        3、解决搜索中英文数字混合
        4、搜索中in查询
        5、安装问题
        6、es源码内部是如何做到插件化扩展
        7、统计时展示不全
        8、搜索条件过多,内容过长报错
        9、索引某一字段内容太大
        10、自动补全设计
        11、es的分布式如何实现RPC底层
        12、es的分片机制
        13、head插件的使用
        14、es分片和副本级的是原理
        15、如何做到只更新部分数据
        16、数组在index中如何制定
        17、es搜索结果窗口太大
        18、group by里如何排序
        19、es底层新增和删除索引的全过程
        20、es底层检索的全过程
      • 952e7c1360ee:最后一个经测试有问题。:stuck_out_tongue_closed_eyes:
      • 4531d8f36bff:已解决 :smile:
      • 4531d8f36bff:GET /megacorp/employee/_search?q=last_name:Smith
        上面这个搜索可以生效
        下面的DSL查询不能生效
        求解 :sweat:

      本文标题:Elasticsearch入门语法

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