【主程之路】ElasticSearch系列01-安装及基本概念、操作入门

348 阅读5分钟

前言

本系列主要是记录ElasticSearch7.x(后面简称ES)的学习过程,整个学习过程尽量覆盖ES大多数知识点。

安装

本文主要是介绍Elasticsearch开发相关技术,所以只介绍用Docker部署这一种方式,简单便捷,对机器无污染。一般企业生产使用的话都会使用各种云服务,基本无需自行从零部署。

  1. 安装Elasticsearch
docker network create elastic
docker pull docker.elastic.co/elasticsearch/elasticsearch:7.13.1
docker run -d --name es01-test --net elastic -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.13.1
  1. 安装可视化工具Kibana
docker pull docker.elastic.co/kibana/kibana:7.13.1
docker run -d --name kib01-test --net elastic -p 5601:5601 -e "ELASTICSEARCH_HOSTS=http://es01-test:9200" docker.elastic.co/kibana/kibana:7.13.1

安装ES完毕之后,首先验证下是否安装成功。

使用curl工具在命令性进行验证

curl -X GET localhost:9200/

控制台返回以下类似信息即代表安装成功

{
  "name" : "5076a4eb3bce",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "sLVGvsBkQ52vwbOFfkWSFw",
  "version" : {
    "number" : "7.13.1",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "9a7758028e4ea59bcab41c12004603c5a7dd84a9",
    "build_date" : "2021-05-28T17:40:59.346932922Z",
    "build_snapshot" : false,
    "lucene_version" : "8.8.2",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

接下来在浏览器访问,成功进入kibana界面即可。可以使用Dev tools进行和ES的调用交互

http://localhost:5601/

image-20210615134804856.png

到这里,es和kibana已经基本安装完毕。

基本概念

Node与Cluster

ES是一个分布式数据库,允许多服务协同工具,每台服务器可以有多个es实例

一个实例成为一个节点(Node),多个节点构成一个集群(Cluster)

Index

ES数据管理的最顶层单位就作Index(索引),相当于Mysql的"数据库"。每个Index的名字必须是小写

下面的命令可以查看当前节点的所有Index

curl -X GET 'localhost:9200/_cat/indices?v'

Document

Index里面单条记录称为Document(文档)。多条Document构成一个Index

Document使用JSON格式表,例子。

{
  "user": "Javis",
  "title": "架构师",
  "desc": "基础架构部管理"
}

Type(7.x已彻底移除)

Type在7.x已彻底移除,由于在最初的时候,ES把Index类比成SQL中的“库”,而Type类比成“表”。

这其实是一个错误的假设,在SQL中,表是相互独立的,一个表中的列与另一个表中同名的列没有任何关系。可对于ES来说,并非如此。

在ES中,相同名称的Field在Lucene底层被认为是同一个Field,在某些情况下回导致Lucene效率下降。

基本操作

新建和删除Index

新建Index,可以直接向ES Server发出PUT请求。下面的例子是新建一个名叫school的Index

 curl -X PUT 'localhost:9200/school'

服务器返回一个JSON对象,里面的ackownledged字段标识操作成功

{
    "acknowledged": true,
    "shards_acknowledged": true,
    "index": "school"
}

接着,我们使用DELETE请求删除这个Index

curl -X DELETE 'localhost:9200/school'

同样,ackownledged告诉我们删除成功

{
    "acknowledged": true
}

数据操作

新增记录

向指定的Index发送 POST or PUT请求以下命令,就可以新增一条记录。下面我们就往shcool这个Index中插入一条记录。

curl -X POST -H 'Content-Type: application/json' localhost:9200/school/_doc/002 -d '
{
  "user": "Javis"
}'

school/_doc后面的_doc,这个是es7.x替代Type的语法。

服务器返回JSON对象,会给出Index、Id、Version等信息。

{
  "_index" : "school",
  "_type" : "_doc",
  "_id" : "001",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 7,
  "_primary_term" : 1
}

可以看到,school/_doc/002后面的002表示该条记录的Id。它可以是数字也可以是任意字符串。

新增记录的时候可以不指定Id。

curl -X POST -H 'Content-Type: application/json' localhost:9200/school/_doc -d '
{
  "user": "Kitty"
}'

可以看到服务端返回的_id是一个随机字符串

{
    "_index": "school",
    "_type": "_doc",
    "_id": "FoZ3DnoBrntj5fJoj9X6",
    "_version": 1,
    "result": "created",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 10,
    "_primary_term": 1
}

查看记录

Index发出GET请求,就可以查看指定记录。

curl -X GET 'localhost:9200/school/_doc/001?pretty=true'

URL的参数pretty=true表示格式化返回参数。

found字段表示搜索成功,_source字段返回原始记录

{
  "_index" : "school",
  "_type" : "_doc",
  "_id" : "001",
  "_version" : 1,
  "_seq_no" : 7,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "user" : "Javis"
  }
}

更新记录

更新记录就是使用PUT请求,重新发送一次数据

curl -X PUT -H 'Content-Type: application/json' 'localhost:9200/school/_doc/001' -d \
'{
  "user": "JavisChen"
}'

上面的代码中,把原始数据从"Javis"修改为"JavisChen"

删除记录

发出DELETE请求删除记录。

curl -X DELETE 'localhost:9200/school/_doc/001'

数据查询

返回所有数据

使用GET方式,直接请求/shcool/_doc/_search,就会返回所有数据

curl -X GET 'localhost:9200/school/_doc/_search?pretty=true
{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 10,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "school",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "user" : "张老师3",
          "title" : "普通老师",
          "desc" : "语文系"
        }
      }
    ]
  }
}

返回结果中字段含义:

took表示耗时(毫秒)

timed_out表示是否超时

hits表示命中的记录。

total返回记录数

max_score最高的匹配度

hits返回的记录数组

全文搜索

ES的查询是有自己的查询语法,要求GET请求带上Body

curl -X GET -H 'Content-Type:application/json' 'localhost:9200/school/_doc/_search?pretty=true' -d \
 '{
    "query": {"match": {"user": "kk"}}
  }'

上面使用Match查询,指定user字段里面包含"kk"。返回结果如下。

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 3.0244193,
    "hits" : [
      {
        "_index" : "school",
        "_type" : "_doc",
        "_id" : "F4aQDnoBrntj5fJottUb",
        "_score" : 3.0244193,
        "_source" : {
          "user" : "kk"
        }
      }
    ]
  }
}

ES默认一次返回10条记录,可以使用size来调整这个设定,还可以使用from进行位移。from默认从0开始。

curl -X GET -H 'Content-Type:application/json' 'localhost:9200/school/_doc/_search?pretty=true' -d \
'{
    "query": {"match": {"user": "kk"}},
		"from": 0,
		"size": 20
 }'

逻辑运算

多个搜索关键字以空格分开,代表or关系

curl -X GET -H 'Content-Type:application/json' 'localhost:9200/school/_doc/_search?pretty=true' -d \
 '{
    "query": {"match": {"user": "kk javis"}},
		"from": 0,
		"size": 20
  }'

上面请求搜索的是kk or javis

如果要执行多个关键字的and搜索,必须使用布尔查询

GET /school/_doc/_search
{
    "query": {
      "bool": {
        "must": [
          {"match":{"user":"kk"} },
          {"match":{"user":"javis"} }
        ]
      }
    },
    "from": 0,
    "size": 20
  }