1 ElasticSearch概述

简称ES,ES是一个开源的高扩展分布式全文检索引擎,它可以近乎实时的存储检测数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。ES也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能。

2 ElasticSearch安装

https://www.elastic.co/

2.1 Windows下使用

下载过安装包后解压

在这里插入图片描述
目录介绍:

  • bin 启动文件
  • config 配置文件
    文件夹里面的:
    log4j2:日志配置文件;
    jvm.options:java 虚拟机相关的配置,可设置运行起来需要的内存,默认是1G。
    elasticsearch.yml:elasticsearch 的配置文件! 默认 9200 端口!
  • lib 相关jar包
  • logs 日志
  • modules 功能模块
  • plugins 插件

启动:

在这里插入图片描述

访问 localhost:9200

在这里插入图片描述

2.2 可视化工具使用-head插件

下载地址:https://github.com/mobz/elasticsearch-head/
解压
文件主目录下打开cmd
执行

npm install
npm run start

在这里插入图片描述

在这里插入图片描述

连接测试发现,存在跨域问题:配置 es,在 elasticsearch.yml 的最后添加

http.cors.enabled: true
http.cors.allow-origin: "*"

重启 es 服务器,然后再次连接

在这里插入图片描述

把 es 当做一个数据库! (可以建立索引(库),文档(库中的数据!))这个 head 就当做数据展示工具!我们后面所有的查询会用到 Kibana。

2.3 了解 ELK

ELK 是 Elasticsearch、Logstash、Kibana 三大开源框架首字母大写简称。市面上也被成为 ElasticStack。其中 Elasticsearch 是一个基于 Lucene、分布式、通过 Restful 方式进行交互的近实时搜索平台框架。像类似百度、谷歌这种大数据全文搜索引擎的场景都可以使用 Elasticsearch 作为底层支持框架,可见 Elasticsearch 提供的搜索能力确实强大,市面上很多时候我们简称 Elasticsearch 为 es。Logstash 是 ELK 的中央数据流引擎,用于从不同目标(文件/数据存储/MQ)收集的不同格式数据,经过过滤后支持输出到不同目的地(文件/MQ/redis/elasticsearch/kafka 等)。Kibana 可以将 elasticsearch 的数据通过友好的页面展示出来,提供实时分析的功能。

市面上很多开发只要提到 ELK 能够一致说出它是一个日志分析架构技术栈总称,但实际上 ELK 不仅仅适用于日志分析,它还可以支持其它任何数据分析和收集的场景,日志分析和收集只是更具有代表性。并非唯一性。

在这里插入图片描述

2.4 安装 Kibana

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

https://www.elastic.co/cn/kibana/
下载完毕后,解压。

测试:

在这里插入图片描述
访问:http://localhost:5601

在这里插入图片描述

汉化:

在这里插入图片描述

2.5 ES核心概念

1、索引

2、字段类型(mapping)

3、文档(documents)

ES与关系型数据库的对比:
在这里插入图片描述

倒排索引:
elasticsearch 使用的是一种称为倒排索引的结构,采用 Lucene 倒排索作为底层。这种结构适用于快速的全文搜索, 一个索引由文档中所有不重复的列表构成,对于每一个词,都有一个包含它的文档列表。

在这里插入图片描述

如果要搜索含有 python 标签的文章,那相对于查找所有原始数据而言,查找倒排索引后的数据将会快的多。只需要 查看标签这一栏,然后获取相关的文章 ID 即可。完全过滤掉无关的所有数据,提高效率!

2.6 IK分词器插件

什么是 IK 分词器?

分词:即把一段中文或者别的划分成一个个的关键字,我们在搜索时候会把自己的信息进行分词,会把数据库中或者索引库中的数据进行分词,然后进行一个匹配操作,默认的中文分词是将每个字看成一个词,比如 “我爱狂神” 会被分为"我",“爱”,“狂”,“神”,这显然是不符合要求的,所以我们需要安装中文分词器 ik 来解决这个问题。

IK 提供了两个分词算法:ik_smart 和 ik_max_word,其中 ik_smart 为最少切分,ik_max_word 为最细粒度划分!

安装:https://github.com/medcl/elasticsearch-analysis-ik

将下载好的插件解压后放在es的plugins文件夹下。
在这里插入图片描述

可在kibana查看不同的分词效果:

在这里插入图片描述

在这里插入图片描述
某些词可能是自己需要的,比如想要拆分出来 “产党”,这时候就需要自己加。加过之后,当以后每遇到这个词时都会把这个词分在一起!

在这里插入图片描述
liu.dic 里面加入了 “产党”,重新启动es

在这里插入图片描述

3 Rest 风格

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

在这里插入图片描述
例如用 PUT 创建索引、类型、字段:

在这里插入图片描述

在header上查看:

在这里插入图片描述

指定每一个字段的类型:

在这里插入图片描述

如果自己的文档字段没有指定,那么 es 就会给我们默认配置字段类型!

修改某个数据:

在这里插入图片描述

删除索引:

在这里插入图片描述

3.1 关于文档的基本操作

1、添加数据

PUT /lmh/user/1
{
	"name": "lmh",
	"age": 23,
	"desc": "一顿操作猛如虎,一看工资2500",
	"tags": ["技术宅","温暖","直男"]
}

PUT /lmh/user/2
{
	"name": "张三",
	"age": 3,
	"desc": "法外狂徒",
	"tags": ["交友","旅游","渣男"]
}
 
PUT /lmh/user/3
{
	"name": "李四",
	"age": 30,
	"desc": "逍遥自在",
	"tags": ["靓仔","大餐","编程"]
}

2、获取数据

GET  lmh/user/1

3、更新数据

POST /lmh/user/1/_update
{
  "doc": {
    "name": "刘梦豪"
  }
}

4、简单搜索

可以根据默认的映射规则,产生基本的查询。

在这里插入图片描述
5、复杂操作搜索 select ( 排序,分页,高亮,模糊查询,精准查询)

在这里插入图片描述
可通过 _source 来指定要输出的内容。

在这里插入图片描述
之后使用 Java 操作 es ,所有的方法和对象就是这里面的 key!

排序:

在这里插入图片描述
分页查询:

在这里插入图片描述
布尔值查询,用于 and、or、not 等
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

过滤器filter,用于比较

在这里插入图片描述

gt 大于

gte 大于等于

lt 小于

lte 小于等于!

3.2 精确查询

term 查询是直接通过倒排索引指定的词条进程精确查找的!

  • term ,直接查询精确的
  • match,会使用分词器解析!(先分析文档,然后在通过分析的文档进行查询!)

新建一个数据库

PUT testdb
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text"
      },
      "desc": {
        "type": "keyword"
      }
    }
  }
}

注意这里的类型,text类型会采取分词器进行解析,而keyword不会被分词解析。

添加数据

PUT testdb/_doc/1
{
  "name": "狂神说Java name",
  "desc": "狂神说Java desc"
}
 
PUT testdb/_doc/2
{
  "name": "狂神说Java name",
  "desc": "狂神说Java desc2"
}

查询数据

GET testdb/_search
{
  "query": {
    "term": {
      "name": "狂"
    }
  }
}
 
GET testdb/_search
{
  "query": {
    "term": {
      "desc": "狂神说Java desc"
    }
  }
}

当根据 name 查 “狂“ 的时候,由于name字段 是被分词器解析的,因此所有name 带 “狂” 的都会被查到

在这里插入图片描述
当根据 desc 查 “狂神说Java desc” 只有一条会被查到,因为 desc 字段不会被分词器解析。必须精准匹配才行。

在这里插入图片描述

3.3 高亮查询

GET testdb/_search
{
  "query": {
    "match": {
      "name": "狂神"
    }
  },
  "highlight": {
    "fields": {
      "name": {}
    }
  }
}

4 es集成SpringBoot

4.1 添加依赖

<dependency>
	<groupId>org.elasticsearch.client</groupId>
	<artifactId>elasticsearch-rest-high-level-client</artifactId>
	<version>7.6.2</version>
</dependency>

4.2 编写配置类

@Configuration // 就是xml,里面注入bean
public class ElasticSearchClientConfig {

    @Bean
    public RestHighLevelClient restHighLevelClient() {
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http"))
        );
        return client;
    }
}

4.3

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐