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