一、cluster
es提供了一套api,叫cat api, 可以查看es中各种各样的数据
1、查看cluster集群的健康状况:get /_cat/healt?v
二、index---CRUD
1、查看cluster中有哪些index:get /_cat/indices?v
2、创建index:put /test_index?pretty
3、删除索引:delete /test_index?pretty
4、创建index,指定primary shard和replica shard的个数
PUT /test_index
{
"settings" : {
"number_of_shards" : 3,
"number_of_replicas" : 1
}
}
三、document---CRUD
1、新增document--->PUT
PUT /index/type/id--->/索引名/类型名/doucument_Id/{document内容}
{
"json数据"
}
es自动生成id(如:AVp4RN0bhjxldOOnBxaE)
POST /index/type
{
"json数据"
}
注:es会自动建立index和type,不需要提前创建,而且es默认会对document每个field都建立倒排索引,让其可以被搜索
2、查询document:检索document--->GET
GET /index/type/id
查询_source中指定的field:GET /index/type/id?_source=field1,field2
批量查询:_mget
GET /_mget
{
"docs" : [
{
"_index" : "test_index",
"_type" : "test_type",
"_id" : 1
},
{
"_index" : "test_index",
"_type" : "test_type",
"_id" : 2
}
]
}
3、替换document--->PUT
PUT /index/type/id--->/索引名/类型名/doucument_Id/{document内容}
{
"json数据"
}
利用version进行并发控制:
内部version:PUT /index/type/id?version=n
外部version:PUT /index/type/id?version=n&version_type=external
注:替换方式有一个不好,即使必须带上所有的field,否则field就会丢失。此方式version会加1
4、更新document--->POST
POST /index/type/document_id/_update
{
"doc": {
"name": "jiaqiangban gaolujie yagao"
}
}
遇到并发冲突时,重试:post /index/type/id/_update?retry_on_conflict=5
注:此方式version不变
5、删除document--->DELETE
DELETE /index/type/id
6、基于groovy操作document
(1)、内置脚本:
POST /test_index/test_type/11/_update
{
"script" : "ctx._source.num+=1"
}
(2)、外部脚本
a、在 E:\ES\elasticsearch-5.2.0\config\scripts 添加a.groovy文件。文件内容:ctx._source.tags+=new_tag
b、kibana操作脚本
POST /test_index/test_type/11/_update
{
"script": {
"lang": "groovy", ----------------->脚本语言
"file": "a",-------------------------->文件名
"params": {
"new_tag": "tag1"---------------->参数
}
}
}
(3)、用脚本删除文档
a、脚本内容:ctx.op = ctx._source.num == count ? 'delete' : 'none'
b、kibana操作脚本
POST /test_index/test_type/11/_update
{
"script": {
"lang": "groovy",
"file": "test-delete-document",
"params": {
"count": 1
}
}
}
(4)upsert操作
a、如果指定的document不存在,就执行upsert中的初始化操作;如果指定的document存在,就执行doc或者script指定的partial update操作
b、kibana操作
POST /test_index/test_type/11/_update
{
"script" : "ctx._source.num+=1",
"upsert": {
"num": 0,
"tags": []
}
}
6、bulk语法:批量增删改
(1)、例如
POST /_bulk
{ "delete": { "_index": "test_index", "_type": "test_type", "_id": "3" }}
{ "create": { "_index": "test_index", "_type": "test_type", "_id": "12" }}
{ "test_field": "test12" }
{ "index": { "_index": "test_index", "_type": "test_type", "_id": "2" }}
{ "test_field": "replaced test2" }
{ "update": { "_index": "test_index", "_type": "test_type", "_id": "1", "_retry_on_conflict" : 3} }
{ "doc" : {"test_field2" : "bulk test1"} }
(2)、操作类型
a、delete:删除一个文档,只要1个json串就可以了
b、create:PUT /index/type/id/_create,强制创建
c、index:普通的put操作,可以是创建文档,也可以是全量替换文档
d、update:执行的partial update操作
(3)说明
a、bulk api对json的语法,有严格的要求,每个json串不能换行,只能放一行,同时一个json串和一个json串之间,必须有一个换行
b、bulk操作中,任意一个操作失败,是不会影响其他的操作的,但是在返回结果里,会告诉你异常日志
四、六种查询方法
0、名词解析
查询所有document:get /index/type/_search
took:耗费了几毫秒
timed_out:是否超时,这里是没有
_shards:数据拆成了5个分片,所以对于搜索请求,会打到所有的primary shard(或者是它的某个replica shard也可以)
hits.total:查询结果的数量,3个document
hits.max_score:score的含义,就是document对于一个search的相关度的匹配分数,越相关,就越匹配,分数也高
hits.hits:包含了匹配搜索的document的详细数据
前提
PUT /ecommerce/product/1
{
"name" : "gaolujie yagao",
"desc" : "gaoxiao meibai",
"price" : 30,
"producer" : "gaolujie producer",
"tags": [ "meibai", "fangzhu" ]
}
PUT /ecommerce/product/2
{
"name" : "jiajieshi yagao",
"desc" : "youxiao fangzhu",
"price" : 25,
"producer" : "jiajieshi producer",
"tags": [ "fangzhu" ]
}
PUT /ecommerce/product/3
{
"name" : "zhonghua yagao",
"desc" : "caoben zhiwu",
"price" : 40,
"producer" : "zhonghua producer",
"tags": [ "qingxin" ]
}
PUT /ecommerce/product/4
{
"name" : "special yagao",
"desc" : "special meibai",
"price" : 50,
"producer" : "special yagao producer",
"tags": [ "meibai" ]
}
1、query string search
a、由来:因为search参数都是以http请求的query string来附带的
b、例:GET /ecommerce/product/_search?q=name:yagao&sort=price:desc
2、query DSL
DSL:Domain Specified Language,特定领域的语言
http request body:请求体,可以用json的格式来构建查询语法
a、查询所有的商品
GET /ecommerce/product/_search
{
"query": { "match_all": {} }
}
b、查询名称包含yagao的商品,同时按照价格降序排序--->sort
GET /ecommerce/product/_search
{
"query" : {
"match" : {
"name" : "yagao"
}
},
"sort": [
{ "price": "desc" }
]
}
c、分页查询商品,总共3条商品,假设每页就显示1条商品,现在显示第2页,所以就查出来第2个商品--->from、size
GET /ecommerce/product/_search
{
"query": { "match_all": {} },
"from": 1,
"size": 1
}
d、指定要查询出来商品的名称和价格--->_source
GET /ecommerce/product/_search
{
"query": { "match_all": {} },
"_source": ["name", "price"]
}
3、query filter--->filter
a、搜索商品名称包含yagao,而且售价大于25元的商品
GET /ecommerce/product/_search
{
"query" : {
"bool" : {
"must" : {
"match" : {
"name" : "yagao"
}
},
"filter" : {
"range" : {
"price" : { "gt" : 25 }
}
}
}
}
}
注:bool中包含多个查询条件
4、full-text search(全文检索)--->match
GET /ecommerce/product/_search
{
"query" : {
"match" : {
"producer" : "yagao producer"
}
}
}
注:producer这个字段,会先被拆解,建立倒排索引。。。查询条件:yagao producer ---> yagao和producer
special 4
yagao 4
producer 1,2,3,4
gaolujie 1
zhognhua 3
jiajieshi 2
5、phrase search(短语搜索)--->match_phrase
GET /ecommerce/product/_search
{
"query" : {
"match_phrase" : {
"producer" : "yagao producer"
}
}
}
注:跟全文检索相对应,相反,全文检索会将输入的搜索串拆解开来,去倒排索引里面去一一匹配,只要能匹配上任意一个拆解后的单词,就可以作为结果返回
phrase search,要求输入的搜索串,必须在指定的字段文本中,完全包含一模一样的,才可以算匹配,才能作为结果返回
6、highlight search(高亮搜索结果)--->highlight
GET /ecommerce/product/_search
{
"query" : {
"match" : {
"producer" : "producer"
}
},
"highlight": {
"fields" : {
"producer" : {}
}
}
}
五、聚合查询
terms:按照field名称分组
range:按照value的范围分组
avg:分组后求平均数
1、计算每个tag下的商品数量
将文本field的fielddata属性设置为true
PUT /ecommerce/_mapping/product
{
"properties": {
"tags": {
"type": "text",
"fielddata": true
}
}
}
GET /ecommerce/product/_search
{
"size": 0,
"aggs": {
"all_tags": {
"terms": { "field": "tags" }
}
}
}
2、对名称中包含yagao的商品,计算每个tag下的商品数量
GET /ecommerce/product/_search
{
"size": 0,
"query": {
"match": {
"name": "yagao"
}
},
"aggs": {
"all_tags": {
"terms": {
"field": "tags"
}
}
}
}
3、计算每个tag下的商品的平均价格,并且按照平均价格降序排序
GET /ecommerce/product/_search
{
"size": 0,
"aggs" : {
"all_tags" : {
"terms" : { "field" : "tags", "order": { "avg_price": "desc" } },
"aggs" : {
"avg_price" : {
"avg" : { "field" : "price" }
}
}
}
}
}
4、按照指定的价格范围区间进行分组,然后在每组内再按照tag进行分组,最后再计算每组的平均价格
GET /ecommerce/product/_search
{
"size": 0,
"aggs": {
"group_by_price": {
"range": {
"field": "price",
"ranges": [
{
"from": 0,
"to": 20
},
{
"from": 20,
"to": 40
},
{
"from": 40,
"to": 50
}
]
},
"aggs": {
"group_by_tags": {
"terms": {
"field": "tags"
},
"aggs": {
"average_price": {
"avg": {
"field": "price"
}
}
}
}
}
}
}
}