ElasticSearch学习笔记(一)

ElasticSearch学习

环境准备

  • JDK 1.8
  • Node.js

相关文件

(Windows 练习的话,使用 6.2.2 版本较为稳定, 否则 Kibana 可能会遇到一些启动报错问题)

资源地址:csdn下载
百度云链接:百度网盘下载
提取码:1234

资源包括:

  • Elasticsearch 6.2.2
  • Kibana 6.2.2
  • IK分词器 6.2.2

Elasticsearch-head :暂未遇到版本适配问题,可自行搜索下载。

Doug Cutting

image-20220427224320842

无独有偶,一位名叫Doug Cutting的美国工程师,也迷上了搜索引擎。

他做了一个用于文本搜索的函数库(姑且理解为软件的功能组件),命名为Lucene

image-20220427224406709

2004年,Doug Cutting再接再励,在Lucene的基础上,和Apache开源伙伴Mike Cafarella合作,开发了一款可以代替当时的主流搜索的开源搜索引擎,命名为Nutch

Nutch是一个建立在Lucene核心之上的网页搜索应用程序,可以下载下来直接使用。

它在Lucene的基础上加了网络爬虫和一些网页相关的功能,目的就是从一个简单的站内检索推广到全球网络的搜索上,就像Google一样。

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

大批网站采用了Nutch平台,大大降低了技术门槛,使低成本的普通计算机取代高价的Web服务器成为可能。

甚至有一段时间,在硅谷有了一股用Nutch低成本创业的潮流。

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

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

image-20220427224647611

还是2004年,Google又发表了一篇技术学术论文,介绍自己的MapReduce编程模型。

这个编程模型,用于大规模数据集(大于1TB)的并行分析运算。

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

image-20220427224744201

加盟Yahoo之后,Doug Cutting将NDFS和MapReduce进行了升级改造,并重新命名为

Hadoop(NDFS也改名为HDFS,Hadoop Distributed File System)。

这个,就是后来大名鼎鼎的大数据框架系统——Hadoop的由来。

而Doug Cutting,则被人们称为

Hadoop之父

image-20220427224825773

我们继续往下说。

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

这次,它们介绍了自己的BigTable

这是一种分布式数据存储系统,一种用来处理海量数据的非关系型数据库

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

image-20220427224904671

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

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

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

回到主题

  • Lucene是一套信息检索工具包,并不包含搜索引擎系统,

  • 它包含了索引结构、读写索引工具、相关性工具、排序等功能,

  • 因此在使用Lucene时仍需要关注搜索引擎系统,例如数据获取、解析、分词等方面的东西

  • 为什么要给大家介绍下Lucene呢,因为 solr 和 elasticsearch

  • 都是基于该工具包做的一些封装和增强罢了

ElasticSearch概述

  • Elaticsearch,简称为es,

  • es是一个开源高扩展分布式全文检索引擎,它可以近乎实时的存储、检索数据;

  • 本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。

  • es也使用Java开发,并使用 Lucene作为其核心来实现所有索引和搜索的功能,

  • 但是它的目的是通过简单的 RESTful API 来隐藏 Lucene 的复杂性,从而让全文搜索变得简单。

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

历史

多年前,一个叫做Shay Banon的刚结婚不久的失业开发者,由于妻子要去伦敦学习厨师,他便跟着也去了。在他找工作的过程中,为了给妻子构建一个食谱的搜索引擎,他开始构建一个早期版本的Lucene。

直接基于Lucene工作会比较困难,所以Shay开始抽象Lucene代码以便Java程序员可以在应用中添加搜索功能。他发布了他的第一个开源项目,叫做“Compass”。

后来Shay找到一份工作,这份工作处在高性能和内存数据网格的分布式环境中,因此高性能的、实时 的、分布式的搜索引擎也是理所当然需要的。然后他决定重写Compass库使其成为一个独立的服务叫做 Elasticsearch。

第一个公开版本出现在2010年2月,在那之后Elasticsearch已经成为Github上最受欢迎的项目之一,代码贡献者超过300人。一家主营Elasticsearch的公司就此成立,他们一边提供商业支持一边开发新功

能,不过Elasticsearch将永远开源且对所有人可用。

Shay的妻子依旧等待着她的食谱搜索……

谁在使用:

1、维基百科,类似百度百科,全文检索,高亮,搜索推荐

2、The Guardian(国外新闻网站),类似搜狐新闻,用户行为日志(点击,浏览,收藏,评论)+社交网络数据(对某某新闻的相关看法),数据分析,给到每篇新闻文章的作者,让他知道他的文章的公众反馈(好,坏,热门,垃圾,鄙视,崇拜)

3、Stack Over?ow(国外的程序异常讨论论坛),IT问题,程序的报错,提交上去,有人会跟你讨论和回答,全文检索,搜索相关问题和答案,程序报错了,就会将报错信息粘贴到里面去,搜索有没有对应的答案

4、GitHub(开源代码管理),搜索上千亿行代码

5、电商网站,检索商品

6、日志数据分析,logstash采集日志,ES进行复杂的数据分析,ELK技术, elasticsearch+logstash+kibana

7、商品价格监控网站,用户设定某商品的价格阈值,当低于该阈值的时候,发送通知消息给用户,比如说订阅牙膏的监控,如果高露洁牙膏的家庭套装低于50块钱,就通知我,我就去买

8、BI系统,商业智能,Business Intelligence。比如说有个大型商场集团,BI,分析一下某某区域最近 3年的用户消费金额的趋势以及用户群体的组成构成,产出相关的数张报表,**区,最近3年,每年消费金额呈现100%的增长,而且用户群体85%是高级白领,开一个新商场。ES执行数据分析和挖掘, Kibana进行数据可视化

9、国内:站内搜索(电商,招聘,门户,等等),IT系统搜索(OA,CRM,ERP,等等),数据分析

(ES热门的一个使用场景)

ES 和 solr 的差别

Elasticsearch简介

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

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

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

英国卫报使用 Elasticsearch 结合用户日志和社交网络数据提供给他们的编辑以实时的反馈,以便及时了解公众对新发表的文章的回应。

StackOver?ow 结合全文搜索与地理位置查询,以及 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)。
  • 它们都是通过从互联网上提取的各个网站的信息(以网页文字为主)而建立的数据库中,检索与用户查询条件匹配的相关记录,然后按一定的排列顺序将结果返回给用户,因此他们是真正的搜索引擎。
  • 从搜索结果来源的角度,全文搜索引擎又可细分为两种,
    • 一种是拥有自己的检索程序(Indexer),俗称 “蜘蛛”(Spider)程序或“机器人”(Robot)程序,并自建网页数据库,搜索结果直接从自身的数据库中调用,如上面提到的7家引擎;
    • 另一种则是租用其他引擎的数据库,并按自定的格式排列搜索结果,如 Lycos 引擎。

Elasticsearch 和 Solr 比较

image-20220427230024105

image-20220427230045138

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安装

说明

我们需要下载和安装ElasticSearch的【服务端】和【客户端】!

注意:

ElasticSearch是使用java开发的,且本版本的es需要的jdk版本要是1.8以上,

所以安装ElasticSearch 之前保证JDK1.8+安装完毕,并正确的配置好JDK环境变量,否则启动 ElasticSearch 会失败。

下载

ElasticSearch的官方地址: https://www.elastic.co/products/elasticsearch

image-20220427230503957

学习的话使用 window 或者 linux 都是可以的,对于我们 java 开发来说没有区别,只是连接的问题!

Windows更加方便一点!所以我们前期都是用 Window 安装使用!后面我们再真正的安装到Linux服务器上跑项目!

window 下安装使用

1、解压window的压缩包!

image-20220427230640928

3、然后在浏览器访问:http://localhost:9200 得到如下信息,说明安装成功了:

image-20220427230807951

3、由于ES进程和客户端进程端口号不同,存在跨域问题,所以我们要在ES的配置文件中配置下跨域问题:

image-20220427230852022

4、重新启动ElasticSearch,使用 head 工具,点击【连接】!

image-20220427231037733
  • Kibana可以将 elasticsearch 的数据通过友好的页面展示出来,提供实时分析的功能。

Kibana

  • Kibana是一个针对Elasticsearch的开源分析及可视化平台,用来搜索、查看交互存储在Elasticsearch索引中的数据。
  • 使用Kibana,可以通过各种图表进行高级数据分析及展示。
  • Kibana让海量数据更容易理解。
  • 它操作简单,基于浏览器的用户界面可以快速创建仪表板(dashboard)实时显示Elasticsearch查询动态。
  • 设置Kibana非常简单。无需编码或者额外的基础架构,几分钟内就可以完成Kibana安装并启动 Elasticsearch索引监测。

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

1、下载Kibana https://www.elastic.co/cn/downloads/kibana (注意版本对应关系)

image-20220427231139806

4、然后访问IP:5601,kibana会自动去访问9200,也就是elasticsearch的端口号(当然elasticsearch这个时候必须启动着),然后就可以使用kibana了!

image-20220427231243080

6、重启查看效果!成功切换为中文的了!

image-20220427233221108
  • 上图是一个有3个节点的集群,可以看到主分片和对应的复制分片都不会在同一个节点内,这样有利于某个节点挂掉了,数据也不至于丢失。

  • 实际上,

    • 一个分片是一个Lucene索引,一个包含倒排索引的文件目录
    • 倒排索引的结构使得 elasticsearch 在不扫描全部文档的情况下,就能告诉你哪些文档包含特定的关键字。
  • 倒排索引

    elasticsearch 使用的是一种称为倒排索引的结构,采用Lucene倒排索作为底层。

    这种结构适用于快速的全文搜索, 一个索引由文档中所有不重复的列表构成,

    对于每一个词,都有一个包含它的文档列表。

    例如,现在有两个文档, 每个文档包含如下内容:

    • 为了创建倒排索引,我们首先要将每个文档拆分成独立的词(或称为词条或者tokens),
    • 然后创建一个包含所有不重复的词条的排序列表,然后列出每个词条出现在哪个文档 :
    term(词条) doc_1(是否存在) doc_2(是否存在)
    Study ×
    To x
    every
    forever
    day
    study ×
    good
    every
    to ×
    up

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

    term doc_1 doc_2
    to ×
    forever
    total(总计) 2 1
    • 两个文档都匹配,但是第一个文档比第二个匹配程度更高。
    • 如果没有别的条件,现在,这两个包含关键字的文档都将返回(并携带一个表示匹配度的数据)。

    再来看一个示例,比如我们通过博客标签来搜索博客文章。

    那么【倒排索引列表】就是这样的一个结构 :

    image-20220428083031684

    3、重新启动 ElasticSearch 服务,在启动过程中,你可以看到正在加载**“analysis-ik”**插件的提示信息,服务启动后,在命令行运行 elasticsearch-plugin list 命令,确认 ik 插件安装成功。

    image-20220428083121793

    ik_smart :

    粗粒度分词,优先匹配最长词,只有1个词!

    image-20220428083155549

    如果我们想让系统识别【狂神说】是一个词,需要编辑自定义词库。

    步骤:

    1. 进入elasticsearch/plugins/ik/con?g目录

    2. 新建一

    3. 个my.dic文件,编辑内容:

    4. 修改IKAnalyzer.cfg.xml(在ik/con?g目录下)

    修改完配置重新启动elasticsearch,再次测试!

    发现监视了我们自己写的规则文件:

    image-20220428083411000

    到了这里,我们就明白了分词器的基本规则和使用了!

    Rest风格说明

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

    基本Rest命令说明:

    method(方法) url(地址) 描述 类比数据库
    PUT localhost:9200/索引名称/类型名称/文档id 创建文档(指定文档id) 指定库、表后,插入行(指定ID)
    POST localhost:9200/索引名称/类型名称 创建文档(随机文档id) 指定库、表后,插入行(不指定ID)
    POST localhost:9200/索引名称/类型名称/文档id/_update 修改文档 指定库、表,修改指定行
    DELETE localhost:9200/索引名称/类型名称/文档id 删除文档 指定库、表,删除指定行
    GET localhost:9200/索引名称/类型名称/文档id 查询文档通过文档id 指定库、表,获取指定行
    POST localhost:9200/索引名称/类型名称/_search 查询所有数据 指定库,获取指定表的所有行数据

    基础测试

    1、首先我们浏览器 http://localhost:5601/ 进入 kibana里的Console

    2、首先让我们在 Console 中输入 :

    来源:星羽恒
                                                            

    声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

    上一篇 2022年4月4日
    下一篇 2022年4月4日

    相关推荐