ES基本操作

93 阅读7分钟
POST _analyze
{
"analyzer":"standard",
"text":"中华人民共和国"
}

#ik_smart:会做最粗粒度的拆
POST _analyze
{
"analyzer": "ik_smart",
"text": "中华人民共和国"
}

#ik_max_word:会将文本做最细粒度的拆分
POST _analyze
{
"analyzer":"ik_max_word",
"text":"中华人民共和国"
}




#创建索引时可以指定IK分词器作为默认分词器
PUT /es_db
{
"settings" : {
"index" : {
"analysis.analyzer.default.type": "ik_max_word"
    }
  }
}



#创建索引
PUT /es_db

#创建索引时可以设置分片数和副本数
PUT /es_db
{
"settings" : {
"number_of_shards" : 3,
"number_of_replicas" : 2
  }
}

#修改索引配置
PUT /es_db/_settings
{
"index" : {
"number_of_replicas" : 1
  }
}

#查询索引
GET /es_db

#es_db是否存在
HEAD /es_db

#删除索引
DELETE /es_db



#并发场景下修改文档
POST /es_db/_doc/2?if_seq_no=21&if_primary_term=6
{
"name": "李四xxx"
}



#插入文档实例数据
PUT /es_db 
{
"settings" : {
"index" : {
"analysis.analyzer.default.type": "ik_max_word"
    }
  }
}
PUT /es_db/_doc/1
{
"name": "张三",
"sex": 1,
"age": 25,
"address": "广州天河公园",
"remark": "java developer"
}
PUT /es_db/_doc/2
{
"name": "李四",
"sex": 1,
"age": 28,
"address": "广州荔湾大厦",
"remark": "java assistant"
}
PUT /es_db/_doc/3
{
"name": "王五",
"sex": 0,
"age": 26,
"address": "广州白云山公园",
"remark": "php developer"
}
PUT /es_db/_doc/4
{
"name": "赵六",
"sex": 0,
"age": 22,
"address": "长沙橘子洲",
"remark": "python assistant"
}
PUT /es_db/_doc/5
{
"name": "张龙",
"sex": 0,
"age": 19,
"address": "长沙麓谷企业广场",
"remark": "java architect assistant"
}
PUT /es_db/_doc/6
{
"name": "赵虎",
"sex": 1,
"age": 32,
"address": "长沙麓谷兴工国际产业园",
"remark": "java architect"
}


#注意:POSTPUT都能起到创建/更新的作用,PUT需要对一个具体的资源进行操作也就是要确定id才能
#进行更新/创建,而POST是可以针对整个资源集合进行操作的,如果不写id就由ES生成一个唯一id进行
#创建新文档,如果填了id那就针对这个id的文档进行创建/更新

# 创建文档,指定id
# 如果id不存在,创建新的文档,否则先删除现有文档,再创建新的文档,版本会增加
PUT /es_db/_doc/1
{
"name": "张三",
"sex": 1,
"age": 25,
"address": "广州天河公园",
"remark": "java developer"
}
#创建文档,ES生成id
POST /es_db/_doc
{
"name": "张三",
"sex": 1,
"age": 25,
"address": "广州天河公园",
"remark": "java developer"
}

#Create -如果ID已经存在,会失败
PUT /es_db/_create/1
{
"name": "张三",
"sex": 1,
"age": 25,
"address": "广州天河公园",
"remark": "java developer"
}



#修改文档
#全量更新,整个json都会替换,格式: [PUT | POST] /索引名称/_doc/id
#如果文档存在,现有文档会被删除,新的文档会被索引

# 全量更新,替换整个json
PUT /es_db/_doc/1
{
"name": "张三",
"sex": 1,
"age": 25
}

#查询文档
GET /es_db/_doc/1

#使用update部分更新,格式: POST /索引名称/update/id
#update不会删除原来的文档,而是实现真正的数据更新

# 部分更新:在原有文档上更新
# Update -文档必须已经存在,更新只会对相应字段做增量修改
POST /es_db/_update/1
{
"doc": {
"age": 28
  }
}
#查询文档
GET /es_db/_doc/1

#过滤更新
#使用 _update_by_query 更新文档
POST /es_db/_update_by_query
{
"query": {
"match": {
"_id": 1
  }
  },
"script": {
"source": "ctx._source.age = 20"
  }
}
#查询文档
GET /es_db/_doc/1

#更新符合条件的文档
POST /es_db/_update_by_query
{
  "query": {
    "match": {
      "_id": 1
    }
  },
  "script": {
    "source": "ctx._source.age = 30"
  }
}
#查询文档
GET /es_db/_doc/1

#查询文档,精确查找不进行分词
GET /es_db/_doc/_search
{
  "query": {
    "term": {
      "address": {
        "value": "天河公园"
      }
    }
  }
}

#查询文档,进行分词查找
GET /es_db/_doc/_search
{
  "query": {
    "match": {
      "address": "天河公园"
    }
  }
}
#查看分词
GET _analyze
{
  "analyzer": "ik_max_word", 
  "text": "天河公园"
}

#查询文档
#根据id查询文档,格式: GET /索引名称/_doc/id
GET /es_db/_doc/1

#条件查询 search,格式: /索引名称/doc/_search
# 查询前10条文档
GET /es_db/_doc/_search

#ES Search API提供了两种条件查询搜索方式:
#REST风格的请求URI,直接将参数带过去
#封装到request body中,这种方式可以定义更加易读的JSON格式

#条件查询, 如要查询age等于28岁的 _search?q=*:***
GET /es_db/_doc/_search?q=age:28

#范围查询, 如要查询age在2526岁之间的 _search?q=***[** TO **] 注意: TO 必须为大写
GET /es_db/_doc/_search?q=age[25 TO 26]

#查询年龄小于等于28岁的 :<=
GET /es_db/_doc/_search?q=age:<=28

#查询年龄大于28前的 :>
GET /es_db/_doc/_search?q=age:>28

#分页查询 from=*&size=*
GET /es_db/_doc/_search?q=age[25 TO 26]&from=0&size=1

#对查询结果只输出某些字段 _source=字段,字段
GET /es_db/_doc/_search?_source=name,age

#对查询结果排序 sort=字段:desc/asc
GET /es_db/_doc/_search?sort=age:desc


#条件查询, 如要查询age等于28岁的
GET /es_db/_doc/_search
{
  "query": {
    "match": {
      "age": 28  
    }
  }
}

#范围查询, 如要查询age在2526岁之间的
GET /es_db/_doc/_search
{
  "query": {
    "range": {
      "age": {
        "gte": 25,
        "lte": 26 
      }
    }
  }
}

#查询年龄小于等于28岁的
GET /es_db/_doc/_search
{
  "query": {
    "range": {
      "age": {
        "lte": 28
      }
    }
  }
}

#查询年龄大于28前的
GET /es_db/_doc/_search
{
  "query": {
    "range": {
      "age": {
        "gt": 28
      }
    }
  }
}

#分页查
GET /es_db/_doc/_search
{
  "from": 0, 
  "size": 1,
  "query": {
    "range": {
      "age": {
        "gte": 25,
        "lte": 26
      }
    }
  }
}

#对查询结果只输出某些字段
GET /es_db/_doc/_search
{
  "_source": ["name", "age"] 
}

#对查询结果排序
GET /es_db/_doc/_search
{
  "sort": {
    "age": {
      "order": "desc"
    }
  }
}


#删除文档
#格式: DELETE /索引名称/_doc/id
DELETE /es_db/_doc/1



#批量写入
#批量对文档进行写操作是通过_bulk的API来实现的
#请求方式:POST
#请求地址:_bulk
#请求参数:通过_bulk操作文档,一般至少有两行参数(或偶数行参数)
#第一行参数为指定操作的类型及操作的对象(index,type和id)
#第二行参数才是操作的数据
#参数类似于:
#{"actionName":{"_index":"indexName", "_type":"typeName","_id":"id"}}
#{"field1":"value1", "field2":"value2"}
#{"actionName":{"_index":"indexName", "_type":"typeName","_id":"id"}}
#actionName:表示操作类型,主要有create,index,delete和update
#{"field1":"value1", "field2":"value2"}

#创建article索引
PUT /article
DELETE /article
#批量创建文档create
#以存在的文档会产生冲突
POST _bulk
{"create":{"_index":"article", "_type":"_doc", "_id":3}}
{"id":3,"title":"fox老师","content":"fox老师666","tags":["java", "面向对象"],"create_time":1554015482530}
{"create":{"_index":"article", "_type":"_doc", "_id":4}}
{"id":4,"title":"mark老师","content":"mark老师NB","tags":["java", "面向对象"],"create_time":1554015482530}
GET /article/_search

#普通创建或全量替换index
#如果原文档不存在,则是创建
#如果原文档存在,则是替换(全量修改原文档)
POST _bulk
{"index":{"_index":"article", "_type":"_doc", "_id":3}}
{"id":3,"title":"图灵徐庶老师","content":"图灵学院徐庶老师666","tags":["java", "面向对象"],"create_time":1554015482530}
{"index":{"_index":"article", "_type":"_doc", "_id":4}}
{"id":4,"title":"图灵诸葛老师","content":"图灵学院诸葛老师NB","tags":["java", "面向对象"],"create_time":1554015482530}
GET /article/_search

#批量删除delete
POST _bulk
{"delete":{"_index":"article", "_type":"_doc", "_id":3}}
{"delete":{"_index":"article", "_type":"_doc", "_id":4}}

#批量修改update
POST _bulk
{"update":{"_index":"article", "_type":"_doc", "_id":3}}
{"doc":{"title":"ES大法必修内功"}}
{"update":{"_index":"article", "_type":"_doc", "_id":4}}
{"doc":{"create_time":1554018421008}}
GET /article/_search

#组合应用
POST _bulk
{"delete":{"_index":"article", "_type":"_doc", "_id":3}}
{"create":{"_index":"article", "_type":"_doc", "_id":3}}
{"title":"fox老师","content":"fox老师666","tags":["java", "面向对象"],"create_time":1554015482530}
{"update":{"_index":"article", "_type":"_doc", "_id":4}}
{"doc":{"create_time":1554018421008}}
GET /article/_search




#批量读取
#es的批量查询可以使用mget和msearch两种。其中mget是需要我们知道它的id,可以指定不同的
#index,也可以指定返回值source。msearch可以通过字段查询来进行一个批量的查找

#_mget
#可以通过ID批量获取不同index和type的数据
GET _mget
{
"docs": [
  {
"_index": "es_db",
"_id": 1
  },
  {
"_index": "article",
"_id": 4
    }
  ]
}

#可以通过ID批量获取es_db的数据
GET /es_db/_mget
{
"docs": [
   {
"_id": 1
  },
  {
"_id": 4
  }
  ]
}

#简化后
GET /es_db/_mget
{
"ids":["1","2"]
}

#可以通过id批量获取不同index和type的数据
GET _mget
{
  "docs": [
    {
      "_index": "es_db",
      "_type": "_doc",
      "_id": 1
    },
    {
      "_index": "article",
      "_type": "_doc",
      "_id": 4
    }
    ]
}

#在_msearch中,请求格式和bulk类似。查询一条数据需要两个对象,第一个设置index和type,第二个
#设置查询语句。查询语句和search相同。如果只是查询一个index,我们可以在url中带上index,这样,
#如果查该index可以直接用空对象表示。

GET /es_db/_msearch
{}
{"query" : {"match_all" : {}}, "from" : 0, "size" : 2}
{"index" : "article"}
{"query" : {"match_all" : {}}}

GET /_msearch
{"index": "es_db"}
{"query" : {"match_all" : {}}, "from" : 0, "size" : 2}
{"index" : "article"}
{"query" : {"match_all" : {}}}

GET /_msearch
{"index" : "article"}
{"query" : {"match" : {"title": "fox"}}}