【微服务】ElasticSearch

ElasticSearch:搜索

概述:

  • 简称为es,es是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;
  • 本身扩展性很好,可以扩展到上百台服务器,处理PB级别(大数据时代)的数据。
  • es也使用java开发并使用Lucene作为其核心来实现所有索引和搜索的功能
  • 但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。

安装

使用Java开发,必须保证ElasticSearch的版本与Java的核心jar包版本对应

Window安装

地址:(可以直接下载)https://mirrors.huaweicloud.com/elasticsearch/7.6.1/elasticsearch-7.6.1-windows-x86_64.zip

目录结构如下:

启动:双击elasticsearch.bat

启动完成如下

使用浏览器访问

安装可视化界面

地址:GitHub - mobz/elasticsearch-head: A web front end for an elastic search cluster

#启动: cd elasticsearch-head #安装依赖 npm install #启动 npm run start #访问: http://localhost:9100

访问

存在跨域的问题(只有两个页面同源,才能交互)

同源:端口 ,主机 ,协议 三者相同

开启跨域步骤:

# 开启跨域 http.cors.enabled: true # 所有人访问 http.cors.allow-origin: "*"

如何理解上图:
  • 如果你是初学者
    • 索引 可以看做 “数据库”
    • 类型 可以看做 “表”
    • 文档 可以看做 “库中的数据(表中的行)”
  • 这个head,我们只是把它当做可视化数据展示工具所有的查询都在kibana中进行
    • 因为不支持json格式化,不方便

安装kibana

  • Kibana是一个针对ElasticSearch的开源分析及可视化平台,用来搜索、查看交互存储在Elasticsearch索引中的数据。
  • 使用Kibana ,可以通过各种图表进行高级数据分析及展示。Kibana让海量数据更容易理解。
  • 它操作简单,基于浏览器的用户界面可以快速创建仪表板( dashboard )实时显示Elasticsearch查询动态。
  • 设置Kibana非常简单。无需编码或者额外的基础架构,几分钟内就可以完成Kibana安装并启动Elasticsearch索引监测

下载地址:https://artifacts.elastic.co/downloads/kibana/kibana-7.6.1-windows-x86_64.zip

汉化(文件末尾加)

i18n.locale: "zh-CN"

三、ElasticSearch核心概念

概述

1、索引(ElasticSearch)

  • 包多个分片

2、字段类型(映射)

  • 字段类型映射(字段是整型,还是字符型…)

3、文档

4、分片(Lucene索引,倒排索引)

ElasticSearch是面向文档,关系行数据库和ElasticSearch客观对比!一切都是JSON!

Relational DB

ElasticSearch

数据库(database)

索引(indices)

表(tables)

types \

行(rows)

documents

字段(columns)

fields

elasticsearch(集群)中可以包含多个索引(数据库) ,每个索引中可以包含多个类型(表) ,每个类型下又包含多个文档(行) ,每个文档中又包含多个字段(列)。

逻辑设计:

一个索引类型中,包含多个文档,比如说文档1,文档2。当我们索引一篇文档时,可以通过这样的顺序找到它:索引 => 类型 => 文档ID ,通过这个组合我们就能索引到某个具体的文档。 注意:ID不必是整数,实际上它是个字符串。

文档(”行“)

之前说elasticsearch是面向文档的,那么就意味着索引和搜索数据的最小单位是文档,

elasticsearch中,文档有几个重要属性:
  • 自我包含,一篇文档同时包含字段和对应的值,也就是同时包含key:value !
  • 可以是层次型的,一个文档中包含自文档,复杂的逻辑实体就是这么来的! {就是一个json对象 ! fastjson进行自动转换 !}
  • 灵活的结构,文档不依赖预先定义的模式,我们知道关系型数据库中,要提前定义字段才能使用,在elasticsearch中,对于字段是非常灵活的,有时候,我们可以忽略该字段,或者动态的添加一个新的字段。

尽管我们可以随意的新增或者忽略某个字段,但是,每个字段的类型非常重要,比如一个年龄字段类型,可以是字符串也可以是整形。因为elasticsearch会保存字段和类型之间的映射及其他的设置。这种映射具体到每个映射的每种类型,这也是为什么在elasticsearch中,类型有时候也称为映射类型。

类型(“表”)

类型是文档的逻辑容器,就像关系型数据库一样,表格是行的容器。类型中对于字段的定义称为映射,比如name映射为字符串类型。我们说文档是无模式的,它们不需要拥有映射中所定义的所有字段,比如新增一个字段,那么elasticsearch是怎么做的呢?

  • elasticsearch会自动的将新字段加入映射,但是这个字段的不确定它是什么类型,elasticsearch就开始猜,如果这个值是18,那么elasticsearch会认为它是整形。但是elasticsearch也可能猜不对,所以最安全的方式就是提前定义好所需要的映射,这点跟关系型数据库殊途同归了,先定义好字段,然后再使用,别整什么幺蛾子。

索引(“库”)

索引是映射类型的容器, elasticsearch中的索引是一个非常大的文档集合。 索引存储了映射类型的字段和其他设置。然后它们被存储到了各个分片上了。我们来研究下分片是如何工作的。

物理设计:节点和分片 如何工作

创建新索引

一个集群至少有一个节点,而一个节点就是一个elasricsearch进程,节点可以有多个索引默认的,如果你创建索引,那么索引将会有个5个分片(primary shard ,又称主分片)构成的,每一个主分片会有一个副本(replica shard,又称复制分片)

上图是一个有3个节点的集群,可以看到主分片和对应的复制分片都不会在同一个节点内,这样有利于某个节点挂掉了,数据也不至于失。实际上,一个分片是一个Lucene索引(一个ElasticSearch索引包含多个Lucene索引) ,一个包含倒排索引的文件目录,倒排索引的结构使得elasticsearch在不扫描全部文档的情况下,就能告诉你哪些文档包含特定的关键字。不过,等等,倒排索引是什么鬼?

倒排索引(Lucene索引底层)

简单说就是 按(文章关键字,对应的文档\)形式建立索引,根据关键字就可直接查询对应的文档(含关键字的),无需查询每一个文档,如下图

Restful操作 ES

一种软件架构风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

基本Rest命令说明:

method

url地址

描述

PUT(创建,修改)

localhost:9200/索引名称/类型名称/文档id

创建文档(指定文档id)

POST(创建)

localhost:9200/索引名称/类型名称

创建文档(随机文档id)

POST(修改)

localhost:9200/索引名称/类型名称/文档id/_update

修改文档

DELETE(删除)

localhost:9200/索引名称/类型名称/文档id

删除文档

GET(查询)

localhost:9200/索引名称/类型名称/文档id

查询文档通过文档ID

POST(查询)

localhost:9200/索引名称/类型名称/文档id/_search

查询所有数据

基本测试(关于索引的基本操作)

1.创建一个索引:

PUT /索引名/~类型名~/文档id {请求体}

完成了自动增加了索引!数据也成功添加了,这也是在初期当作数据库学习的原因

指定字段类型,设置规则

PUT /test1 { "mappings": { "properties": { "name":{ "type":"text" }, "age":{ "type":"long" }, "birthday":{ "type":"date" } } } }

修改信息
POST /test/meet/1/_update

PUT /test/meet/1

POST /test/meet/1/_update { "doc":{ "name":"日月山" } }

删除索引、文档
DELETE /test/meet/1 DELETE /test

获得信息

GET /索引名

GET /索引名/类型/文档id

如果文档字段没有指定,es会自动配置字段类型

下面是空搜索的结果:

{
  "took": 2,        # 该命令请求花费了多长时间,单位:毫秒。
  "timed_out": false,        # 搜索是否超时
  "_shards": {        # 搜索分片信息
    "total": 3,        # 搜索分片总数
    "successful": 3,        # 搜索成功的分片数量
    "skipped": 0,        # 没有搜索的分片,跳过的分片
    "failed": 0        # 搜索失败的分片数量
  },
  "hits": {        # 搜索结果集。需要的一切数据都是从hits中获取
    "total": 21798,        # 返回多少条数据
    "max_score": 1,        #返回结果中,最大的匹配度分值
    "hits": [        # 默认查询前十条数据,根据分值降序排序,这里为了节省地方,把默认查询的前十条数据删了9条,只剩下一条数据
      {
        "_index": "",        # 索引库名称
        "_type": "",        # 类型名称
        "_id": "",        # 该条数据的id
        "_score": 1,        # 关键字与该条数据的匹配度分值
        "_routing": "",        # routing参数是一个可选参数,默认使用文档的_id值,用于计算文档所属分片
        "_source": {        # 索引库中类型,返回结果字段,不指定的话,默认全部显示出来
          "id": 1,
          "orderNo": "",
          "appId": "",
          "componentAppId": "",
          "settleNo": "",
          "outSettleNo": "",
          "settleAmount": 5,
          "orderAmount": 7,
          "settleStatus": 3,
          "paymentChannel": 1,
          "version": 2,
          "settleTime": ,
          "createTime": ,
          "updateTime": ,
          "promotionAccountId": "",
          "invoiceStatus": 1,
          "promotionTypeValue": 0,
          "commissionRateFeeCentAmount": 0,
          "commissionChargeFeeCentAmount": 0,
          "promotionFeeCentAmount": 2,
          "developerPromotionFeeCentAmount": 0,
          "promotionType": ""
        }
      }
    ]
  }
}

match查询

  1. 匹配查询match是核心查询,他是一个高级全文查询,表示他技能处理字段(包括分词的字段),又能处理精准字段
{
  "query": {
    "match": {
      "appId": "xxxx"
    }
  }
}

term查询

  • term 查询, 可以用它处理数字(numbers)、布尔值(Booleans)、日期(dates)以及文本(text)
  • 用 trem 搜索字符串时 要将字段设置成 not_analyzed 无需分析的。不然es会将字符串进行分词,分词结果建立索引,在用trem进行精确查找时找不到任何文档
{
  "query": {
    "term": {
      "appId": "xxxx"
    }
  }
}
{
  "query": {
    "range": {
      "createTime": {
        "gte": 1661409996661,
        "lte": 1661409996661
      }
    }
  }
}

terms查询

terms 查询允许指定多个值进行匹配。如果这个字段包含了指定值中的任何一个值,就表示该文档满足条件。

{
  "query": {
    "terms": {
      "appId": ["xxxx", "xxxx"]
    }
  }
}

range范围

  • 常常被用在数字或者日期范围的查询
{
  "query": {
    "range": {
      "createTime": {
        "gte": 1661409996661,
        "lte": 1661409996661
      }
    }
  }
}

布尔查询

  • 通过布尔逻辑将较小的查询组合成较大的查询。
  • 概念
  • Bool查询语法有以下特点
    • 子查询可以任意顺序出现
    • 可以嵌套多个查询,包括bool查询
    • 如果bool查询中没有must条件,should中必须至少满足一条才会返回结果。
  • bool查询包含四种操作符,分别是must,should,must_not,filter。他们均是一种数组,数组里面是对应的判断条件。
    • must: 必须匹配。贡献算分
    • must_not:过滤子句,必须不能匹配,但不贡献算分
    • should: 选择性匹配,至少满足一条。贡献算分
    • filter: 过滤子句,必须匹配,但不贡献算分,所以比must会更快!
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "appId": "xxxx"
          }
        },
        {
          "term": {
            "paymentChannel": 1
          }
        },
        {
          "term": {
            "settleStatus": 3
          }
        },
        {
          "term": {
            "promotionAccountId": ""
          }
        },
        {
          "range": {
            "createTime": {
              "from": 1658741630780,
              "to": 1661420030780,
              "include_lower": true,
              "include_upper": true
            }
          }
        }
      ]
    }
  }
}

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五敷有你

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值