zoukankan      html  css  js  c++  java
  • ElasticSearch(三)常用DSL语句解析

    一、前言

      执行命令行操作es的方式有几种,比如使用postman,或者我们前面安装的kibana客户端,或者JavaApi等等,这篇文章重点介绍用kibana来操作我们的索引库。

      DSL语句:领域专用语言,由叶子查询子句复合查询子句两种子句组成。

      Elasticsearch提供了基于JSON的DSL来定义查询。

    二、索引部分

    索引创建

    #1、创建索引库,同时设置分词器【有梦想的肥宅】
    PUT /zh_user 
    {
        "settings": {
            "index": {
                "analysis.analyzer.default.type": "ik_max_word"
            }
        }
    }

    PS:PUT请求具有幂等性,如果重复执行同样的语句创建索引库会报错

    索引查询

    查看所有索引

    #2、查询所有索引【有梦想的肥宅】
    GET /_cat/indices?v

    查看单个索引

    #3、查询单个索引【有梦想的肥宅】
    GET /zh_user

    索引删除

    #4、删除索引库【有梦想的肥宅】
    DELETE /zh_user

    三、文档部分

    创建文档

    #5、创建文档【格式:POST /索引名称/类型(7.6.1版本默认是_doc)/id
    POST /zh_user/_doc/1/
    {
        "name": "有梦想的肥宅",
        "sex": "男",
        "age": 27,
        "address": "广西南宁",
        "remark": "有趣又上进的灵魂~"
    }

    PS:创建文档要用POST,如果没有指定id的话,es会自动生成,指定了就用我们指定的id

    查询文档

    主键查询

    #6、根据主键查询文档(数据)【有梦想的肥宅】
    GET /zh_user/_doc/1

    全查询

    #7、全量查询索引下文档(数据)【有梦想的肥宅】
    GET /zh_user/_search

    修改文档

    全量修改

    #8、全量修改文档【格式:PUT /索引名称/类型(7.6.1版本默认是_doc)/id】
    PUT /zh_user/_doc/1/
    {
        "name": "有梦想的肥宅【更新】",
        "sex": "男",
        "age": 27,
        "address": "广西南宁",
        "remark": "有趣又上进的灵魂~"
    }

    局部修改

    #9、局部修改文档【格式:PUT /索引名称/类型(7.6.1版本默认是_doc)/id
    POST /zh_user/_update/1/
    {
      "doc":{    
          "name": "有梦想的肥宅【更新】",
          "sex": "男【更新】",
          "address": "广西南宁【更新】"
      }
    }

    删除

    #10、删除索引库内的文档(数据)【有梦想的肥宅】
    DELETE /zh_user/_doc/1

    四、查询操作部分

    条件查询

    #11、条件查询【有梦想的肥宅】
    GET /zh_user/_search
    {
        "query":{
            "match":{
                "sex":"男"
            }
        }
    }

    分页查询

    #12、分页查询【有梦想的肥宅】
    GET /zh_user/_search
    {
        "query":{
            "match":{
                "sex":"男"
            }
        },
        "from":0,
        "size":2
    }

    排序查询

    #13、排序查询【有梦想的肥宅】
    GET /zh_user/_search
    {
        "query":{
            "match_all":{} #表示查询全部数据
        },
        "sort":{
            "age":{
                "order":"desc"
            }
        }
    }

    多条件查询

    #14、多条件查询【有梦想的肥宅】
    GET /zh_user/_search
    {
        "query":{
            "bool":{ #表示需要进行条件过滤
                "must":[{ #表示必须满足下面的条件,并且参与计算分值,常用的子句还有should,表示“或”的意思
                    "match":{
                        "address":"广西南宁"
                    }
                },{
                    "match":{
                        "sex":"男"
                    }
                }]
            }
        }
    }

    范围查询

    #15、范围查询【有梦想的肥宅】
    GET /zh_user/_search
    { "query": { "bool": {
    #表示需要进行条件过滤 "filter": [{ #返回的文档必须满足filter子句的条件。但是跟Must不一样的是,不会计算分值,并且可以使用缓存。【不算分的场景使用这个效率会提升】 "range": { "age": { "gt": 1 #表示查询年龄大于1岁的小伙伴~ } } }] } } }

    查询分词结果

    #16、查询分词结果【有梦想的肥宅】
    GET /zh_user/_doc/1/_termvectors?fields=address
    
    PS:这条语句的意思是,查询索引库zh_user下id为1的,字段为address的数据分词的结果

      也可以直接对一段文字进行分词结果查询:

    POST _analyze 
    {
        "text": ["广西南宁青秀区"],
        "analyzer": "ik_max_word" #分词器:standard【中文单字分词】、ik_smart【最粗粒度拆分】、ik_max_word【最细粒度的拆分】
    }

    完全匹配

      为了更好理解完全匹配的概念,我们先看一个例子:

    PS:match:分词后搜索。比如分词后有N个分词,只要匹配上其中一个就可以返回数据了。
    GET /zh_user/_search { "query":{ "match":{ "name" : "梦想哈" } } }

    #17、完全匹配查询【有梦想的肥宅】
    PS:match_phrase:分词后搜索。与match不同的是,match_phase分出来的词必须全部在搜索结果中,且位置顺序是一样的。
    PS:
    这里说的完全匹配不是说必须输入“有梦想的肥宅【更新】”才能精确匹配出来,而是分词后顺序一致就可以查询出来 GET /zh_user/_search { "query":{ "match_phrase":{ "name" : "梦想哈" } } }

     

    高亮查询

    #18、高亮查询【有梦想的肥宅】
    GET /zh_user/_search
    {
        "query": {
            "match_phrase": {
                "name": "有梦想"
            }
        },
        "highlight": {
            "fields": {
                "name": {} #表示对当前字段进行高亮处理
            }
        }
    }

    聚合/分组查询

    #19、聚合查询【有梦想的肥宅】
    GET /zh_user/_search
    {
        "aggs":{ #表示聚合操作
            "age_group":{ #分组名称,可以随便起
                "terms":{ #表示分组操作,也可以使用avg来求平均值
                    "field":"age" #表示对哪一个字段进行分组
                }
            }
        },
       "size":0
    #表示不查询原始数据,只查询分组结果 }
    PS:ES进行聚合查询时,对应字段的类型只能是整形等,如果是“text”等类型是无法进行聚合分组查询的。

    五、映射关系部分

      映射关系可以理解成数据库中的表结构,那么我们来看一下怎么玩这个内容:

    #20、创建索引库,并设置映射【有梦想的肥宅】
    PUT /zh_user_new #创建索引库
    PUT /zh_user_new/_mapping
    {
        "properties": {
            "name":{
                "type": "keyword", #关键字类型,不做分词操作
                "index": true #表示此字段可以被用来查询
            },
            "sex":{
                "type": "text", #text类型,可以分词
                "index": true
            },
            "age":{
                "type": "long", #long类型,表示数值
                "index": true
            },
            "address":{
                "type": "text",
                "index": true
            },
            "reamrk":{
                "type": "text",
                "index": false #表示此字段不可以被用来查询
            }
        }
    }
  • 相关阅读:
    Codeforces Round #251 (Div. 2) A
    topcoder SRM 623 DIV2 CatAndRat
    topcoder SRM 623 DIV2 CatchTheBeatEasy
    topcoder SRM 622 DIV2 FibonacciDiv2
    topcoder SRM 622 DIV2 BoxesDiv2
    Leetcode Linked List Cycle II
    leetcode Linked List Cycle
    Leetcode Search Insert Position
    关于vim插件
    Codeforces Round #248 (Div. 2) B. Kuriyama Mirai's Stones
  • 原文地址:https://www.cnblogs.com/riches/p/15201520.html
Copyright © 2011-2022 走看看