什么是elasticsearch?
elasticsearch是一款非常强大的开源搜索引擎,可以帮助我们从海量数据中快速找到需要的内容
elasticsearch结合kibana、Logstash、Beats,也就是elastic stack(ELK)。被广泛应用在日志数据分析、实时监控等领域
elasticsearch是elastic stack的核心,负责存储、搜索、分析数据
1999年一个秃顶研发了Lucence
Lucene是一个Java语言的搜索引擎类库,是Apache公司的顶级项目
Lucene的优势:
•易扩展
•高性能(基于倒排索引)
Lucene的缺点:
•只限于Java语言开发
•学习曲线陡峭
•不支持水平扩展
一个光头基于Lucene开发了Elasticsearch
相比与lucene,elasticsearch具备下列优势:
•支持分布式,可水平扩展
•提供Restful接口,可被任何语言调用
搜索引擎技术排名:
1.Elasticsearch:开源的分布式搜索引擎
2.Splunk:商业项目
3.Solr:Apache的开源搜索引擎
什么是elastic stack(ELK)?
是以elasticsearch为核心的技术栈,包括beats、Logstash、kibana、elasticsearch
什么是Lucene?
是Apache的开源搜索引擎类库,提供了搜索引擎的核心API
正向索引和倒排索引
正向索引
传统数据库(如MySQL)采用正向索引,•基于文档id创建索引。查询词条时必须先找到文档,而后判断是否包含词条
倒排索引
elasticsearch采用倒排索引:
•文档(document):每条数据就是一个文档
•词条(term):文档按照语义分成的词语
•对文档内容分词,对词条创建索引,并记录词条所在文档的信息。查询时先根据词条查询到文档id,而后获取到文档
elasticsearch中的一些概念
文档:
elasticsearch是面向文档存储的,可以是数据库中的一条商品数据,一个订单信息。
文档数据会被序列化为json格式后存储在elasticsearch中。
索引(index):相同类型的文档的集合
映射(mapping):索引中文档的字段约束信息,类似表的结构约束
CRUD是指增Create 删Delete 改Updete 查Retrieve
elasticsearch与数据库的关系:
•数据库负责事务类型操作
•elasticsearch负责海量数据的搜索、分析、计算
安装elasticsearch(9200)、kibana(5601)
参考课前资料中的文档
kibana可以给我们提供一个elasticsearch的可视化界面
登陆之后菜单列表下拉找Dev Tools选项用来执行DSL语句
es默认的standard分词器对中文分词不友好(词语无法识别)
在es容器里安装ik分词插件
IK分词器包含两种模式:
- ik_smart:最少切分
- ik_max_word:最细切分
ik分词器-拓展词库
要拓展ik分词器的词库,只需要修改一个ik分词器目录中的config目录中的IkAnalyzer.cfg.xml文件
然后在名为ext.dic的文件中,添加想要拓展的词语即可:
传智播客
奥力给
ik分词器-停用词库
也是在那个文件里添加一条配置
然后在名为stopword.dic的文件中,添加想要拓展的词语即可
分词器的作用是什么?
•创建倒排索引时对文档分词
•用户搜索时,对输入的内容分词
IK分词器有几种模式?
•ik_smart:智能切分,粗粒度
•ik_max_word:最细切分,细粒度
IK分词器如何拓展词条?如何停用词条?
•利用config目录的IkAnalyzer.cfg.xml文件添加拓展词典和停用词典
•在词典中添加拓展词条或者停用词条
索引库操作
mapping属性
mapping是对索引库中文档的约束,常见的mapping属性包括:
•type:字段数据类型
•index:是否创建索引,默认为true
•analyzer:使用哪种分词器
•properties:该字段的子字段
type常见的简单类型有:
•字符串:text(可分词的文本)、keyword(精确值,例如:品牌、国家、ip地址)
•数值:long、integer、short、byte、double、float、
•布尔:boolean
•日期:date
•对象:object
创建索引库:PUT /索引库名称
查看索引库:GET/索引库名
删除索引库:DELETE/索引库名
修改索引库:PUT /索引库名/_mapping
索引库和mapping一旦创建无法修改,但是可以添加新的字段
PUT /索引库名/_mapping
{
“properties”: {
“新字段名”:{
“type”: “integer”
}
}
}
文档操作
•创建文档:POST /索引库名/_doc/文档id { json文档 }
•查询文档:GET /索引库名/_doc/文档id
•删除文档:DELETE /索引库名/_doc/文档id
•修改文档:
•全量修改:PUT /索引库名/_doc/文档id { json文档 }
•增量修改:POST /索引库名/_update/文档id { “doc”: {字段}}
RestClient操作索引库和文档
什么是RestClient?
RESTClient是一款用于测试各种Web服务的插件,它可以向服务器发送各种HTTP请求(用户也可以自定义请求方式),并显示服务器响应。
利用JavaRestClient实现创建、删除索引库,判断索引库是否存在
索引库操作的基本步骤:
•初始化RestHighLevelClient
•创建XxxIndexRequest。XXX是Create、Get、Delete
•准备DSL( Create时需要)
•发送请求。调用RestHighLevelClient#indices().xxx()方法,xxx是create、exists、delete

文档操作的基本步骤:
•初始化RestHighLevelClient
•创建XxxRequest。XXX是Index、Get、Update、Delete
•准备参数(Index和Update时需要)
•发送请求。调用RestHighLevelClient#.xxx()方法,xxx是index、get、update、delete
•解析结果(Get时需要)
MySQL与Elasticsearch有什么差别呢?
两者都是数据库,都能提供数据的CRUD
mysql是关系型数据库,具有ACID的事务特性能够保证数据的一致性,
不过当数据量大 并发量高时 性能较差 无法应对高效复杂的查询业务
es主要就是为海量数据的实时搜索而设计的,底层采用倒排索引 能够快速的实现
海量数据复杂搜索 ,但不支持事务
所以在我们项目中, mysql用于维护项目中的核心数据
而 es则用于项目中核心数据搜索实现
也可以 用于存储项目中的所有日志信息
Elasticsearch的文档操作API有什么样的规律?
思考面试题:
es介绍及作用?
基于lucene开发的全文搜索引擎
并且操作API简单 易于上手
扩展性强, 天生的分布式集群架构
es和lucene的关系?
ES是基于Lucene的,他的很多基础性组件都是由ApacheLucene提供的,而es则提供了更高层次的封装以及分布式方面的增强与扩展。
倒排索引介绍?
根据要检索的内容,创建词汇表,查询时 先查询词汇表,根据关键词得到对应的内容
减少磁盘IO的次数
词汇表一次创建 多次查询受益
中文分词器介绍?
IK Analyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包
IK分词器 有两种类型可选:
ik_smart 精简切分 (搜索条件分词使用)
ik_max_word 最细切分 (存储内容分词使用)
不过IK分词器是基于词典来分词的, 一些新的热点词汇可能不认识,或者有些敏感词需要忽略 可以通过配置 扩展词词典 、 停顿词词典来实现
如何扩展新词 如何忽略停顿词?
这些词典用户都可以自行扩展,只需要配置IKAnalyzer.cfg.xml文件即可
添加一条忽略字典的配置字典文件名加后缀
在对应的文件里添加需要忽略的词语
重启es和kibana服务
mysql和es 对比?
两者都是数据库,都能提供数据的CRUD
mysql是关系型数据库,具有ACID的事务特性能够保证数据的一致性,
不过当数据量大 并发量高时 性能较差 无法应对高效复杂的查询业务
es主要就是为海量数据的实时搜索而设计的,底层采用倒排索引 能够快速的实现
海量数据复杂搜索 ,但不支持事务
所以在我们项目中, mysql用于维护项目中的核心数据
而 es则用于项目中核心数据搜索实现
也可以 用于存储项目中的所有日志信息
java中如何操作es?
es官方提供了java的客户端 ,引入后即可使用
// 1. 引入依赖:<br /> <dependency><br /> <groupId>org.elasticsearch.client</groupId><br /> <artifactId>elasticsearch-rest-high-level-client</artifactId><br /> </dependency><br /> <br /> <br /> // 2. 初始化客户端: <br /> client = new RestHighLevelClient(RestClient.builder(<br /> HttpHost.create("http://192.168.200.130:9200")<br /> ));<br />// 3.1. 先创建请求对象 CreateIndexRequest<br /> CreateIndexRequest request = new CreateIndexRequest("hotel");<br /> // 请求设置参数: 索引库名称 映射json字符串<br /> // 3.2. 调用客户端执行对应得请求 client.indices().create(); client.delete()<br /> CreateIndexResponse response = client.indices().create(request, RequestOptions.DEFAULT);<br /> // 3.3. 解析相应结果<br /> System.out.println(response.isAcknowledged()?"创建成功":"创建失败");
