天天看点

Elasticsearch入门到精通第一篇-基础概念到安装查询1. Elasticsearch 基础概念2. Elasticsearch 安装3. 简单的案例介绍

本系列文章记录,摘要,总结 对Elasticsearch 的系统学习,基于官方文档 Elasticsearch 2.x 版本 , 内容可能过时

文章目录

  • 1. Elasticsearch 基础概念
    • 1.1 Elasticsearch 是什么
    • 1.2 Elasticsearch 功能
    • 1.3 与Elasticsearch交互
  • 2. Elasticsearch 安装
  • 3. 简单的案例介绍
    • 3.1 分析需求
    • 3.2 插入数据
    • 3.3 查询单条数据
    • 3.4查询得到属性解析
    • 3.5 查询全部数据
    • 3.6 查询属性解析

1. Elasticsearch 基础概念

1.1 Elasticsearch 是什么

Elasticsearch 是一个开源的搜索引擎,建立在一个全文搜索引擎库 Apache Lucene™ 基础之上。 Lucene 可以说是当下最先进、高性能、全功能的搜索引擎库,但是很复杂.

Elasticsearch 使用 Java 编写的,它的内部使用 Lucene 做索引与搜索,但它使全文检索变得简单, 通过隐藏 Lucene 的复杂性,提供一套简单一致的 RESTful API。

1.2 Elasticsearch 功能

  • 全文搜索引擎
  • 一个分布式的实时文档存储,每个字段 可以被索引与搜索
  • 一个分布式实时分析搜索引擎
  • 能胜任上百个服务节点的扩展,并支持 PB 级别的结构化或者非结构化数据

1.3 与Elasticsearch交互

交互可以选择

  1. Java api 交互,其中包含两种客户端 (默认9300)
    • 节点客户端(Node client)

      节点客户端作为一个非数据节点加入到本地集群中。换句话说,它本身不保存任何数据,但是它知道数据在集群中的哪个节点中,并且可以把请求转发到正确的节点。

    • 传输客户端(Transport client)

      轻量级的传输客户端可以将请求发送到远程集群。它本身不加入集群,但是它可以将请求转发到集群中的一个节点上。

其中集群也是通过9300 通信
  1. restful API交互

    一般在es搭建之后会搭建一个可视化界面,有以下选择(也可以再搜索看看有没有更好的,或者自己造一个?):

    • ElasticHD
    • elasticsearch-head
    • dejavu
    • kibana
    这里推荐: kibana(官方出品,后续还可以组合ELK), es-head (老派ui,简单易用,推荐插件安装方式)

2. Elasticsearch 安装

下载较慢 , 官方下载地址包含

当前版本是

Version: 7.7.1

, 可以使用yum , apt-get , docker , zip 等方式安装在Linux或Windows , 官方有详细的下载安装步骤

此处应该与你的Java 客户端jar包版本对应 , 并且如果需要安装kibana logstash 等也是需要版本对应

此时,你可以打开你的主机+端口 访问你的es , 如果出现es 信息则说明成功!

如果要和Java 客户端交互 需要注意9300 端口是否打开 9200 只是http端口

如果后面需要对中文分词还需要安装中文分词器插件,下载对应版本后解压到es/plugins/

3. 简单的案例介绍

首先,在es中有

文档

的概念,相当于sql中的表 ,在es中对整个文档(相当于一条记录)进行索引,排序,过滤,

而不是像sql那样针对一列建立索引,并且这里有 倒排索引 后面有详细讲解,并且使用

JSON

作为文档的序列化格式

这里从一个简单的案例介绍

文档

索引

搜索

聚合

等基础概念 :

我们受雇于 Megacorp 公司,作为 HR 部门新的 “热爱无人机” (“We love our drones!”)激励项目的一部分,我们的任务是为此创建一个员工目录。该目录应当能培养员工认同感及支持实时、高效、动态协作,因此有一些业务需求:

  • 支持包含多值标签、数值、以及全文本的数据
  • 检索任一员工的完整信息
  • 允许结构化搜索,比如查询 30 岁以上的员工
  • 允许简单的全文搜索以及较复杂的短语搜索
  • 支持在匹配文档内容中高亮显示搜索片段
  • 支持基于数据创建和管理分析仪表盘

3.1 分析需求

那么,首先我们应该存储

员工

数据,才能进行后续的操作,我们将

员工

文档

形式存储,

一个文档代表一个员工

, 存储数据到es的行为叫做

索引

(动词,索引一个文档就是存储一个文档到索引中),但,在索引一个文档前,需确定存储到哪个

索引

(名词,类似于关系数据库中的

数据库

概念)

所以

一个es集群

可以包含很

多个索引

(名词),

每个索引

(名词)可以包含很

多个类型

(类似于表),

每个类型

可以存储

多个文档

,

每个文档

又有

多个属性

所以我们应该做以下操作:

  1. 每个员工索引一个文档,文档包含员工所有信息
  2. 每个文档都是

    employee

    类型
  3. 该类型位于索引

    megacorp

  4. 该索引保存在我们的es集群中

至此,我们应该能够分清楚每一步具体在做什么,尽管步骤有点多,但是很简单,那么我们可以通过一条语句完成:

3.2 插入数据

PUT /megacorp/employee/1
{
    "first_name" : "John",
    "last_name" :  "Smith",
    "age" :        25,
    "about" :      "I love to go rock climbing",
    "interests": [ "sports", "music" ]
}

           

解释以下这条语句

这是cUrl 格式语句,发送put的http请求到

localhost:9200/megacorp/employee/1?pretty

指定

json

格式,并包含请求内容

路径

/megacorp/employee/1

包含了:

megacorp

索引名称

employee

类型名称

1

员工的id

请求内容则包含了该名员工的信息

在我们发送请求时,没有索引es会自动创建

索引

类型

属性

再增加几条数据

PUT /megacorp/employee/2
{
    "first_name" :  "Jane",
    "last_name" :   "Smith",
    "age" :         32,
    "about" :       "I like to collect rock albums",
    "interests":  [ "music" ]
}

PUT /megacorp/employee/3
{
    "first_name" :  "Douglas",
    "last_name" :   "Fir",
    "age" :         35,
    "about":        "I like to build cabinets",
    "interests":  [ "forestry" ]
}

           
将 HTTP 命令由 PUT 改为 GET 可以用来检索文档,同样的,可以使用 DELETE 命令来删除文档,以及使用 HEAD 指令来检查文档是否存在。如果想更新已存在的文档,只需再次 PUT 。

3.3 查询单条数据

GET /megacorp/employee/1
           
{
  "_index": "megacorp",
  "_type": "employee",
  "_id": "1",
  "_version": 1,
  "found": true,
  "_source": {
    "first_name": "John",
    "last_name": "Smith",
    "age": 25,
    "about": "I love to go rock climbing",
    "interests": [
      "sports",
      "music"
    ]
  }
}
           

3.4查询得到属性解析

可以看到所属

索引

类型

id

版本

(如果多次提交put就会覆盖,就会自动更新版本,当前是1)

foud 状态标识

_source

数据

3.5 查询全部数据

GET /megacorp/employee/_search

           
{
  "took": 4,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 3,
    "max_score": 1,
    "hits": [
      {
        "_index": "megacorp",
        "_type": "employee",
        "_id": "1",
        "_score": 1,
        "_source": {
          "first_name": "John",
          "last_name": "Smith",
          "age": 25,
          "about": "I love to go rock climbing",
          "interests": [
            "sports",
            "music"
          ]
        }
      },
      {
        "_index": "megacorp",
        "_type": "employee",
        "_id": "2",
        "_score": 1,
        "_source": {
          "first_name": "Jane",
          "last_name": "Smith",
          "age": 32,
          "about": "I like to collect rock albums",
          "interests": [
            "music"
          ]
        }
      },
      {
        "_index": "megacorp",
        "_type": "employee",
        "_id": "3",
        "_score": 1,
        "_source": {
          "first_name": "Douglas",
          "last_name": "Fir",
          "age": 35,
          "about": "I like to build cabinets",
          "interests": [
            "forestry"
          ]
        }
      }
    ]
  }
}

           

3.6 查询属性解析

{
  "took": 花费时间,
  "timed_out": 是否查询超时,
  "_shards": {
    "total": 分片总数,
    "successful": 分片成功数,
    "failed": 分片失败数
  },
  "hits": {
    "total": 本次搜索,返回几条结果,
    "max_score": 本次搜索的所有结果中,最大的相关度分数是多少,每一条document对于search的相关度,越相关,_score分数越大,排位越靠前,
    "hits": [数据]
    }}
    
           

至此,简单的插入,查询已经完成,下一节我们通过查询表达式搜索

继续阅读