【搜索引擎:Elasticsearch】从0了解ES,整合springboot,京东搜索实战

Elasticsearch

我们搜做 : 冷环渊,可以看到有关冷环渊的一些信息,

那么这个是怎么做到的呢往常我们都是用

SQL : like %冷环渊% 但是数据量一旦变大了,就会变慢,这个时候用索引, 也是只能快一些

这个时候 Elasticsearch就是帮助我们解决问题的关键人物

他专注于搜索 : 百度,github,淘宝等搜索都能看到他的影子

我们下面会通过以下去完成对es的学习

  1. 认识一个人
  2. 看看同种类的搜索引擎的区别
  3. 安装
  4. 生态圈
  5. IK 分词器
  6. RestFul 操作
  7. RestFul CRUD
  8. SpingBoot 继承 ES(从原理开始分析)
  9. 实战 : 爬虫爬取数据!
  10. 模拟全文检索

以后只要,需要用到搜索,就可以使用ES , 建议基于大数据的情况下

聊聊这个人 Doug Cutting

1998年9月4日,Google公司在美国硅谷成立。正如大家所知,它是一家做搜索引擎起家的公司。

学大数据 首先就是 hadoop

左为Doug Cutting,右为Lucene的LOGO

Lucene是用JAVA写成的,目标是为各种中小型应用软件加入全文检索功能。因为好用而且开源(代码公开),非常受程序员们的欢迎。

早期的时候,这个项目被发布在Doug Cutting的个人 站和SourceForge(一个开源软件 站)。后来,2001年底,Lucene成为Apache软件基金会jakarta项目的一个子项目。

Nutch是一个建立在Lucene核心之上的 页搜索应用程序,可以下载下来直接使用。它在Lucene的基础上加了 络爬虫和一些 页相关的功能,目的就是从一个简单的站内检索推广到全球 络的搜索上,就像Google一样。

Nutch在业界的影响力比Lucene更大。

大批 站采用了Nutch平台,大大降低了技术门槛,使低成本的普通计算机取代高价的Web服务器成为可能。甚至有一段时间,在硅谷有了一股用Nutch低成本创业的潮流。

随着时间的推移,无论是Google还是Nutch,都面临搜索对象“体积”不断增大的问题。

尤其是Google,作为互联 搜索引擎,需要存储大量的 页,并不断优化自己的搜索算法,提升搜索效率。

还是2004年,Google又发表了一篇技术学术论文,介绍自己的MapReduce编程模型。这个编程模型,用于大规模数据集(大于1TB)的并行分析运算。

第二年(2005年),Doug?Cutting又基于MapReduce,在Nutch搜索引擎实现了该功能。

这里要补充说明一下雅虎招安Doug的背景:2004年之前,作为互联 开拓者的雅虎,是使用Google搜索引擎作为自家搜索服务的。在2004年开始,雅虎放弃了Google,开始自己研发搜索引擎。所以。。。

加盟Yahoo之后,Doug?Cutting将NDFS和MapReduce进行了升级改造,并重新命名为Hadoop(NDFS也改名为HDFS,Hadoop Distributed File?System)。

这个,就是后来大名鼎鼎的大数据框架系统——Hadoop的由来。而Doug?Cutting,则被人们称为Hadoop之父

我们继续往下说。

还是2006年,Google又发论文了。

这次,它们介绍了自己的BigTable。这是一种分布式数据存储系统,一种用来处理海量数据的非关系型数据库。

Doug?Cutting当然没有放过,在自己的hadoop系统里面,引入了BigTable,并命名为HBase

2008年1月,Hadoop成功上位,正式成为Apache基金会的顶级项目。

同年2月,Yahoo宣布建成了一个拥有1万个内核的Hadoop集群,并将自己的搜索引擎产品部署在上面。

7月,Hadoop打破世界纪录,成为最快排序1TB数据的系统,用时209秒。

此后,Hadoop便进入了高速发展期,直至现在。

回到主题

Lucene 是一套信息检索工具包,jar包 不好含搜索引擎系统‘

包含 : 索引结构,读写索引工具 排序,搜索规则 。。。 工具类

Lucene 和 ES 的关系:

ES 是居于 Lucene 做了封装和增强 (我们上手就会感到十分的简单)

ElasticSearch概述

Elaticsearch,简称为es, es是一个开源的高扩展分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别(大数据时代)的数据。es也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。

据国际权威的数据库产品评测机构DB Engines的统计,在2016年1月,ElasticSearch已超过Solr等,成为排名第一的搜索引擎类应用。

关键字就是:

  • 实时
  • 分布式
  • 大数据
  • 速度快

ES和solr的差别

架构选择!!!

Elasticsearch简介

Elasticsearch是一个实时分布式搜索和分析引擎。它让你以前所未有的速度处理大数据成为可能。

它用于全文搜索、结构化搜索、分析以及将这三者混合使用:

维基百科使用Elasticsearch提供全文搜索并高亮关键字,以及输入实时搜索(search-asyou-type)和搜索纠错(did-you-mean)等搜索建议功能。

StackOverflow结合全文搜索与地理位置查询,以及more-like-this功能来找到相关的问题和答案。

Github使用Elasticsearch检索1300亿行的代码。

但是Elasticsearch不仅用于大型企业,它还让像DataDog以及Klout这样的创业公司将最初的想法变成可扩展的解决方案。

Elasticsearch可以在你的笔记本上运行,也可以在数以百计的服务器上处理PB级别的数据 。

Elasticsearch是一个基于Apache Lucene?的开源搜索引擎。无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。

但是,Lucene只是一个库。想要使用它,你必须使用Java来作为开发语言并将其直接集成到你的应用中,更糟糕的是,Lucene非常复杂,你需要深入了解检索的相关知识来理解它是如何工作的。

Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。

Solr简介

Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化

Solr可以独立运行,运行在Jetty、Tomcat等这些Servlet容器中,Solr 索引的实现方法很简单,用 POST方法向 Solr 服务器发送一个描述 Field 及其内容的 XML 文档,Solr根据xml文档添加、删除、更新索引。Solr 搜索只需要发送 HTTP GET 请求,然后对 Solr 返回Xml、json等格式的查询结果进行解析,组织页面布局。Solr不提供构建UI的功能,Solr提供了一个管理界面,通过管理界面可以查询Solr的配置和运行情况。

solr是基于lucene开发企业级搜索服务器,实际上就是封装了lucene。

Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的文件,生成索引;也可以通过提出查找请求,并得到返回结果。

Lucene简介

Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。Lucene是一套用于全文检索和搜寻的开源程式库,由Apache软件基金会支持和提供。Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻。在Java开发环境里Lucene是一个成熟的免费开源工具。就其本身而言,Lucene是当前以及最近几年最受欢迎的免费Java信息检索程序库。人们经常提到信息检索程序库,虽然与搜索引擎有关,但不应该将信息检索程序库与搜索引擎相混淆。

Lucene是一个全文检索引擎的架构。那什么是全文搜索引擎/p>

全文搜索引擎是名副其实的搜索引擎,国外具代表性的有Google、Fast/AllTheWeb、AltaVista、Inktomi、Teoma、WiseNut等,国内著名的有百度(Baidu)。它们都是通过从互联 上提取的各个 站的信息(以 页文字为主)而建立的数据库中,检索与用户查询条件匹配的相关记录,然后按一定的排列顺序将结果返回给用户,因此他们是真正的搜索引擎。

2.4 Elasticsearch和Solr比较

2.5 ElasticSearch vs Solr 总结

  1. es基本是开箱即用(解压就可以用 ! ),非常简单。Solr安装略微复杂一丢丢!
  2. Solr 利用 Zookeeper 进行分布式管理,而 Elasticsearch 自身带有分布式协调管理功能。
  3. Solr 支持更多格式的数据,比如JSON、XML、CSV,而 Elasticsearch 仅支持json文件格式。
  4. Solr 官方提供的功能更多,而 Elasticsearch 本身更注重于核心功能,高级功能多有第三方插件提供,例如图形化界面需要kibana友好支撑~!
  5. Solr 查询快,但更新索引时慢(即插入删除慢),用于电商等查询多的应用;
    • ES建立索引快(即查询慢),即实时性查询快,用于facebook新浪等搜索。
    • Solr 是传统搜索应用的有力解决方案,但 Elasticsearch 更适用于新兴的实时搜索应用。
  6. Solr比较成熟,有一个更大,更成熟的用户、开发和贡献者 区,而 Elasticsearch相对开发维护者较少,更新太快,学习使用成本较高。(趋势!)

ElasticSearch 安装

就注意一点,JDK必须不能低于 1.8 最低要求就是1.8

因为是java开发的,所以ES的版本和我们之后对应的java的和jar包的版本必须对应,且要保证JDK环境是正常的

下载

官 地址 :https://www.elastic.co/cn/elasticsearch/

之后解压

查看目录

访问查看

但是发现,迟迟连接不上,这个是为什么跨域问题,端口和端口的访问,于是我们要去配置ES的快去权限开启

之后重启es,连接成功

创建索引查看

这个head就当作我们展示数据的工具

官 :https://www.elastic.co/cn/kibana

安装注意 : klbanna 要和 ES 的版本要一致

启动

开发工具 Post curl head 谷歌插件

之后我们的命令就在这个klbanna里面

之后重启klbanna就可以了

ES核心概念

  1. 索引
  2. 字段类型(mapping)
  3. 文档(documents)

概述

在前面的学习中,我们已经掌握了es是什么,同时也把es的服务已经安装启动,那么es是如何去存储数据,数据结构是什么,又是如何实现搜索的呢们先来聊聊ElasticSearch的相关概念吧!

集群,节点,索引,类型,文档,分片,映射是什么/strong>

一切都是json

elasticsearch是面向文档,关系行数据库 和 elasticsearch 客观的对比!一切都是JSON!

Relational DB Elasticsearch
数据库(database) 索引(indices)
表(tables) types
行(rows) documents
字段(columns) fields

elasticsearch(集群)中可以包含多个索引(数据库),每个索引中可以包含多个类型(表),每个类型下又包含多 个文档(行),每个文档中又包含多个字段(列)。

物理设计:

elasticsearch 在后台把每个索引划分成多个分片,每分分片可以在集群中的不同服务器间迁移

一个人就是一个集群!默认的集群名称就是 elaticsearh

类型是文档的逻辑容器,就像关系型数据库一样,表格是行的容器。 类型中对于字段的定义称为映射,比如 name 映 射为字符串类型。 我们说文档是无模式的,它们不需要拥有映射中所定义的所有字段,比如新增一个字段,那么elasticsearch是怎么做的呢lasticsearch会自动的将新字段加入映射,但是这个字段的不确定它是什么类型,elasticsearch就开始猜,如果这个值是18,那么elasticsearch会认为它是整形。 但是elasticsearch也可能猜不对, 所以最安全的方式就是提前定义好所需要的映射,这点跟关系型数据库殊途同归了,先定义好字段,然后再使用,别 整什么幺蛾子。

索引

就是数据库!

索引是映射类型的容器,elasticsearch中的索引是一个非常大的文档集合。索引存储了映射类型的字段和其他设置。 然后它们被存储到了各个分片上了。 我们来研究下分片是如何工作的。

物理设计 :节点和分片 如何工作

上图是一个有3个节点的集群,可以看到主分片和对应的复制分片都不会在同一个节点内,这样有利于某个节点挂掉 了,数据也不至于丢失。 实际上,一个分片是一个Lucene索引,一个包含倒排索引的文件目录,倒排索引的结构使 得elasticsearch在不扫描全部文档的情况下,就能告诉你哪些文档包含特定的关键字。 不过,等等,倒排索引是什 么鬼/p>

倒排索引

elasticsearch使用的是一种称为倒排索引的结构,采用Lucene倒排索作为底层。这种结构适用于快速的全文搜索, 一个索引由文档中所有不重复的列表构成,对于每一个词,都有一个包含它的文档列表。 例如,现在有两个文档, 每个文档包含如下内容:

为了创建倒排索引,我们首先要将每个文档拆分成独立的词(或称为词条或者tokens),然后创建一个包含所有不重 复的词条的排序列表,然后列出每个词条出现在哪个文档 :

term doc_1 doc_2
Study x
To x x
every
forever
day
study x
good
every
to x
up

现在,我们试图搜索 to forever,只需要查看包含每个词条的文档 score

term doc_1 doc_2
to ×
forever
total 2 1

两个文档都匹配,但是第一个文档比第二个匹配程度更高。如果没有别的条件,现在,这两个包含关键字的文档都将返回。

再来看一个示例,比如我们通过博客标签来搜索博客文章。那么倒排索引列表就是这样的一个结构 :

  • 重启观察ES,可以看到ik分词器被加载了!

  • 使用kibana测试!

  • 查看不同的分词效果

    其中 ik_smart 为最少切分

    我们输入 超级喜欢狂神说Java

    重启es,看细节!

    Rest风格说明

    一种软件架构风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

    基本Rest命令说明:

    method url地址 描述
    PUT localhost:9200/索引名称/类型名称/文档id 创建文档(指定文档id)
    POST localhost:9200/索引名称/类型名称 创建文档(随机文档id)
    POST localhost:9200/索引名称/类型名称/文档id/_update 修改文档
    DELETE localhost:9200/索引名称/类型名称/文档id 删除文档
    GET localhost:9200/索引名称/类型名称/文档id 查询文档通过文档id
    POST localhost:9200/索引名称/类型名称/_search 查询所有数据

    关于索引的基本操作

    创建一个索引!

    那么 name 这个字段用不用指定类型呢。毕竟我们关系型数据库 是需要指定类型的啊 !

    • 字符串类型
      text 、 keyword
    • 数值类型
      long, integer, short, byte, double, float, half_float, scaled_float
    • 日期类型
      date
    • 布尔值类型
      boolean
    • 二进制类型
      binary
    • 等等…

    指定字段的类型

    查看默认的信息

    如果自己的文档字段没有指定,那么es 就会给我们默认配置字段类型!

    扩展: 通过命令 elasticsearch 索引情况! 通过get _cat/ 可以获得es的当前的很多信息!

    现在的方法!

    获取数据 GET

    Post _update , 推荐使用这种更新方式!

    声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

    上一篇 2022年3月11日
    下一篇 2022年3月11日

    相关推荐