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 #表示此字段不可以被用来查询
        }
    }
}
原文地址:https://www.cnblogs.com/riches/p/15201520.html