欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

elasticsearch7 基本语法

程序员文章站 2022-07-05 13:23:01
...

注意:
megacorp:是index
employee:是type
使用es版本是7.1.1
在postman下进行的模拟

参考:elasticsearch权威指南

通过id进行查询

megacorp/employee/1?_source=last_name,age

_id=1 且只显示last_name,age字段

全文搜索

既能匹配出完整完整的rock climbing,又能匹配出带有rock 或climbing 词的

GET /megacorp/employee/_search
{
    "query" : {
        "match" : {
            "about" : "rock climbing"
        }
    }
}

短语搜索

想要确切的匹配若干个单词或者短语(phrases),match_phrase查询即可

GET /megacorp/employee/_search
{
    "query" : {
        "match_phrase" : {
            "about" : "rock climbing"
        }
    }
}

多条件搜索

filter是区间过滤器(range filter),下面匹配的是:姓氏为“Smith”的员工,且年龄大于30岁的员工

megacorp/employee/_search
    {
        "query" : {
            "bool" : {
                "filter" : {
                    "range" : {
                        "age" : { "gt" : 30 } 
                    }
                },
                "must" : {
                    "match" : {
                        "last_name" : "smith" 
                    }
                }
            }
        }
    }

聚合搜索

类似于group by,下面会把interests的进行group by,获得不同兴趣的数量

{
    "aggs": {
    "all_interests": {
      "terms": { "field": "interests.keyword" }
    }
  }
}

获得不同兴趣的平均年龄(进行两次分级汇总)

{
  "aggs": {
    "all_interests": {
      "terms": { 
      	"field": "interests.keyword" 
      },
      "aggs":{
      	"avg_age":{
      		"avg":{
      			"field":"age"
      		}
      	}
      }
    }
  }
}

新增数据

如果_id=123已经存在,则会覆盖老的,注意这里的覆盖是新的完全替代了老的值,不会仅仅替代新*同的字段,
返回值result的val也会不一样

megacorp/employee/123
{
    "first_name" :  "z",
    "last_name" :   "yk",
    "age" :         18,
    "about":        "I like to study",
    "interests":  [ "music" ]
}

返回值:

{
    "_index": "megacorp",
    "_type": "employee",
    "_id": "123",
    "_version": 1,//操作的次数,每操作一次这个数据就+1
    "result": "created",//因为是之前没有的数据所以是created,如果再请求一次会变成updated
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 3,
    "_primary_term": 1
}

防重复新增数据

website/blog/1/_create
{
  "title": "My first blog entry",
  "text":  "Just trying this out..."
}

局部更新

相同字段会覆盖,没有的字段会新增

website/blog/1/_update
// doc是固定语法,doc的值是要更新的内容
{
   "doc" : {
      "tags" : [ "testing" ],
      "views": 0
   }
}

查询结果
website/blog/1
{
    "_index": "website",
    "_type": "blog",
    "_id": "1",
    "_version": 6,
    "_seq_no": 7,
    "_primary_term": 1,
    "found": true,
    "_source": {
        "title": "My first external blog entry",
        "text": "Starting to get the hang of this...",
        //新增的值
        "views": 0,
        "tags": [
            "testing"
        ]
    }
}

使用脚本更新

    对某个字段值进行数学运算
        /website/blog/1/_update
        {
           "script" : "ctx._source.views+=1" //views+1
        }
查询返回结果views这个字段会比之前多1

往数组里加字符串

 website/blog/2/_update
 {
	"script":{
		 "source" : "ctx._source.tags.add (params.new_tag)", // params.new_tag是取参数值的意思
		  "params" : {
		      "new_tag" : "search"
		   }
	}
}

查询更新之后的结果(部分)

{
    "_source": {
        "title": "My first external blog entry",
        "text": "Starting to get the hang of this...",
        "views": 1,
        "tags": [
            "testing",
            "search"  //这个是新添加的值
        ]
    }
}

添加到字符串

website/blog/2/_update
    {
    	"script":{
    		 "source" : "ctx._source.title += (params.new_tag)",
    		  "params" : {
    		      "new_tag" : "search"
    		   }
    	}
    }
返回结果

 {
    "_source": {
        "title": "My first external blog entrysearch", // 这个search是新添加的
        "text": "Starting to get the hang of this...",
        "views": 1,
    }
}

根据条件更新

 website/blog/2/_update
     {
        	"script":{
        		 "source" : "ctx.op = ctx._source.views == params.count ? 'delete':'none'", //如果views=count的值则删除
        		  "params" : {
        		      "count" : 0
        		   }
        	}
        }
    
成功的时候返回successful的数量>=1
{
    "_index": "website",
    "_type": "blog",
    "_id": "2",
    "_version": 4,
    "result": "deleted",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 12,
    "_primary_term": 1
}

更新可能不存在的数据

website/blog/2/_update
{
   "script" : "ctx._source.views+=1",
   "upsert": {
       "views": 1  //不存在的时候的初始值
   }
}

批量搜索

一次查询多条数据
POST  /_mget
{
   "docs" : [
      {
         "_index" : "website",// 要搜索的index
         "_type" :  "blog", //要搜索的type
         "_id" :    2 //要搜索的id
      },
      {
         "_index" : "website",
         "_type" :  "blog",
         "_id" :    1,
         "_source": "views" // 具体要展示的数据
      }
   ]
}

在url里指定index和type,多个id可以用ids
POST  website/blog/_mget
{
   "ids" : [ "2", "1" ]
}