搜索引擎ElasticSearch入门

前言

最近项目上须要用到搜索引擎,因为以前本身没有了解过,因此整理了一下搜索引擎的相关概念知识。html

正文

想查数据就免不了搜索,搜索就离不开搜索引擎,百度、谷歌都是一个很是庞大复杂的搜索引擎,他们几乎索引了互联网上开放的全部网页和数据。然而对于咱们本身的业务数据来讲,确定就不必用这么复杂的技术了,若是咱们想实现本身的搜索引擎,方便存储和检索,能够快速地储存、搜索和分析海量数据。搜索引擎有不少种,我这里主要讲两种比较流行的搜索引擎框架 Elasticsearch 和 Lucene 搜索引擎。java

1、搜索引擎实现核心

Lucene/Elasticsearch 实现快速搜索的核心就是倒排索引,Lucene/Elasticsearch 就是尽可能将磁盘里的东西搬进内存,减小磁盘随机读取次数(同时也利用磁盘顺序读特性),结合各类压缩算法,高效使用内存,从而达到快速搜索的特性。web

核心概念http://www.javashuo.com/article/p-hmgnyzyg-cd.html算法

http://www.javashuo.com/article/p-cihdqxlb-hk.htmlspring

2、Lucene搜索引擎

百度百科:是 Apache 软件基金会4 Jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包(实际就是一个 Jar 包),但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎。Lucene 是一套信息检索工具包,并不包含搜索引擎系统,它包含了索引结构、读写索引工具、相关性工具、排序等功能,所以在使用 Lucene 时仍须要关注搜索引擎系统,例如数据获取、解析、分词等方面的东西。Lucene 提供了一个简单却强大的应用程式接口,可以作全文索引和搜寻。sql

Lucene,最早进、功能最强大的搜索库,直接基于Lucene开发,很是复杂,Api复杂(实现一些简单的功能,写大量的java代码),须要深刻理解原理(各类索引结构)。Lucene只是一个库。想要使用它,你必须使用Java来做为开发语言并将其直接集成到你的应用中,更糟糕的是,Lucene的配置及使用很是复杂,你须要深刻了解检索的相关知识来理解它是如何工做的。数据库

3、ElasticSearch搜索引擎

百度百科:ElasticSearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful web 接口。Elasticsearch 是用Java语言开发的,并做为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。ElasticSearch 用于云计算中,可以达到实时搜索,稳定,可靠,快速,安装使用方便。数组

ElasticSearch 的实现原理主要分为如下几个步骤,首先用户将数据提交到Elastic Search 数据库中,再经过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据,当用户搜索数据时候,再根据权重将结果排名,打分,再将返回结果呈现给用户。浏览器

Elasticsearch,基于 Lucene,隐藏复杂性,提供简单易用的R estful Api 接口、Java Api 接口(还有其余语言的Api 接口)springboot

  • 分布式的文档存储引擎

  • 分布式的搜索引擎和分析引擎

  • 分布式,支持PB级数据

4、Lucene和ElasticSearch优缺点对比

这两种搜索引擎各自都有本身的特色,如今我来总结一下:

联系:ElasticSearch 封装了 Lucene,让使用变得更简单,ElasticSearch 除了拥有Lucene 全部优势之外,还有本身的优势:

可用性:支持集群没有单点障碍,

扩展性:支持集群扩展-高并发

在集群环境中使用:大项目使用

  • ElasticSearch全文检索服务器,全部项目都统一访问索引服务器,支持在集群环境中使用, Lucene全文检索引擎工具包,必须集成到项目中使用,不支持在集群环境下使用。
  • ElasticSearch支持多种语言,Lucene只支持java
  • ElasticSearch简单,都是http请求,而Lucene复杂,都须要调用API执行一大推操做。
  • 通常Lucene在中小型项目中使用,ElasticSearch都适用(大中小),由于ES支持在集群环 境中使用,而且自身也支持集群。
  • Luncene须要二次开发,才能使用。不能像百度或谷歌同样,它只是提供一个接口须要被实现才能使用。 ElasticSearch直接拿来用。
  • 封装了更多高级的功能,例如聚合分析的功能,基于地理位置的搜索
  • ES自动能够将海量数据分散到多台服务器上去存储和检索

综上所述:搜索引擎选择用 ElasticSearch

5、SpringBoot整合ElasticSearch

SpringBoot 整合 Elasticsearch 经常使用的方式有如下三种:

  • Java API

这种方式基于TCP和ES通讯,官方已经明确表示在ES 7.0版本中将弃用TransportClient客户端,且在8.0版本中彻底移除它,因此不提倡。

  • REST Client

上面的方式1是基于TCP和ES通讯的(并且 TransPort 未来会被抛弃……),官方也给出了基于HTTP的客户端REST Client(推荐使用),官方给出来的REST Client有Java Low Level REST Client和Java Hight Level REST Client两个,前者兼容全部版本的ES,后者是基于前者开发出来的,只暴露了部分API,待完善

  • Spring-Data-Elasticsearch(推荐)

除了上述方式,Spring 也提供了自己基于 SpringData 实现的一套方案Spring-Data-Elasticsearch。为什们推荐这种呢,由于这种方式 Spring 为咱们封装了常见的es操做。和使用 Jpa 操做数据库同样方便。

在ES中一个 Index 能够理解为一个库,Type 就是一张表,一个Index能够对应多个Type,或者一个Index只能对应一个Type(从6.0.0 起就是一对一)。

6、Elasticsearch的安装

从网上把 Elasticsearch 的安装包下载下来以后,直接解压,进入bin目录下,双击执行Elasticsearch.bat,看到Started 说明启动成功,打开浏览器测试一下,输入http://localhost:9200/,则成功。

Elasticsearch-Head插件

Elasticsearch-Head将是一款专门针对于 Elasticsearch 的客户端工具,相似 Mysql 的 Sqlyog 或者 Navicat数据库软件可视化界面。

运行head插件:grunt server

访问:localhost:9100

7、ElasticSearch实现联表查询

SpringBoot整合ElasticSearch+父子查询

相关连接:http://www.javashuo.com/article/p-rrhdvubw-n.html

父子关系的type和映射关系要提早创建好。

这里讲一下三种实现方式:

  • 嵌套查询 Nested Query:文档包含 nested 类型的字段。这些字段用来索引数组对象,其中每一个对象做为独立的文档能够被检索(使用 nested 查询)。

  • 父子查询Has_Child 和 Has_Parent :父子关系能够在一个单独的索引中的两个文档类型间存在。has_child 查询返回了父文档,其子文档匹配了特定的查询。而 has_parent 查询返回子文档,其父文档匹配了特定的查询。(相似于主外键)要点:父子关系元数据映射,用于确保查询时候的高性能,可是有一个限制,就是父子数据必须存在于一个shard中

  • 应用层联接

8、Nested 和 Parent-Child的区别以及使用场景

嵌套查询和父子查询的主要区别

因为存储结构的不一样,Nested 和 Parent-Child 的方式有不一样的应用场景,Nested 全部实体存储在同一个文档,而 Parent-Child 模式得子 Type 和 父Type 存储在不一样的文档里。因此查询效率上 Nested 要高于 Parent-Child,可是更新的时候 Nested 模式下,ElasticSearch 会删除整个文档再建立,而 Parent-Child 只会删除你更新的文档在从新建立,不影响其余文档。因此更新效率上 Parent-Child 要高于 Nested。

嵌套查询和父子查询的具体的使用场景

Nested:在少许子文档,而且不会常常改变的状况下使用。好比:订单里面的产品,一个订单不可能会有成千上万个不一样的产品,通常不会不少,而且一旦下单后,下单的产品是不可更新的。

Parent-Child:在大量文档,而且会常常发生改变的状况下使用。好比:用户的浏览记录,浏览记录会很大,而且会频繁更新

总结

以上就是我关于搜索引擎的相关总结,固然这篇文章只能算是对搜索引擎的一个入门,后面我还会出相关的文章的哦。


公众号:良许Linux

有收获?但愿老铁们来个三连击,给更多的人看到这篇文章