首先先来了解一个概念,在我们生活中一般来说有两种数据:结构化数据、非结构化数据
结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等。
非结构化数据: 非结构化数据又可称为全文数据,指不定长或无固定格式的数据,如邮件,word文档等。
对于结构化数据我们可以直接从数据库查询,而对于非结构化的数据此时就要用到全文检索的方式查询,比如对一个文档或者网页中的内容文本每个词建立一个索引,把这些非结构化的变成结构化的方式然后来查询。
全文搜索引擎百度百科定义:全文搜索引擎是目前广泛应用的主流搜索引擎。它的工作原理是计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。这个过程类似于通过字典中的检索字表查字的过程。
简单理解:比如像淘宝、京东这种电商网站,商品的数据量很大很大,这些数据若存放在数据库中然后我们搜索是直接去数据库查询这样显然很不合理,因为一是查询慢,二是数据量大放数据库中存储需要空间。所以为了解决查询慢的问题,我们需要全文搜索引擎来去查询这些数据。
在介绍ElasticSearch之前,首先需要先了解lunece
Lucene:是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,lucene提供了查询引擎、索引引擎、部分文本分析引擎。
简单来说,lucene就是为我们开发人员提供了一些全文检索引擎工具包,我们调这些包里的方法就可以去实现全文搜索的功能了。(但其实直接去使用lucene来做也是很麻烦的,所以后面才有了类似solr、elasticsearch等这些搜索引擎)
lucene是迄今为止最先进、性能最好、功能最全的搜索引擎库,但是需要明白lucene只是一个库,lucene是java语言编写的,想要使用它就必须使用java作为开发语言来将其集成到我们的应用中,这就导致了有一定的局限性。再一个lucene非常复杂,如果直接来使用lucene那就需要深入了解它的底层工作原理,显然这个学习和使用成本太大了。
了解完lucene后再来看elasticsearch就很好理解了~
ElasticSearch:Elasticsearch是一个实时分布式搜索和分析引擎(注意,elasticsearch是一个真正的搜索引擎了),elasticsearch底层其实用到的就是lucene,它是对lucene的封装,从而对外留下一套简单的RestFul API,让我们更简单去实现我们所需要的全文搜索的功能。
Solr和Elasticsearch类似,都是基于Lucene的全文搜索引擎,solr的功能相较elasticsearch来说更多更广。
solr对已有的数据查询来说比elasticsearch要快,elasticsearch建立索引(也就是实时查询)比solr要快,因为solr建立索引时会产生io阻塞。
在2016年1月,ElasticSearch已超过Solr等,成为排名第一的搜索引擎类应用。
ElasticSearch是java语言编写的,此次安装的es版本是7.6.1,安装前需要确定jdk的版本最少是1.8以上,且配置好了jdk的环境变量。
官网下载: https://www.elastic.co/products/elasticsearch
es安装好了,我们还需要一个可以查看es信息的图形化界面,不然怎么很直观去看es里面的索引啊文档啊这些信息呢?所以下一步要安装ES的图形化界面插件客户端
这个客户端就是一个基于node.js的一个前端项目(所以前提是一定要安装node.js的环境),从github上下载项目代码即可,
ELK 就是Elasticsearch、Logstash、Kibana,也被称为ElasticStack。Elasticsearch上面已经介绍过了,Logstash是ELK的中央数据流引擎,用于从不同目标(文件/数据存储/MQ)收集的不同格式数据,经过过滤后支持输出到不同目的地(文件/MQ/redis/elasticsearch/kafka等)
Kibana是一个针对ElasticSearch的开源分析及可视化平台,用来搜索、查看交互存储在ElasticSearch索引中的数据。和上面的那个head项目相比,kibana是一个更专业的查看分析数据的平台。
ELK在大数据中用到的比较多,有专业的ELK工程师这个岗位。
由于head项目作为es的图形化管理工具查看起来没有kibana专业,所以我们这里就再安装个kibana来认识一下kibana
上图就是es图形化界面管理工具head项目下的索引查看页面,可以看到一个索引下可以有多个type类型(这个type默认是_doc)。
一个索引默认有5个分片(又称主分片)构成,每个分片会有一个副本(又称复制分片),在es集群中,主分片和复制分片会在不同的节点下,这样有利于一个节点挂掉后数据也不会丢失。一个分片就是一个lucene索引,一个包含倒排索引的目录。
总结:也就是说一个es索引是由多个lucene索引组成的,如无特指,说起索引指的就是es索引
倒排索引的结构使得es在不扫描全部文档的情况下,就能知道哪些文档包含哪些关键字。
ES的操作时基于Resutful风格的请求,Restful是一种软件架构风格,不是标准,只是提供了一组设计规则和约束条件,使用restful可以让我们的请求更加规范更简洁更有层次,更易于实现缓存等机制。(restful是一种风格,我们的软件应该尽可能的都去使用restful这种风格)
- 创建rest请求
- 逻辑编写(查询条件之类的)
- 使用RestHighLevelClient 发送请求,获得相应结果
- 处理相应结果
ES提供了很多API,要去完全记住这些API还是要花点时间的…
该项目测试是先将京东的商品数据读取到es中,然后对数据进行查询。(和上面的api调用差不多,就是多了个pa chong的操作)
Jsoup: 是一款java的html解析器,可直接解析某个url下的html文本内容,它提供了一套非常省力的API,可通过DOM,CSS以及类似于JQuery的操作方法来取出和操作数据。
具体的操作逻辑代码如下:
根据关键词查询,把读取的数据放入es中
数据存进去了,下面就是查询数据了
那为了使我们所查询的关键性高亮,所以要在上面的普通查询的代码中增加高亮的逻辑
高亮效果其实就是在普通查询之前我们要构建高亮的条件,由于返回的结果_soucre标签的内容和高亮的内容是分开的,所以我们需要将高亮内容去替换掉原来的_source里面对应的需高亮的字段。(这个上面也说过)