【大数据】Elastic Search入门,看这一篇就够了!
前言:Elastics Search(以后全部简称es)入门看这一篇就够了?是的,看这一篇就可以学习到es从入门到使用到生产的相关核心点,但Es家族庞大,如果深入学习或者去啃的话,没个一年半载是不可能的,所以仅这一篇也是在开玩笑了,光是Elastics Search + Logstash + Kibana (以后全部简称ELK)技术栈就有的学了,里面还涉及到这三大神器的很多插件及监控工具,一言难尽
前言:Elastics Search(以后全部简称es)入门看这一篇就够了?是的,看这一篇就可以学习到es从入门到使用到生产的相关核心点,但Es家族庞大,如果深入学习或者去啃的话,没个一年半载是不可能的,所以仅这一篇也是在开玩笑了,光是Elastics Search + Logstash + Kibana (以后全部简称ELK)技术栈就有的学了,里面还涉及到这三大神器的很多插件及监控工具,一言难尽,不过也不必慌,我也没打算在ELK上花太多时间,如果仅作为上手开发和基础的原理掌握,搞定ELK数周内即可.本篇可以作为学习es家族的索引或是目录,顺着这条线学习,一篇即可,否则思路会过于混乱.标题下没内容的部分不要问,问就是暂时没写完!
目录
1.基础部分
1.1什么是es?
Es是一款开源的搜索服务器,底层技术用的仍是Lucene,Es和Solr都是在Luncene上进一步的封装,根据DB-Engines的排名显示,目前市场上搜索引擎的受欢迎度Es排第一,其次是solr,lucene.Es具有开源,分布式,Restful,Json响应等多种天然优势,受到各大企业青睐,这也是我把es作为主要学习的搜索引擎的原因.关于solr和lunce简单了解即可.
Lucene 简介:https://blog.csdn.net/lovexiaotaozi/article/details/103125034
Solr 简介:https://blog.csdn.net/lovexiaotaozi/article/details/103368154
1.2什么是logstash?
logstash是es家族提供的一款日志收集管道,可以定义数据源的输入和输出,数据的输入源可以是多种,支持同时从关系型数据库及非关系型数据库实时采集,如下图所示,至于采集到的数据最终输出到哪,用户可以自己定义,一般会输出到es进行存储,便于检索及分析。
1.3什么是kinaba?
kinaba是为 Elasticsearch设计的开源分析和可视化平台,可以用来查询,监控,分析,简而言之就是一款数据可视化的利器。
1.4ELK安装及启动
1.4.1Es安装及启动
①下载:https://www.elastic.co/cn/downloads/elasticsearch 根据自己环境及要求选择版本和包类型,因为公司电脑原因,我这里以win64为例,所以版本均选择一个中间的稳定版演示:6.8.5 (下面也这个版本,不再赘述)
②安装:其实都是绿色版,解压即可用,将下载后的压缩包解压即可。
③启动:进入解压后的安装目录,按下shift+鼠标右键->在此处打开命令窗口->./bin/elasticsearch.bat->敲下回车:
当你看到下面这句就是成功了,可以在浏览器打开访问 http://127.0.0.1:9200验证
1.4.2Logstash安装及启动
①下载:https://www.elastic.co/cn/downloads/logstash
②安装:解压即可
③启动:在解压后的config目录下找到logstash-sample.conf,然后把里面的配置内容稍作修改(置空):
input {
stdin {}
}
output {
stdout {}
}
然后在解压后的目录下shift+鼠标右键->在此处打开命令窗口->键入 ./bin/logstash.bat -f ../config/logstash-sample.conf
启动成功后可以在浏览器输入:http://localhost:9600/ 进行验证。(更多配置及使用我会在接下来用到时提到,这里能启动即可)
1.4.3Kibana安装及启动
①下载:https://www.elastic.co/cn/downloads/kibana
②安装:解压即可
③启动:进入bin目录,双击kibana.bat 敲几下回车静候即可,看到下面这句即说明已启动:
打开浏览器输入该地址访问即可完成验证。
1.5Es常用插件
1.5.1 Elasticsearch-head
Elasticsearch-head是一款用来浏览、与Elastic Search簇进行交互的web前端展示插件,简单来说,就是一款可以在浏览器方便你直接通过图形化界面操作es的工具。
下载地址:https://github.com/mobz/elasticsearch-head
下载后可以通过nodejs或者docker容器启动,具体请参考github文档,我不再赘述。
补充一句,如果你的插件无法与es连接,可以在你的es解压目录下的config文件夹中找到elasticsearch.yml 加入如下配置:
#-----------------------------------插件支持(es-head)----------------------------
# 是否支持跨域
http.cors.enabled: true
# *表示支持所有域名
http.cors.allow-origin: "*"
然后重启es,启动ok后重写连接即可。
1.5.2 Marvel
Marvel是Elasticsearch的管理和监控工具,作用可以类比spring-cloud的turbine.集群中必须每个节点都安装此插件。
公司电脑原因我暂时无法集群,这块先跳过,后补。
1.5.3 Graph
Graph插件一个新的用于 Elasticsearch 和 Kibana 的插件,通过它们您可以很方便的发现、理解和探索现有数据之间的关系。
环境原因,后补。
1.5.4 IK中文分词器
学过Lucene或者solr的应该对IK中文分词器比较熟悉了,是一款对中文分词友好支撑的插件。
2.进阶部分
2.1数据同步
2.1.1与关系型数据库同步
这里我仅以最常用的MySQL为例,演示将MySQL作为数据的输入端,将es作为数据的输出端,通过logstash来打通数据的输入和输出。
①进入logstash解压后的目录->进入config文件夹->编辑logstash-sample.conf->输入如下内容:
input {
stdin{
}
jdbc {
# mysql jdbc connection string to our backup databse 后面的test对应mysql中的test数据库
jdbc_connection_string => "jdbc:mysql://localhost:3306/costa-spider"
# the user we wish to excute our statement as
jdbc_user => "root"
jdbc_password => "123456"
# the path to our downloaded jdbc driver
jdbc_driver_library => "../lib/mysql-connector-java-5.1.47.jar"
# the name of the driver class for mysql
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_paging_enabled => "true"
jdbc_page_size => "50000"
#以下对应着要执行的sql的绝对路径。
statement => "SELECT * FROM main_material"
#定时字段 各字段含义(由左至右)分、时、天、月、年,全部为*默认含义为每分钟都更新(测试结果,不同的话请留言指出)
schedule => "* * * * *"
#设定ES索引类型
}
}
output {
elasticsearch {
hosts => "127.0.0.1:9200"
index => "main_material"
document_id => "%{id}"
}
stdout {
#以JSON格式输出
codec => json_lines
}
}
tips1:jdbc_connection_string,指明你要连接的数据库的url及端口号和库名。
tips2:jdbc_driver_liblary,需要指明mysql的jdbc驱动文件路径,这里mysql-connector-java需要自己去mvn仓库下载。
tips3: statement 这里可以指定你要把哪张表里的数据导入到es,以及是否实时同步跟新等,我这里仅演示最基础的,不触发更新.
tips4:index 名字可以随意取,对应的其实是es里的库名,在之后搜索时需要用到,我这里保持与MySQL库名一致.
tip5:document_id 文档的id,我这里与数据库里的id一一对应,以%{id}来表示即可.
②重启logstash,观察数据是否被导入,通过logstash的命令行观察到select * from *** 以及导入的数据会被打印出来基本可以确定数据是否已被导入.
③打卡head插件页面,通过查询验证一下:
可以发现数据已被成功从MySQL导入至ES中。
2.1.2与非关系型数据库同步
2.1.3与消息中间件同步
2.2数据检索
关于Es数据检索,有非常多的内容,我这里不做演示,仅总结一下,以便在不同的场景下可以找到技术上的解决方案。也会在实战部分结合Sringdata-es演示几个最常用的检索。
Es支持:
全文检索:顾名思义,就是在被搜索文档的全文(全字段)中寻找与搜索内容相匹配的内容。
DSL检索:其实就是以Json格式的es语法进行检索,可以对检索结果加高亮,偏移,分页等功能。
多字段检索 (Multi-field Search):可以针对多个指定的字段进行检索,在这些指定字段中,如果有命中被搜索内容的,会被加入查询结果。
Boosting提升某字段得分的检索:可以帮助实现针对某一字段的得分权重更高,比如我想搜索文章标题中包含“头秃”的文章排序最靠前,文章内容中包含“头秃“的文章排序次之,就可以通过boosting查询获得。
Bool检索:可以使用类似AND / OR / NOT运算符来帮助检索,类似在Mysql中where xxx = ? and xxx != ?
Fuzzy模糊检索:不需要精确匹配搜索内容,只需要部分匹配即可,比如用户本来想搜索beautiful girl,但一不小心打成了beautfoful girl,这种情况仍可以通过模糊检索给用户返回正确的搜索内容。
Wildcard Query 通配符检索:这个就比较熟悉了,类似于Mysql的like %..%这种搜索。
正则表达式检索:正则表达式应该都很熟悉了,这种搜索模式可以通过正则表达式来匹配被搜索内容。
匹配短语检索:匹配短语查询要求查询字符串中的所有词都存在于文档中,对词组在文章中出现的顺序有较高要求,默认与被搜索短语顺序一致,但可以手动指定偏离值。
匹配词组前缀检索:相当于宽泛或自动的匹配短语检索,对单词的顺序和位置没有严格要求,但对性能消耗比较大。
字符串检索 (Query String):可以实现上面提到的几乎全部检索方式,查询语法要遵循es的查询语法,不同的是以一个字符串参数作为查询入参。
简化的字符串检索 (Simple Query String):简化版的字符串查检索,更适合用于暴露给用户的单个搜索框。
Term/Terms检索(指定字段检索):Term搜索是针对结构化数据的,对结构化数据的指定字段进行搜索,在其中找到完全匹配的结果并返回。
Term排序检索-(Term Query - Sorted):Term查询和其他查询一样,轻松的实现排序。多级排序也是允许的。
范围检索(Range query):也是针对结构化数据的检索,比如我要检索出文档中所有创建日期处于某一指定日期之内的数据。
Function 得分:Field值因子( Function Score: Field Value Factor),可以将指定字段纳入得分计算的结果中,从而实现一些特殊功能,比如:想把用户评价最高的商品排在最前面。
Function 得分:衰减函数( Function Score: Decay Functions ):功能跟上面的Field Value Factor相反,得分是根据某一字段的值降低,比如差评的商品排后面,可以借助此功能实现。
Function得分:脚本得分( Function Score: Script Scoring ):得分可以用指定的脚本计算,比如Groovy脚本编写的脚本。
2.3数据聚合
Es提供了强大的数据聚合功能,数据聚合功能赋予了es强大的大数据统计能力,通过数据聚合,我们可以做一些分析和统计工作,这块内容比较类似Mysql的count,group by,order by ,distinct等。这里我依旧不演示,因为通过crul这种方式代码量比较重,个人还是更喜欢用Spring造好的轮子去操作,把核心放在业务上,在实战部分会有相应演示。
3.实战部分
3.1Es与SpringData结合实战
这里主要简单演示集成方法和简单的CRUD操作,具体的操作我甚至不太想演示,因为springdata十分强大,足够简单,只要你用过JPA就可以直接上手,操作起来和JPA没啥两样,而且官方文档也很给力,只要你有一点英文基础,参照官方文档基本上可以轻松上手.
关于实战其实是最无聊的一部分,强烈建议阅读spring官方文档,参照文档,不要为了贪图一时之快选择网上杂七杂八的教程,这样是学不到东西的,Spring的东西更新极快,参照网上教程虽然简单,但版本一换指不定你就掉哪个坑里了.
凡是不懂不要问百度,问就问 https://spring.io
官方文档:https://docs.spring.io/spring-data/elasticsearch/docs/3.2.5.RELEASE/reference/html/
①引入依赖:spring-boot-starter-data-elasticsearch (本篇采用截止2020-3月最新的版本:3.2.5.RELEASE)
②配置连接方式:这里我选最新的连接配置方式,原因是据说原来的EsTemplate性能不咋滴,于是spring官方重新升级了一套高级的Rest API,看名字都可以看出来...
@Configuration
public class EsConf extends AbstractElasticsearchConfiguration {
@Override
public RestHighLevelClient elasticsearchClient() {
return RestClients.create(ClientConfiguration.localhost()).rest();
}
// no special bean creation needed
// use the ElasticsearchEntityMapper
@Bean
@Override
public EntityMapper entityMapper() {
ElasticsearchEntityMapper entityMapper = new ElasticsearchEntityMapper(elasticsearchMappingContext(),
new DefaultConversionService());
entityMapper.setConversions(elasticsearchCustomConversions());
return entityMapper;
}
}
③创建实体对象,可以理解为传统关系型数据库中的Model:
@Data
@Document(indexName = "item", type = "docs")
public class Item {
@Id
private Long id;
@Field(type = FieldType.Text, analyzer = "ik_max_word")
private String title;// 标题
@Field(type = FieldType.Keyword)
private String brand; // 品牌
@Field(type = FieldType.Double)
private Double price; // 价格
}
④创建Repository接口,可以理解为传统数据库中的DAO层:
只要命名遵循spring提供的namespace命名规范,就可以直接使用spring封装好的语句,无需自己再去写查询语句,非常方便了,和JPA一毛一样:
public interface ItemRepository extends Repository<Item, Long> {
List<Item> findByTitleAndPrice(String title, Double price);
List<Item> findAllByPrice(Double price);
Boolean deleteItemByTitle(String title);
}
⑤测试CRUD
@RunWith(SpringRunner.class)
@SpringBootTest(classes = EsSpringBootApplication.class)
public class CrudTest {
@Resource
ElasticsearchOperations operations;
@Resource
private ItemRepository repository;
@Test
public void crud(){
//新增
IndexQuery query = new IndexQueryBuilder()
.withId(item.getId().toString())
.withObject(item)
.build();
String documentId = operations.index(query);
System.out.println("新增成功,Id是:" + documentId);
//查询
List<Item> items = repository.findByTitleAndPrice("aa", 6.64);
System.out.println(items);
//删除
boolean deleted = repository.deleteItemByTitle("bb");
System.out.println("删除状态:"+deleted);
//更新
UpdateRequest request = new UpdateRequest();
//...
UpdateQuery updateQuery = new UpdateQueryBuilder()
.withId(item.getId().toString())
.withIndexName("item")
.withType("docs")
.withUpdateRequest(request)
.build();
operations.update(updateQuery);
}
其中增删查都比较简单,直接利用Repository提供的namespace方法匹配就可以轻松实现,更新稍微复杂一点,需要用到ElasticsearchOperations,在老版本里是ElasticsearchTemplate,因为性能问题已经不建议使用了.
这个类的使用在官方的文档里并没详细教程,所以值得注意一下.
3.2Es全文搜索项目实战
目前暂时没有项目,所以这块暂时跳过不写。
4.升华部分
4.1Es架构设计
Es采用了经典的分布式架构,采用主从模式进行数据的读写,跟zookeeper类似,在对临界数据的读写上,采用乐观锁机制防止数据被误修改,详情可以参阅这篇,个人觉得写得不错:
https://www.jianshu.com/p/5b1e8d610fea
4.2Es性能优化
性能测试工具:esrally
①分片大小:官方建议20-40G,并没有固定值,具体还得看业务场景和硬件条件.
②如果是基于时间的数据流,比如通过网络爬虫实时爬取的数据,可以在建索引时基于时间建立,方便维护.
③可以调整分片数,参照此公式:所需做大节点数=分片数*(副本数+1)https://www.elastic.co/guide/en/elasticsearch/reference/master/tune-for-search-speed.html
完整优化可参考:https://blog.csdn.net/laoyang360/article/details/97695931
4.3Es监控
Es监控可以用X-Pack,可以提供登陆安全防控,实时监控,可视化报告等功能。
5.总结
Es应该是目前市场上最主流的开源搜索引擎,对比完lucene,solr发现确实如此,而且es的生态也更加丰富,在大数据方向,elk几乎是必学必会的技能,国内外大厂也都有基于es的应用,所以没啥好说的,就两个字:牛逼!持续学就完了。
最后:如果你要深入学习Es,特别推荐一篇包罗万象的博客:https://blog.csdn.net/laoyang360/article/details/52244917
GitHub:https://github.com/elastic/elasticsearch
ES中文网,Es下载,中文文档等:https://www.elastic.co/cn/
有问题可以上Es中文社区:https://elasticsearch.cn/
如果本篇有帮助到你别忘了点个赞,文中若有任何不正之处也欢迎留言斧正,谢谢~
更多推荐
所有评论(0)