ElasticSearch

分布式搜索引擎 - elasticsearch

一、初识 elasticsearch

1、了解ES

什么是 elasticsearch?

Elasticsearch 是基于 Lucene 的 Restful 的分布式搜索引擎,每个字段都被索引并可被搜索,可以快速存储、搜索、分析海量的数据。

什么是elastic stack(ELK)?

Elasticsearch 结合 kibana(数据可视化)、Logstash(数据抓取)、Beats(数据抓取),也就是 elastic stack(ELK)。被广泛应用在日志数据分析、实时监控等领域。

什么是 Lucene?

是Apache的开源搜索引擎类库,提供了搜索引擎的核心API。

2、倒排索引

什么是文档和词条?
  • 文档(document):每条数据就是一个文档
  • 词条(term):文档按照语义分成的词语
什么是正向索引?

基于文档id创建索引。查询词条时必须先找到文档,而后判断是否包含词条。

什么是倒排索引?

对文档内容分词,对词条创建索引,并记录词条所在文档的信息。查询时先根据词条查询到文档id,而后获取到文档。

倒排索引中包含两部分内容:

  • 词条词典(Term Dictionary):记录所有词条,以及词条与倒排列表(Posting List)之间的关系,会给词条创建索引,提高查询和插入效率
  • 倒排列表(Posting List):记录词条所在的文档id、词条出现频率 、词条在文档中的位置等信息
    文档id:用于快速获取文档
    词条频率(TF):文档在词条出现的次数,用于评分

3、es的一些概念

文档

一条数据就是一个文档,es中是Json格式。

elasticsearch是面向文档存储的,可以是数据库中的一条商品数据,一个订单信息。
文档数据会被序列化为json格式后存储在elasticsearch中。

在这里插入图片描述

索引(Index)
  • 索引(index):相同类型的文档的集合
  • 映射(mapping):索引中文档的约束,比如字段名称、类型

在这里插入图片描述

4、MySQL 和 Elasticsearch 对比

在这里插入图片描述
elasticsearch与数据库的关系

  • 数据库负责事务类型操作
  • elasticsearch负责海量数据的搜索、分析、计算

5、分词器

处理中文分词,一般会使用IK分词器。

分词器有两个作用:

  1. 创建倒排索引时对文档分词
  2. 用户搜索时,对输入的内容分词
ik分词器两种模式
  • ik_smart:最少切分,粗粒度
  • ik_max_word:最细切分,细粒度
ik分词器-拓展词库

要拓展ik分词器的词库,只需要修改一个ik分词器目录中的config目录中的IkAnalyzer.cfg.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
        <comment>IK Analyzer 扩展配置</comment>
        <!--用户可以在这里配置自己的扩展字典 *** 添加扩展词典-->
        <entry key="ext_dict">ext.dic</entry>
</properties>

然后在名为ext.dic的文件中,添加想要拓展的词语即可:

白嫖
耗子尾汁
ik分词器-停用词库

要禁用某些敏感词条,只需要修改一个ik分词器目录中的config目录中的IkAnalyzer.cfg.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
        <comment>IK Analyzer 扩展配置</comment>
        <!--用户可以在这里配置自己的扩展字典-->
        <entry key="ext_dict">ext.dic</entry>
         <!--用户可以在这里配置自己的扩展停止词字典  *** 添加停用词词典-->
        <entry key="ext_stopwords">stopword.dic</entry>
</properties>

然后在名为stopword.dic的文件中,添加想要拓展的词语即可:

奥利给

二、索引库操作

1、mapping映射属性

mapping属性

1.type:字段数据类型,常见的简单类型有:

字符串:text(可分词的文本)、keyword(精确值,例如:品牌、国家、ip地址)
数值:long、integer、short、byte、double、float
布尔:boolean
日期:date
对象:object

  1. index:是否创建索引,默认为true
  2. analyzer:使用哪种分词器
  3. properties:该字段的子字段
{
    "age": 21,
    "weight": 52.1,
    "isMarried": false,
    "info": "黑马程序员Java讲师",
    "email": "zy@itcast.cn",
    "score": [99.1, 99.5, 98.9],
    "name": {
        "firstName": "云",
        "lastName": "赵"
    }
}

2、索引库的CRUD

创建索引库

ES中通过Restful请求操作索引库、文档。请求内容用DSL语句来表示。创建索引库和mapping的DSL语法如下:
在这里插入图片描述

查看、删除索引库
查看索引库语法:

在这里插入图片描述

删除索引库的语法:

在这里插入图片描述

修改索引库

索引库和mapping一旦创建无法修改,但是可以添加新的字段,语法如下:

PUT /索引库名/_mapping
{
  "properties": {
    "新字段名":{
      "type": "integer"
    }
  }
}

示例:

PUT /heima/_mapping
{
  "properties": {
    "age":{
      "type": "integer"
    }
  }
}
总结:索引库操作有哪些?
  1. 创建索引库:PUT /索引库名
  2. 查询索引库:GET /索引库名
  3. 删除索引库:DELETE /索引库名
  4. 添加字段:PUT /索引库名/_mapping

三、文档操作

1、新增文档

新增文档的DSL语法如下:
在这里插入图片描述

2、查询文档

查看文档语法:
在这里插入图片描述

3、删除文档

在这里插入图片描述

4、修改文档

方式一:全量修改,会删除旧文档,添加新文档

在这里插入图片描述

方式二:增量修改,修改指定字段值

在这里插入图片描述

5、文档操作总结

在这里插入图片描述

6、文档操作-Dynamic Mapping

新增文档的结构与mapping结构不一致,如何解决?

  • 插入文档时,es会检查文档中的字段是否有mapping,如果没有则按照默认mapping规则来创建索引。
  • 如果默认mapping规则不符合你的需求,一定要自己设置字段mapping

当我们向ES中插入文档时,如果文档中字段没有对应的mapping,ES会帮助我们字段设置mapping,规则如下:
在这里插入图片描述
示例:
在这里插入图片描述

四、RestClient操作索引库

1、什么是RestClient

ES官方提供了各种不同语言的客户端,用来操作ES。这些客户端的本质就是组装DSL语句,通过http请求发送给ES。

官方文档地址:https://www.elastic.co/guide/en/elasticsearch/client/index.html

利用JavaRestClient实现创建、删除索引库,判断索引库是否存在。

2、RestClient操作索引库步骤:创建、删除索引库,判断索引库是否存在

索引库操作的基本步骤:

  1. 初始化RestHighLevelClient
  2. 创建XxxIndexRequest。XXX是Create、Get、Delete
  3. 准备DSL( Create时需要)
  4. 发送请求。调用RestHighLevelClient#indices().xxx()方法,xxx是create、exists、delete
  5. 解析结果(Get时需要)

3、利用JavaRestClient批量导入数据到ES

利用JavaRestClient中的Bulk批处理,实现批量新增文档,示例代码如下:

在这里插入图片描述

五、DSL查询文档

1、DSL Query基本语法

在这里插入图片描述

2、DSL Query的分类

在这里插入图片描述

3、match和multi_match的区别是什么?

  • match:根据一个字段查询
  • multi_match:根据多个字段查询,参与查询字段越多,查询性能越差
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

YD_1989

分享不易,非常感谢您的鼓励支持

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

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

打赏作者

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

抵扣说明:

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

余额充值