ElasticSearch入门与实战
2018-07-27 本文已影响0人
xialedoucaicai
本文将对ES做一个入门级别的介绍,采用的ES版本为5.5,主要对ES的整个开发流程做一个简单说明,同时会给出实际的代码,建议同时参看瓦力老师的ElasticSearch入门,三者结合,能在最短的时间内实现ES开发。
因为是快速入门+实战,所以就遵循二八原则,只涉及最常用的内容,如果需要更深入,更权威的理解使用ES,请直接移步官方文档。
1.环境准备
对应视频前两章,先简单认识下ES,然后把环境搭起来。
2.重要概念
可以参看上述视频第三章,这里也可以简单说一下,注意对概念的理解很重要,是必须要掌握的。
来看下ES和MySQL的简单类比:
MySQL-> Database -> Table -> Row -> Column
Elasticsearch -> Index -> Type -> Document -> Field
两者操作步骤的类比:
MySQL->建数据库->建表(表字段 字段类型)->对每行数据增删改查
ES->建立Index->建立Mapping(字段 字段类型)->对Document增删改查
其他概念:集群 节点 分片 备份,直接看官方文档吧,这些概念对快速入门影响不大。
3.ES实战
- 搭建SpringBoot+ES环境(视频第6章),这里我们没有使用SpringData的ES组件,直接使用了ES提供的Java客户端。
- 通过Rest API接口,使用Postman发送Json数据建立Index和Mapping(包含Type Field),对应视频第四章。这一步就是对需要参与搜索的字段建立映射,在映射时需要根据字段性质来选择Type。
常用的Type有如下这几个:
- type:keyword 适合结构化内容,比如标签,状态,邮件地址,常用于过滤,排序,聚合,只能通过精确值来查找
- type:text 适合全文本值,比如邮件正文,详细的描述信息等,在索引之前将会被分词,不会参与排序和聚合
- type:date 映射日期格式,具体格式可以选择①自定义 比如yyyy-MM-dd HH:mm:ss②可以使用内置的格式 ③可以使用自1970年0时到现在的毫秒数
- 数组也可以映射成text,比如标签,我们可以有很多标签,在Java中是一个List,ES的type选择text
其他注意事项: - 在建立映射的时候,对于需要分词的Field,还要指明分词器,因为默认的分词器是针对英文的,我们是中文,这里使用了ik分词器
- head插件可以方便的查看ES的数据信息,可以参看视频进行安装
- 增删改Document
假设我们是要做一个搜房网,那么我们需要在添加房源/修改房源/房源被出租时,同步更新ES的Document。将ES的增删改代码放到业务逻辑的增删改之后,我们可以通过ES的Java API来实现,对应视频第四章。 - 查询
对应视频第五章。这部分就是ES的核心内容,就像SQL的查询语句一样,使用很灵活,还有各种优化,作为入门,我们只看最基本,最常用的内容。
基本使用方式,使用布尔查询来嵌套其他查询。
常用的查询有如下这几种:
termQuery,精确匹配,不会对输入条件进行分词,适用于对keyword的查询
matchQuery,对用户输入的查询条件进行分词,只要有其中一个关键词匹配即可,比如输入条件"elasticserach入门" 将会按照elasticsearch 和 入门两个关键词来匹配,适用与对text的查询
multiMatchQuery,matchQuery的升级版,多字段匹配 比如要求标题或内容含有某关键字
rangeQuery,范围查询,比如查询票价在40~80元之间的影片
filter,过滤查询,圈定一个范围,结果只有"是","否"两中可能,就像招聘要求博士学历一样,而query会对查询结果进行评分,就像从博士学历的人中找最适合这个岗位的人选。
查询中其他的常见需求:
聚合查询,进行统计,比如查出周星驰导演的影片数量
分页,排序
高亮展示关键字,就像我们用百度会对关键字标红
对数组查询,比如一个影片有很多标签,只要含有我们输入的标签,就都查出来
时间范围查询,日期还是比纯文本要麻烦一点,从建Mapping,到接收前端的输入条件,到使用API查询,每一步该取什么类型,字符串和日期如何相互转换,都是需要考虑的问题。
整合MQ:
我们的ES对Document的操作是直接放在原有业务逻辑之后的,假设我们ES需要索引的数据不能直接拿到,可能要花点时间,这样就会导致用户操作后需要等待ES的操作结束才能响应。我们可以结合之前学习的RabbitMQ,将ES的操作交给MQ来执行,将业务解耦,提升用户体验。
4.完整代码
完整代码看这里,可以直接下载使用,没有业务逻辑的干扰,是一个基本可以涵盖常用操作的demo。