安装 Elasticsearch:有多种方式,以Linux版为例,进入官网下载页面,右键复制Linux版下载链接。
下载、安装、运行:
$ curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.7.0-linux-x86_64.tar.gz //下载
$ tar -xvf elasticsearch-7.7.0-linux-x86_64.tar.gz //解压
$ cd elasticsearch-7.7.0-linux-x86_64/bin //进入bin目录
$ ./elasticsearch -d //启动,-d 表示后台启动
接着可以访问localhost:9200,查看版本等相关信息(9200是Elasticsearch的默认端口)。
Elasticsearch基础命令之增删改:
GET _cat/health?v //查看集群状态
GET _cat/nodes?v //查看节点信息
GET _cat/indices?v //查看索引信息
PUT student //创建索引(注意名称不能包含大写字母,其他特殊字符另请查询)
//向student索引(类似mysql中的表)里新增数据,如果索引不存在会自动创建
//_doc为类型type【必选,固定写法】,1为id【必选,值可为字母数字等字符组合,类似mysql表中的某一条记录的唯一标识(主键)】
//此条语句也可用作更新操作,严格来说是替换,因为它更新的是整条记录
//若只想更新某个属性值如name属性,一定要把其他数据如age等全部带上:
PUT student/_doc/1
{
"name":"zsan",
"age":18
}
//第二种新增方法:使用post,它与put的唯一区别在于,post可以不用指定id值
//Elasticsearch会自动生成一个id值,当然也可以自己指定。
//另外,post是真正意义上的更新方法,下面再详细介绍
POST student/_doc/
{
"name":"lisi",
"age":34
}
//更新操作用法一,以更新索引为student、id等于1的name属性为例,语法如下:
//_update代表更新操作,"doc"代表将要更新文档内容(固定写法)
POST student/_doc/1/_update
{
"doc":{"name":"cnmb"}
}
//更新操作用法二:可以同时追加内容,如更新name的同时,追加一个sex属性进去:
POST student/_doc/1/_update
{
"doc":{"name":"jack","sex":"男"}
}
//更新操作用法三:可以进行计算操作,如将age增加5:
//这时使用script语法,表示进行脚本计算,ctx._source是固定写法,代表当前文档
POST student/_doc/1/_update
{
"script":"ctx._source.age += 5"
}
//还有更多强大、丰富的更新api语法,就不一一示例了。
//查询数据:1、如果只跟索引名,则查询的是该索引的概述信息,类似mysql的建表语句、表结构;
GET student
//2、要查询具体某一条数据就必须加上type即_doc(必选,固定写法),再加上id值
GET student/_doc/1
//接下来是删除,1、如果只跟索引名,则删除的是这个索引下的所有数据,类似于删mysql的表
DELETE student
//2、如果要删除具体某一条记录,则必须跟上_doc,再加上具体的id值,如:
DELETE student/_doc/1
//批量操作:_bulk。支持批量新增、修改、删除。且新增、修改等可以混合进一个语句。如下:
//1、批量新增,直接索引名后接_bulk,旧版可以指定类型type,新版已经废弃,新增后type即为_doc;
//必须指定id值,索引如果不存在会自动创建
POST student/_bulk
{"index":{"_id":"1"}}
{"name":"吴彦祖","age":18,"sex":"男"}
{"index":{"_id":"2"}}
{"name":"小倩","age":15,"sex":"女"}
{"index":{"_id":"3"}}
{"name":"古天乐","age":22,"sex":"男"}
//2、批量组合操作,如跟新_id值为1的name为迪丽热巴,并删除_id值等于2的这条记录
POST student/_bulk
{"update":{"_id":1}}
{"doc":{"name":"迪丽热巴"}}
{"delete":{"_id":2}}
接下来是Elasticsearch的重磅戏:查
这里演示以Elasticsearch官方练手数据为例(银行客户信息):accounts.json。我放在了百度网盘,下载地址:
链接:https://pan.baidu.com/s/1KX7ztlQRcZPhmBUOfXo_dA
提取码:32gb
然后导入:
$ curl -H "Content-Type: application/json" -XPOST "localhost:9200/bank/_doc/_bulk?pretty&refresh" --data-binary "@accounts.json"
查询语法介绍:
//查询使用的是_search接口。使用query关键字定义查询语句,match_all代表查
//询所有,包括索引信息及具体文档信息等,但elasticsearch默认只返回10个文档数据
GET bank/_search
{
"query": {"match_all": {}}
}
//可以通过size参数指定返回数据大小:如指定返回25条数据
GET bank/_search
{
"query": {"match_all": {}},
"size":25
}
//再加上from参数可以实现分页效果:以下表示每页25条数据,返回第3页的数据
GET bank/_search
{
"query": {"match_all": {}},
"size":25,
"from":3
}
//再加上sort参数可以进行排序搜索,以下表示按age属性升序返回
GET bank/_search
{
"query": {"match_all": {}},
"size":25,
"from":3,
"sort":{"age":{"order":"asc"}}
}
//再加上_source参数可以返回指定字段,类似于mysql的将select *改为select具体的字段
GET bank/_search
{
"query": {"match_all": {}},
"size":10,
"from":3,
"sort":{"age":{"order":"asc"}},
"_source": ["email","firstname","age"]
}
//接下来,介绍match语法,它用于条件查询,相当于mysql中的where。也支持与或非,默认不区分大小写
//例如,查询地址包含mill的用户
GET bank/_search
{
"query": {"match": {"address": "mill"}}
}
//可以多个值以空格隔开,表示布尔查询中的或者,如查询地址包含mill或Street的用户
GET bank/_search
{
"query": {"match": {"address": "mill Street"}}
}
//如果想要将mill street作为一个整体进行查询,就要改用match_phrase,语法如下,表示查询地址包含Mill street的用户
GET bank/_search
{
"query": {
"match_phrase": {
"address": "Mill street"
}
}
}
//布尔查询————must(与),表示必须都满足,如查询地址必须同时包含mill与street的用户:
GET bank/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"address": "mill"
}
},
{
"match": {
"address": "street"
}
}
]
}
}
}
//布尔查询————should(或),表示满足其中之一的条件即可,如查询地址包含mill或age等于38的用户:
GET bank/_search
{
"query": {
"bool": {
"should": [
{
"match": {
"address": "mill"
}
},
{
"match": {
"age": 38
}
}
]
}
}
}
//布尔查询————must_not(非),如查询地址包含mill并且age不等于38的用户:
GET bank/_search
{
"query": {
"bool": {
"must_not": [
{
"match": {
"address": "mill"
}
},
{
"match": {
"age": 38
}
}
]
}
}
}
//还可以使用多个布尔条件组合查询,如查询地址必须包含mill且age不等于38的用户:
GET bank/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"address": "mill"
}
}
],
"must_not": [
{
"match": {
"age": "38"
}
}
]
}
}
}
//接下来介绍————filter(过滤),比如进行范围查找,使用range查询age大于等于30小于等于40,
//并且地址包含mill的用户:
GET bank/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"address": "mill"
}
}
],
"filter": {
"range": {
"age": {
"gte": 30,
"lte": 40
}
}
}
}
}
}
//然后是聚合查询,使用aggs关键字,如下面查询所有用户中age最大的值,size=5表示只展示5条记录(一共1000条数据),
//cnmb是自己为这个聚合起的名字,可以随意。
GET bank/_search
{
"size": 5,
"aggs": {
"cnmb": {
"max": {
"field": "age"
}
}
}
}
//比如统计每个age相同的用户有多少人,使用terms关键字:
GET bank/_search
{
"size": 10,
"aggs": {
"cnmb": {
"terms": {
"field": "age"
}
}
}
}
//进阶————查询每个年龄age中所有用户的账户余额平均值,使用aggs嵌套:
GET bank/_search
{
"size": 10,
"aggs": {
"cnmb": {
"terms": {
"field": "age"
},"aggs": {
"avg_balance": {
"avg": {
"field": "balance"
}
}
}
}
}
}