搜索引擎ElasticSearch入门
前言
最近项目上需要用到搜索引擎,由于之前自己没有了解过,所以整理了一下搜索引擎的相关概念知识。
正文
想查数据就免不了搜索,搜索就离不开搜索引擎,百度、谷歌都是一个非常庞大复杂的搜索引擎,他们几乎索引了互联网上开放的所有网页和数据。然而对于我们自己的业务数据来说,肯定就没必要用这么复杂的技术了,如果我们想实现自己的搜索引擎,方便存储和检索,可以快速地储存、搜索和分析海量数据。搜索引擎有很多种,我这里主要讲两种比较流行的搜索引擎框架 Elasticsearch 和 Lucene 搜索引擎。
一、搜索引擎实现核心
Lucene/Elasticsearch 实现快速搜索的核心就是倒排索引,Lucene/Elasticsearch 就是尽量将磁盘里的东西搬进内存,减少磁盘随机读取次数(同时也利用磁盘顺序读特性),结合各种压缩算法,高效使用内存,从而达到快速搜索的特性。
核心概念:https://www.cnblogs.com/valor-xh/p/6206042.html
https://blog.csdn.net/sinat_42338962/article/details/85227902
二、Lucene搜索引擎
百度百科:是 Apache 软件基金会4 Jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包(实际就是一个 Jar 包),但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎。Lucene 是一套信息检索工具包,并不包含搜索引擎系统,它包含了索引结构、读写索引工具、相关性工具、排序等功能,因此在使用 Lucene 时仍需要关注搜索引擎系统,例如数据获取、解析、分词等方面的东西。Lucene 提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻。
Lucene,最先进、功能最强大的搜索库,直接基于Lucene开发,非常复杂,Api复杂(实现一些简单的功能,写大量的java代码),需要深入理解原理(各种索引结构)。Lucene只是一个库。想要使用它,你必须使用Java来作为开发语言并将其直接集成到你的应用中,更糟糕的是,Lucene的配置及使用非常复杂,你需要深入了解检索的相关知识来理解它是如何工作的。
三、ElasticSearch搜索引擎
百度百科:ElasticSearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful web 接口。Elasticsearch 是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。ElasticSearch 用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
ElasticSearch 的实现原理主要分为以下几个步骤,首先用户将数据提交到Elastic Search 数据库中,再通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据,当用户搜索数据时候,再根据权重将结果排名,打分,再将返回结果呈现给用户。
Elasticsearch,基于 Lucene,隐藏复杂性,提供简单易用的R estful Api 接口、Java Api 接口(还有其他语言的Api 接口)
分布式的文档存储引擎
分布式的搜索引擎和分析引擎
分布式,支持PB级数据
四、Lucene和ElasticSearch优缺点对比
这两种搜索引擎各自都有自己的特点,现在我来总结一下:
联系:ElasticSearch 封装了 Lucene,让使用变得更简单,ElasticSearch 除了拥有Lucene 所有优点以外,还有自己的优点:
可用性:支持集群没有单点障碍,
扩展性:支持集群扩展-高并发
在集群环境中使用:大项目使用
- ElasticSearch全文检索服务器,所有项目都统一访问索引服务器,支持在集群环境中使用, Lucene全文检索引擎工具包,必须集成到项目中使用,不支持在集群环境下使用。
- ElasticSearch支持多种语言,Lucene只支持java
- ElasticSearch简单,都是http请求,而Lucene复杂,都需要调用API执行一大推操作。
- 一般Lucene在中小型项目中使用,ElasticSearch都适用(大中小),因为ES支持在集群环 境中使用,并且自身也支持集群。
- Luncene需要二次开发,才能使用。不能像百度或谷歌一样,它只是提供一个接口需要被实现才能使用。 ElasticSearch直接拿来用。
- 封装了更多高级的功能,例如聚合分析的功能,基于地理位置的搜索
- ES自动可以将海量数据分散到多台服务器上去存储和检索
综上所述:搜索引擎选择用 ElasticSearch
五、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 起就是一对一)。
六、Elasticsearch的安装
从网上把 Elasticsearch 的安装包下载下来之后,直接解压,进入bin目录下,双击执行Elasticsearch.bat,看到Started 说明启动成功,打开浏览器测试一下,输入http://localhost:9200/,则成功。
Elasticsearch-Head插件
Elasticsearch-Head将是一款专门针对于 Elasticsearch 的客户端工具,类似 Mysql 的 Sqlyog 或者 Navicat数据库软件可视化界面。
运行head插件:grunt server
访问:localhost:9100
七、ElasticSearch实现联表查询
SpringBoot整合ElasticSearch+父子查询
相关链接:https://blog.csdn.net/a_lllk/article/details/83409880
父子关系的type和映射关系要提前建立好。
这里讲一下三种实现方式:
嵌套查询 Nested Query:文档包含 nested 类型的字段。这些字段用来索引数组对象,其中每个对象作为独立的文档可以被检索(使用 nested 查询)。
父子查询Has_Child 和 Has_Parent :父子关系可以在一个单独的索引中的两个文档类型间存在。has_child 查询返回了父文档,其子文档匹配了特定的查询。而 has_parent 查询返回子文档,其父文档匹配了特定的查询。(类似于主外键)要点:父子关系元数据映射,用于确保查询时候的高性能,但是有一个限制,就是父子数据必须存在于一个shard中
应用层联接。
八、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
有收获?希望老铁们来个三连击,给更多的人看到这篇文章
搜索引擎ElasticSearch入门的更多相关文章
- 全文搜索引擎Elasticsearch入门实践
全文搜索引擎Elasticsearch入门实践 感谢阮一峰的网络日志全文搜索引擎 Elasticsearch 入门教程 安装 首先需要依赖Java环境.Elasticsearch官网https://w ...
- 全文搜索引擎 Elasticsearch 入门
1. 百科 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java开发的,并作 ...
- 全文搜索引擎 Elasticsearch 入门教程
全文搜索属于最常见的需求,开源的 Elasticsearch (以下简称 Elastic)是目前全文搜索引擎的首选. 它可以快速地储存.搜索和分析海量数据.维基百科.Stack Overflow.Gi ...
- 全文搜索引擎 Elasticsearch 入门:集群搭建
本文主要介绍什么是 ElasticSearch 以及为什么需要它,如何在本机安装部署 ElasticSearch 实例,同时会演示安装 ElasticSearch 插件,以及如何在本地部署多实例集群, ...
- ElasticSearch入门 附.Net Core例子
1.什么是ElasticSearch? Elasticsearch是基于Lucene的搜索引擎.它提供了一个分布式,支持多租户的全文搜索引擎,它具有HTTP Web界面和无模式JSON文档. Elas ...
- Net Core ElasticSearch入门
ElasticSearch入门 附.Net Core例子 https://www.cnblogs.com/CoderAyu/p/9564977.html 1.什么是ElasticSearch? Ela ...
- Elasticsearch 入门,基本概念和操作
基本概念 Node 与 Cluster Elastic 本质上是一个分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个 Elastic 实例. 单个 Elastic 实例称为一个节点(nod ...
- ElasticSearch入门-搜索如此简单
搜索引擎我也不是很熟悉,但是数据库还是比较了解.可以把搜索理解为数据库的like功能的替代品.因为like有以下几点不足: 第一.like的效率不行,在使用like时,一般都用不到索引,除非使用前缀匹 ...
- ElasticSearch入门知识扫盲
ElasticSearch 入门介绍 tags: 第三方 lucene [toc] 1. what Elastic Search(ES)是什么 全文检索和lucene 全文检索 优点:高效,准确,分词 ...
随机推荐
- Java中的集合(四)PriorityQueue常用方法
Java中的集合(四)PriorityQueue常用方法 PriorityQueue的基本概念等都在上一篇已说明,感兴趣的可以点击 Java中的集合(三)继承Collection的Queue接口 查看 ...
- 用Python做词云可视化带你分析海贼王、火影和死神三大经典动漫
对于动漫爱好者来说,海贼王.火影.死神三大动漫神作你肯定肯定不陌生了.小编身边很多的同事仍然深爱着这些经典神作,可见"中毒"至深.今天小编利用Python大法带大家分析一下这些神作 ...
- PAT1080 MOOC期终成绩 (25分) ——同样参考了柳婼大神的代码及思路,在自己的代码上做了修改,还是很复杂
1080 MOOC期终成绩 (25分) 对于在中国大学MOOC(http://www.icourse163.org/ )学习“数据结构”课程的学生,想要获得一张合格证书,必须首先获得不少于200分 ...
- Scala - 语言专家 - Desugar Scala code
https://mp.weixin.qq.com/s/zwrG1MfUzXwtik7jotpQsA 介绍Intellij IDEA中的一个去除Scala语法糖的功能. 1. 去除 ...
- RocketMQ系列(一)基本概念
RocketMQ是阿里出品的一款开源的消息中间件,让其声名大噪的就是它的事务消息的功能.在企业中,消息中间件选择使用RocketMQ的还是挺多的,这一系列的文章都是针对RocketMQ的,咱们先从Ro ...
- Java实现 LeetCode 704 二分查找(二分法)
704. 二分查找 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1. 示例 1 ...
- Java实现 基础算法 求100以内的质数
public class 求质数 { public static void main(String[] args) { for (int i = 2; i < 100; i++) { int t ...
- java实现排座位
** 排座位** 要安排:3个A国人,3个B国人,3个C国人坐成一排. 要求不能使连续的3个人是同一个国籍. 求所有不同方案的总数? 参考答案: 283824 public class Main1 { ...
- 【Vue】axios封装,更好的管理api接口和使用
在现在的前端开发中,前后端分离开发比较主流,所以在封装方法和模块化上也是非常需要掌握的一门技巧.而axios的封装也是非常的多,下面的封装其实跟百度上搜出来的axios封装或者axios二次封装区别不 ...
- BigDecimal的setScale常用方法(ROUND_UP、ROUND_DOWN、ROUND_HALF_UP、ROUND_HALF_DOWN)
BigDecimal的setScale四大常用方法总结 // 设置小数点后第三位数字一大一小观察效果BigDecimal num = new BigDecimal("3.3235667&qu ...