分布式搜索引擎 - 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分词器。
分词器有两个作用:
- 创建倒排索引时对文档分词
- 用户搜索时,对输入的内容分词
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
- index:是否创建索引,默认为true
- analyzer:使用哪种分词器
- 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"
}
}
}
总结:索引库操作有哪些?
- 创建索引库:PUT /索引库名
- 查询索引库:GET /索引库名
- 删除索引库:DELETE /索引库名
- 添加字段: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操作索引库步骤:创建、删除索引库,判断索引库是否存在
索引库操作的基本步骤:
- 初始化RestHighLevelClient
- 创建XxxIndexRequest。XXX是Create、Get、Delete
- 准备DSL( Create时需要)
- 发送请求。调用RestHighLevelClient#indices().xxx()方法,xxx是create、exists、delete
- 解析结果(Get时需要)
3、利用JavaRestClient批量导入数据到ES
利用JavaRestClient中的Bulk批处理,实现批量新增文档,示例代码如下:

五、DSL查询文档
1、DSL Query基本语法

2、DSL Query的分类

3、match和multi_match的区别是什么?
- match:根据一个字段查询
- multi_match:根据多个字段查询,参与查询字段越多,查询性能越差

2540

被折叠的 条评论
为什么被折叠?



