热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Elasticsearch快速入门和环境搭建

内容概述什么是Elasticsearch,为什么要使用它?基础概念简介节点(node)索引(index)类型映射(mapping)文档(doc)本地环境搭建,创建第
  • 内容概述
  • 什么是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:
      - mynetwork

volumes:
  esdata1:
    driver: local

networks:
  mynetwork:
    driver: bridge

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

在本地浏览器中,访问http://127.0.0.1:5601/,可以看到kibana的界面如下:

创建好的kibana已经默认添加了Elasticsearch的配置,通过管理工具可以很方便的查看ES集群的状态,索引情况,删除索引等。

kibana-monitor

下面通过dev tools创建索引,dev tools提供的命令提示很方便,并且可以把已写好的请求保存在浏览器缓存中,非常适合用来学习Elasticsearch

create-index

这里通过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访问,可参考前一节中的转换例子。

新增文档

//自动生成_id
POST javalogs/_doc
{
  "log_content" : "get user_id 123456",
  "date" : "2020-04-15T11:09:08",
  "log_level": "info",
  "ip": "10.223.32.67"
}
//指定_id
POST 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实现,示例如下:

//文档必须同时包含三个词,并且顺序与搜索条件一致才会返回。这里只会返回-文档1
POST 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和文档2
POST javalogs/_search
{
  "query": {
    "match": {
      "log_content": 
      {
        "query": "call aaa service",
        "operator": "and"
      }
    }
  }
}

上面就是对Elasticsearch的简单介绍和实战操作示例,希望能帮助大家快速入门使用ES。

以上内容属个人学习总结,如有不当之处,欢迎在评论中指正


推荐阅读
  • 使用 ModelAttribute 实现页面数据自动填充
    本文介绍了如何利用 Spring MVC 中的 ModelAttribute 注解,在页面跳转后自动填充表单数据。主要探讨了两种实现方法及其背后的原理。 ... [详细]
  • 本文探讨了一个Web工程项目的需求,即允许用户随时添加定时任务,并通过Quartz框架实现这些任务的自动化调度。文章将介绍如何设计任务表以存储任务信息和执行周期,以及如何通过一个定期扫描机制自动识别并加载新任务到调度系统中。 ... [详细]
  • Docker基础入门与环境配置指南
    本文介绍了Docker——一款用Go语言编写的开源应用程序容器引擎。通过Docker,用户能够将应用及其依赖打包进容器内,实现高效、轻量级的虚拟化。容器之间采用沙箱机制,确保彼此隔离且资源消耗低。 ... [详细]
  • 本文详细介绍了如何在PHP中使用Memcached进行数据缓存,包括服务器连接、数据操作、高级功能等。 ... [详细]
  • selenium通过JS语法操作页面元素
    做过web测试的小伙伴们都知道,web元素现在很多是JS写的,那么既然是JS写的,可以通过JS语言去操作页面,来帮助我们操作一些selenium不能覆盖的功能。问题来了我们能否通过 ... [详细]
  • 本文介绍了如何通过安装和配置php_uploadprogress扩展来实现文件上传时的进度条显示功能。通过一个简单的示例,详细解释了从安装扩展到编写具体代码的全过程。 ... [详细]
  • Hadoop MapReduce 实战案例:手机流量使用统计分析
    本文通过一个具体的Hadoop MapReduce案例,详细介绍了如何利用MapReduce框架来统计和分析手机用户的流量使用情况,包括上行和下行流量的计算以及总流量的汇总。 ... [详细]
  • 本文介绍了如何使用 Python 的 Pyglet 库加载并显示图像。Pyglet 是一个用于开发图形用户界面应用的强大工具,特别适用于游戏和多媒体项目。 ... [详细]
  • 笔记说明重学前端是程劭非(winter)【前手机淘宝前端负责人】在极客时间开的一个专栏,每天10分钟,重构你的前端知识体系& ... [详细]
  • Lua字符串1.字符串常见形式字符串或串(String)是由数字、字母、下划线组成的一串字符。Lua语言中字符串可以使用以下三种方式来表示:•单引号间的一串字符。 ... [详细]
  • 本文介绍了如何使用Java编程语言实现凯撒密码的加密与解密功能。凯撒密码是一种替换式密码,通过将字母表中的每个字母向前或向后移动固定数量的位置来实现加密。 ... [详细]
  • java datarow_DataSet  DataTable DataRow 深入浅出
    本篇文章适合有一定的基础的人去查看,最好学习过一定net编程基础在来查看此文章。1.概念DataSet是ADO.NET的中心概念。可以把DataSet当成内存中的数据 ... [详细]
  • 使用 Babylon.js 实现地球模型与切片地图交互(第三部分)
    本文继续探讨在上一章节中构建的地球模型基础上,如何通过自定义的 `CameraEarthWheelControl` 类来实现更精细的地图缩放控制。我们将深入解析该类的实现细节,并展示其在实际项目中的应用。 ... [详细]
  • 本文介绍如何通过Java代码调用阿里云短信服务API来实现短信验证码的发送功能,包括必要的依赖添加和关键代码示例。 ... [详细]
  • 本文详细对比了HashMap和HashTable在多线程环境下的安全性、对null值的支持、性能表现以及方法同步等方面的特点,帮助开发者根据具体需求选择合适的数据结构。 ... [详细]
author-avatar
爱到最后还是分离_851
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有