一、前言

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

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

基于JSON的DSL来定义查询。

二、索引部分

索引创建

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

PS:PUT请求具有幂等性,如果重复执行同样的语句创建索引库会报错
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

索引查询

查看所有索引
#2、查询所有索引【有梦想的肥宅】
GET /_cat/indices?v
  • 1.
  • 2.
查看单个索引
#3、查询单个索引【有梦想的肥宅】
GET /zh_user
  • 1.
  • 2.

索引删除

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

三、文档部分

创建文档

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

PS:创建文档要用POST,如果没有指定id的话,es会自动生成,指定了就用我们指定的id
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

查询文档

主键查询
#6、根据主键查询文档(数据)【有梦想的肥宅】
GET /zh_user/_doc/1
  • 1.
  • 2.
全查询
#7、全量查询索引下文档(数据)【有梦想的肥宅】
GET /zh_user/_search
  • 1.
  • 2.

修改文档

全量修改
#8、全量修改文档【格式:PUT /索引名称/类型(7.6.1版本默认是_doc)/id】
PUT /zh_user/_doc/1/
{
    "name": "有梦想的肥宅【更新】",
    "sex": "男",
    "age": 27,
    "address": "广西南宁",
    "remark": "有趣又上进的灵魂~"
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
局部修改
#9、局部修改文档【格式:PUT /索引名称/类型(7.6.1版本默认是_doc)/id】
POST /zh_user/_update/1/
{
  "doc":{    
      "name": "有梦想的肥宅【更新】",
      "sex": "男【更新】",
      "address": "广西南宁【更新】"
  }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
删除
#10、删除索引库内的文档(数据)【有梦想的肥宅】
DELETE /zh_user/_doc/1
  • 1.
  • 2.

四、查询操作部分

条件查询

#11、条件查询【有梦想的肥宅】
GET /zh_user/_search
{
    "query":{
        "match":{
            "sex":"男"
        }
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

分页查询

#12、分页查询【有梦想的肥宅】
GET /zh_user/_search
{
    "query":{
        "match":{
            "sex":"男"
        }
    },
    "from":0,
    "size":2
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

排序查询

#13、排序查询【有梦想的肥宅】
GET /zh_user/_search
{
    "query":{
        "match_all":{} #表示查询全部数据
    },
    "sort":{
        "age":{
            "order":"desc"
        }
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

多条件查询

#14、多条件查询【有梦想的肥宅】
GET /zh_user/_search
{
    "query":{
        "bool":{ #表示需要进行条件过滤
            "must":[{ #表示必须满足下面的条件,并且参与计算分值,常用的子句还有should,表示“或”的意思
                "match":{
                    "address":"广西南宁"
                }
            },{
                "match":{
                    "sex":"男"
                }
            }]
        }
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.

范围查询

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

查询分词结果

#16、查询分词结果【有梦想的肥宅】
GET /zh_user/_doc/1/_termvectors?fields=address

PS:这条语句的意思是,查询索引库zh_user下id为1的,字段为address的数据分词的结果
  • 1.
  • 2.
  • 3.
  • 4.

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

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

完全匹配

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

PS:match:分词后搜索。比如分词后有N个分词,只要匹配上其中一个就可以返回数据了。
GET /zh_user/_search
{
    "query":{
        "match":{
            "name" : "梦想哈"
        }
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

ElasticSearch(三)常用DSL语句解析_字段

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

 

ElasticSearch(三)常用DSL语句解析_数据_02

ElasticSearch(三)常用DSL语句解析_字段_03

高亮查询

#18、高亮查询【有梦想的肥宅】
GET /zh_user/_search
{
    "query": {
        "match_phrase": {
            "name": "有梦想"
        }
    },
    "highlight": {
        "fields": {
            "name": {} #表示对当前字段进行高亮处理
        }
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.

ElasticSearch(三)常用DSL语句解析_数据_04

聚合/分组查询

#19、聚合查询【有梦想的肥宅】
GET /zh_user/_search
{
    "aggs":{ #表示聚合操作
        "age_group":{ #分组名称,可以随便起
            "terms":{ #表示分组操作,也可以使用avg来求平均值
                "field":"age" #表示对哪一个字段进行分组
            }
        }
    },
   "size":0 #表示不查询原始数据,只查询分组结果
}

PS:ES进行聚合查询时,对应字段的类型只能是整形等,如果是“text”等类型是无法进行聚合分组查询的。
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.

ElasticSearch(三)常用DSL语句解析_字段_05

五、映射关系部分

数据库中的表结构,那么我们来看一下怎么玩这个内容:

#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 #表示此字段不可以被用来查询
        }
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.