ElasticSearch基础入门CRUD操作

PUT /blog/_doc/1
{
“id”:5,
“title”:“哈哈5”
}

#创建索引库

PUT person

#查询索引库

GET person

#删除索引库

DELETE person

#查询映射/表结构

GET person/_mapping

#添加映射/表结构,name为字符串(keyword,不会分词/text,会分词,不支持聚合,低版本也有string),age为整型

PUT person/_mapping
{
  "properties":{
    "name":{
      "type":"keyword"
    },
    "age":{
      "type":"integer"
    }
  }
}

#在索引库里面添加字段

PUT person/_mapping
{
  "properties":{
    "address":{
      "type":"text"
    }
  }
}

#查询索引库

GET person

#添加文档(插入数据),指定id

PUT person/_doc/1
{
  "name":"张三",
  "age":20,
  "address":"深圳市宝安区"
}

#根据id查询文档

GET person/_doc/1

#添加文档(插入数据),不指定id,系统会自动生成id

POST person/_doc/
{
  "name":"王五",
  "age":20,
  "address":"深圳南山区"
}

#根据id查询文档

GET person/_doc/6GhJwHUBcTOYWr01NsM4

#查询所有的文档(findAll)

GET person/_search

#根据id删除文档

DELETE person/_doc/6WhRwHUBcTOYWr018sOj

#使用 put/post+id就是修改, put+id更新
#修改文档 根据id,id存在就是修改,id不存在就是添加,且跟新后版本号会加1

PUT person/_doc/6GhJwHUBcTOYWr01NsM4
{
  "name":"王五",
  "age":20,
  "address":"北京市"
}
POST person/_doc/6GhJwHUBcTOYWr01NsM4
{
  "name":"王五",
  "age":20,
  "address":"北京市"
}

#只有post + 没有id才是添加,put不行

POST person/_doc/
{
  "name":"赵六",
  "age":20,
  "address":"北京市"
}
PUT person/_doc/
{
  "name":"田七",
  "age":20,
  "address":"北京市"
}

#有id,post/put都能添加文档

POST person/_doc/3
{
  "name":"嘎巴",
  "age":20,
  "address":"北京市"
}
PUT person/_doc/5
{
  "name":"李九",
  "age":20,
  "address":"北京市"
}

#总结,在有id的情况下post/put都能添加文档,在没有id的时候只有post才能添加文档,且post/put在id存在的情况下都是修改。

#全文查询-match查询,先分词,再查询
#keyword类型不能分词,因此发”王“单个字查询不出

GET person/_search
{
  "query": {
    "match": {
      "name": "王五"
    }
  }
}

#中文是一个字一个词,而英文是以空格分隔词语
#全文查询-term查询,不会进行分词,因此如果只查”北京“的话查询不到,以”北京市“查询也查不到,因为其类型时text,如果查询的话相当于全文检索了,只有把其换位keyword才能查询出来
#term query会去倒排索引中寻找确切的term,它并不知道分词器的存在,这种查询适合keyword、numeric、date等明确值的
#查询通常用于数字,日期和枚举等结构化数据

GET person/_search
{
  "query": {
    "term": {
      "name": {
        "value": "王五"
      }
    }
  }
}

#查询全部

GET person/_search

#关键字搜索数据,适用于keyword/text

GET person/_search?q=address:北京市

#DSL 查询
#创建索引/数据库,必须使用PUT

PUT shangguigu
POST shangguigu/_doc/1001
{
  "id":"1001",
  "name":"张三",
  "age":20,
  "sex":"男"
}
PUT  shangguigu/_doc/1002
{
	"id":"1002",
	"name":"李四",
	"age":25,
	"sex":"女"
}
PUT  shangguigu/_doc/1003
{
	"id":"1003",
	"name":"王五",
	"age":30,
	"sex":"女"
}
PUT  shangguigu/_doc/1004
{
	"id":"1004",
	"name":"赵六",
	"age":30,
	"sex":"男"
}

#查询所有

GET shangguigu/_search

#根据年龄进行查询
#match虽然能进行分词查询,但是如果查询年龄是long类型,不支持分词,因此以2查询不出来
#因为查询有请求体,因此也可以使用POST方式

POST shangguigu/_search
{
  "query":{
    "match":{
      "age":30
    }
  }
}

#查询年龄大于20岁的女性用户

GET shangguigu/_search
{
  "query": {
    "bool": {
      "filter": {
        "range": {
          "age": {
            "gte": 20,
            "lte": 30
          }
        }
      },
      "must": [
        {
          "match":{
          "sex":"女"
        }
        }
      ]
    }
  }
}

#全文搜索,只支持数据类型为text的,不支持keyword

GET shangguigu/_search
{
  "query": {
    "match": {
      "name": "张三 王五"
    }
  }
}

#高亮显示,为什么结果是呢?因为默认把一个汉字看作一个词

GET shangguigu/_search
{
  "query": {
    "match": {
      "name": "张三 李四"
    }
  },
  "highlight": {
    "fields": {
      "name": {}
    }
  }
}

#聚合为桶
#size: 查询条数,这里设置为0,因为我们不关心搜索到的数据,只关心聚合结果,提高效率
#aggs:声明这是一个聚合查询,是aggregations的缩写
#terms:划分桶的方式,这里是根据词条划分
#field:划分桶的字段
#aggregations:聚合的结果
#key:这个桶对应的age字段的值
#doc_count:这个桶中的文档数量,即age=30岁的人数

GET shangguigu/_search
{
  "aggs": {
    "myaggs": {
      "terms": {
        "field": "age",
        "size": 3
      }
    }
  }
}

#在响应的数据中,如果我们不需要全部的字段,可以指定某些需要的字段进行返回

GET shangguigu/_doc/1001?_source=id,name

#判断文档是否存在,存在返回200 - OK

HEAD shangguigu/_doc/1001

#批量操作,批量查询1001,1003
#某一条数据不存在,不影响整体响应,需要通过found的值进行判断是否查询到数据。

GET shangguigu/_mget
{
  "ids":["1001", "1006"]
}

#_bulk操作,批量查询

POST atguigu/_bulk
{"create":{"_index":"atguigu","_id":2001}}
{"id":2001,"name":"name1","age": 20,"sex": "男"}
{"create":{"_index":"atguigu","_id":2002}}
{"id":2002,"name":"name2","age": 20,"sex": "男"}
{"create":{"_index":"atguigu","_id":2003}}
{"id":2003,"name":"name3","age": 20,"sex": "男"}

#批量删除:

POST /atguigu/_bulk
{"delete":{"_index":"atguigu","_id":2001}}
{"delete":{"_index":"atguigu","_id":2002}}

#分页查询

GET shangguigu/_search?size=3
GET shangguigu/_search?size=5&from=2
GET shangguigu/_search?size=5&from=5

#terms 跟 term 有点类似,但 terms 允许指定多个匹配条件。

POST shangguigu/_search
{
  "query": {
    "terms": {
      "name": [
        "张",
        "李"
      ]
    }
  }
}

#指定范围查找一批数据

POST shangguigu/_search
{
  "query": {
    "range": {
      "age": {
        "gte": 20,
        "lt": 30
      }
    }
  }
}

#查找文档中是否包含指定字段或没有某个字段

POST shangguigu/_search
{
  "query": {
    "exists": {
      "field": "mail"
    }
  }
}

#默认是标准分词器Standard,即一个汉字一个词

POST _analyze
{
  "text": "我是程序员"
}

#Standard 标准分词,按单词切分,并且会转化成小写

POST _analyze
{
  "analyzer": "standard",
  "text": ["我是程序员", "A man becomes learned by asking questions."]
}

#IK分词器,只能分“text”类型的
#IK提供了两个分词算法ik_smart 和 ik_max_word
#其中 ik_smart 为最少切分,ik_max_word为最细粒度划分

POST _analyze
{
  "analyzer": "ik_smart", 
  "text": ["我是程序员"]
}
POST _analyze
{
  "analyzer": "ik_max_word", 
  "text": ["我是程序员"]
}
DELETE person02
PUT person02
{
  "mappings": {
    "properties": {
      "name":{
        "type": "keyword"
      },
      "address":{
        "type": "text",
        "analyzer": "ik_max_word"
      }
    }
  }
}
POST _analyze
{
  "analyzer": "ik_max_word", 
  "text": ["深圳南山"]
}

#添加文档

PUT person02/_doc/1
{
  "name":"张三",
  "age":30,
  "address": "华为5G手机"
}

#添加文档

PUT person02/_doc/2
{
  "name":"李四",
  "age":20,
  "address": "深圳宝安"
}

#添加文档

PUT person02/_doc/3
{
  "name":"张三",
  "age":29,
  "address": "深圳南山"
}

#查询所有数据

GET person/_search

#使用term查询 深圳开头的数据,仍然不能查到“深”,因为分词分成了:“深圳”, “南山”

GET person02/_search
{
  "query": {
    "term": {
      "address": {
        "value": "深"
      }
    }
  }
}

查询上面创建的索引库

GET person/_mapping
GET person/_search
GET shangguigu/_mapping
GET shangguigu/_search
GET atguigu/_search
GET atguigu/_search
{
  "query": {
    "match": {
      "age": 20
    }
  }
}
GET person02/_mapping
GET person02/_search
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值