• 内容概述
  • 什么是Elasticsearch,为什么要应用它?
  • 根底概念简介

    • 节点(node)
    • 索引(index)
    • 类型映射(mapping)
    • 文档(doc)
  • 本地环境搭建,创立第一个index
  • 罕用RESTful Api示例

    • 新增文档
    • 查问文档-不分词类型
    • 查问文档-分词类型

内容概述

本文内容次要集中在应用层,通过上面几个局部介绍以后最风行的搜寻工具:Elasticsearch,理解这些内容后,能够疾速开始应用它。

  • 什么是Elasticsearch,为什么要应用它?
  • 根底概念:节点,索引,类型映射和文档
  • 本地环境搭建,创立第一个index
  • 罕用RESTful Api示例

什么是Elasticsearch,为什么要应用它?

Elasticsearch 是一个分布式、RESTful 格调的搜寻和数据分析引擎。

它基于Lunece实现,应用java语言编写。Lunece是一个优良的搜索引擎库,但它应用起来非常复杂。

Elasticsearch通过对 Lunece的封装,暗藏了复杂性,提供了应用简略的RESTful Api。

同时也实现了分布式集群个性,具备存储数据大,查问性能好,扩大不便等特点。

为什么要应用它

在业务开发中,基于ES的个性,通常有上面这些场景须要应用它:

  • 存储大量数据。通过在应用mysql存储的时候,数据的单位是G。应用ES的时候,数据的单位是T。由此能够看出ES应用于大数据量的存储场景,基于分布式个性,它也反对备份和容灾,并且能够很容易程度扩大容量。
  • 分词搜索引擎。ES具备弱小的分词能力,能够反对高性能的实时搜寻。
  • 高效数据分析。ES提供的聚合剖析性能,可实现对保留的大量数据的近实时统计分析。

根底概念简介

要应用ES,须要理解几个最根本的概念,节点(node),索引(index),类型映射(mapping)和文档(doc)。

节点(node)

节点是组成ES集群的根本单位,每个节点是一个运行的ES实例。每个物理机器上能够有多个节点,应用不同的端口和节点名称。

节点按次要性能能够分为三种:主节点(Master Node),协调节点(Coordianting Node)和数据节点(Data Node)。上面简略介绍下:

  • 主节点:解决创立,删除索引等申请,保护集群状态信息。能够设置一个节点不承当主节点角色
  • 协调节点:负责解决申请。默认状况下,每个节点都能够是协调节点。
  • 数据节点:用来保留数据。能够设置一个节点不承当数据节点角色

索引(index)

索引是ES中的逻辑概念,是文档的容器。对ES的操作,根本都是对索引操作,一个ES集群中,能够创立多个索引。

索引定义了一组文档的数据模型和解决办法。每个索引能够有多个主分片和正本分片,别离保留在不同的节点。

  • 主分片的作用是对索引的扩容,使一个索引的容量能够冲破单机的限度。
  • 正本分片是对数据的爱护,每个主分片对应一个或多个正本分片,当主分片所在节点宕机时,正本分片会被晋升为对应的主分片应用。
  • 一个主分片和它的正本分片,不会调配到同一个节点上。
  • 一个索引的分片数在创立时指定,如果要批改须要重建索引,代价很高。

类型映射(mapping)

mapping定义了一个索引中,文档保留的每个字段的数据类型。依据数据类型的不同,在增加文档时对每个字段的解决也不同。

例如,对text类型的字段,会先应用分词器分词,生成倒排索引,用于之后的搜寻。对keyword类型的字段,不会分词,搜寻时只能准确查找。

一个简略的mapping示例如下:

{    "javalogs": { //索引名称        "mappings": {            "properties": {                "log_content": { //text类型,分词,用于之后的分词索引                    "type": "text"                },                "date": {//工夫类型                    "type": "date"                 },                "log_level": { //keyword类型,不分词                    "type": "keyword"                 },                "ip": {                    "type": "keyword"                }            }        }    }}
在6.x版本中,每个索引中还能够有多个type,辨别不同的mapping。在7.x中,type被勾销,每个索引只有一个type:_doc

文档(doc)

  • 文档是Elasticsearch中的最小单位,每个索引都是有数量泛滥的文档组成的。
  • 文档中蕴含多个字段,每个字段的类型由mapping定义。
  • 在一个索引中每个文档都有一个惟一id,能够在增加时指定,也能够主动生成。

上面通过一张图来形容,节点(node),索引(index)和文档(doc)之间的关系。

本地环境搭建,创立第一个index

所有常识都要通过实际把握,所以在理解根本的概念和逻辑后,上面就进入实际环节。

这里举荐应用docker来搭建本地开发环境,docker对应windows和mac零碎都有桌面版本,应用十分不便。因为网络限度,间接应用docker官网仓库拉取镜像会很慢,所以在装置实现后,须要在设置中将仓库的地址替换为国内源,这里举荐https://docker.mirrors.ustc.edu.cn,速度很快,设置如下:

{  "registry-mirrors": [    "https://docker.mirrors.ustc.edu.cn"  ]}

上面咱们应用docker装置Elasticsearchkibana镜像,kibana是es官网配套的可视化剖析工具,应用它的页面dev tools能够很不便的通过api操作es。

因为要同时部署两个docker镜像,这里举荐应用docker-composer,桌面版装置实现后就带有该命令,须要的配置如下:

services:  kibana:    image: kibana:7.2.0    container_name: kibana-simple    environment:      - TIMELION_ENABLED=true    ports:      - "5601:5601"    networks:      - mynetwork  elasticsearch:    image: elasticsearch:7.2.0    container_name: es-simple    environment:      - cluster.name=mytestes #这里就是ES集群的名称      - node.name=es-simple #节点名称      - bootstrap.memory_lock=true      - network.publish_host=elasticsearch #节点公布的网络名称      - discovery.seed_hosts=es-simple #设置集群中的主机地址      - cluster.initial_master_nodes=es-simple #手动设置能够成为master的节点汇合    ulimits:     memlock:      soft: -1      hard: -1    volumes:      - esdata1:/usr/local/elasticsearch/simpledata    ports:      - 9200:9200    networks:      - mynetworkvolumes:  esdata1:    driver: localnetworks:  mynetwork:    driver: bridge

创立一个名称为docker-compose.yaml文件,复制上面的配置到文件中,而后再文件所在目录执行docker-compose up,之后会启动两个docker实例,别离是elasticsearchkibana

在本地浏览器中,拜访http://127.0.0.1:5601/,能够看到kibana的界面如下:

创立好的kibana曾经默认增加了Elasticsearch的配置,通过管理工具能够很不便的查看ES集群的状态,索引状况,删除索引等。

上面通过dev tools创立索引,dev tools提供的命令提醒很不便,并且能够把已写好的申请保留在浏览器缓存中,非常适合用来学习Elasticsearch

这里通过ES提供的RESTful Api创立了第一个索引, 并且设置了该索引中的mapping,ES的地址曾经设置过,这里能够不写残缺的域名,对应的curl残缺申请如下:

curl --location --request PUT 'http://127.0.0.1:9200/javalogs' \--header 'Content-Type: application/json' \--data-raw '{    "mappings": {        "properties": {            "log_content": {                "type": "text"            },            "date": {                "type": "date"            },            "log_level": {                "type": "keyword"            },            "ip": {                "type": "keyword"            }        }    }}'

罕用RESTful Api示例

上面介绍下Elasticsearch中罕用的api,这些例子都是间接在kibanadev tools中运行的,如果想用curl拜访,可参考前一节中的转换例子。

新增文档

//主动生成_idPOST javalogs/_doc{  "log_content" : "get user_id 123456",  "date" : "2020-04-15T11:09:08",  "log_level": "info",  "ip": "10.223.32.67"}
//指定_idPOST javalogs/_doc/111{  "log_content" : "api response in 55ms",  "date" : "2020-04-15T11:09:07",  "log_level": "info",  "ip": "10.223.32.67"}

查问文档-不分词类型

ES在文档查问时,对于不分词的查问,间接按值查问即可,例如上面这样:

//不分词类型查问POST javalogs/_search{  "query": {    "match": {      "ip": "10.223.32.67"    }  }}

查问文档-分词类型

这里次要说下分词类型的查问,对于剖析类型的field在查问时,也会默认把查问的语句分词。假如有两个文档如下:

//文档1{  "log_content" : "call aaa service error",  "date" : "2020-04-15T11:09:07",  "log_level": "error",  "ip": "10.223.32.67"}//文档2{  "log_content" : "call bbb service error",  "date" : "2020-04-15T11:09:08",  "log_level": "error",  "ip": "10.223.32.67"}

当搜寻条件为call aaa service时,实际上会把两个文档都搜寻进去。
这是因为在搜寻时,条件call aaa service会被分词为callaaaservice,所有蕴含这三个词的文档都会被搜寻进去,例如上面:

//一般搜寻,两个文档都会返回POST javalogs/_search{  "query": {    "match": {      "log_content": "call aaa service"    }  }}

那如果想要只搜寻蕴含call aaa service的文档,应该如何做呢?

依照下面的剖析,须要同时蕴含这三个词,并且依照给定的程序,才返回对应的文档,那么这个能够应用match_phrase实现,示例如下:

//文档必须同时蕴含三个词,并且程序与搜寻条件统一才会返回。这里只会返回-文档1POST javalogs/_search{  "profile": "true",   "query": {    "match_phrase": {      "log_content": "call aaa service"    }  }}

那如果条件是蕴含callaaaservice,然而不肯定是连着的,该如何搜寻呢?能够应用operator操作符实现。

例如有第三个文档如下:

//文档3{  "log_content" : "call inner aaa service error",  "date" : "2020-04-15T11:09:08",  "log_level": "error",  "ip": "10.223.32.67"}

要想把文档1文档2都搜寻进去,查问的示例如下:

//文档中同时蕴含call,aaa和service就会返回,不按程序。会返回-文档1和文档2POST javalogs/_search{  "query": {    "match": {      "log_content":       {        "query": "call aaa service",        "operator": "and"      }    }  }}

下面就是对Elasticsearch的简略介绍和实战操作示例,心愿能帮忙大家疾速入门应用ES。

以上内容属集体学习总结,如有不当之处,欢送在评论中斧正