Elasticsearch存储、搜索引擎入门

安装 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"
          }
        }
      }
    }
  }
}

有空再更....

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值