Elasticsearch简介与实战

Elasticsearch简介与实战

2023年6月29日发(作者:)

Elasticsearch简介与实战什么是Elasticsearch?  Elasticsearch是⼀个开源的分布式、RESTful 风格的搜索和数据分析引擎,它的底层是开源库Apache Lucene。  Lucene 可以说是当下最先进、⾼性能、全功能的搜索引擎库——⽆论是开源还是私有,但它也仅仅只是⼀个库。为了充分发挥其功能,你需要使⽤ Java 并将 Lucene 直接集成到应⽤程序中。 更糟糕的是,您可能需要获得信息检索学位才能了解其⼯作原理,因为Lucene ⾮常复杂。  为了解决Lucene使⽤时的繁复性,于是Elasticsearch便应运⽽⽣。它使⽤ Java 编写,内部采⽤ Lucene 做索引与搜索,但是它的⽬标是使全⽂检索变得更简单,简单来说,就是对Lucene 做了⼀层封装,它提供了⼀套简单⼀致的 RESTful API 来帮助我们实现存储和检索。  当然,Elasticsearch 不仅仅是 Lucene,并且也不仅仅只是⼀个全⽂搜索引擎。 它可以被下⾯这样准确地形容:⼀个分布式的实时⽂档存储,每个字段可以被索引与搜索;⼀个分布式实时分析搜索引擎;能胜任上百个服务节点的扩展,并⽀持 PB 级别的结构化或者⾮结构化数据。由于Elasticsearch的功能强⼤和使⽤简单,维基百科、卫报、Stack Overflow、GitHub等都纷纷采⽤它来做搜索。现在,Elasticsearch已成为全⽂搜索领域的主流软件之⼀。  下⾯将介绍Elasticsearch的安装与简单使⽤。安装并运⾏Elasticsearch  安装 Elasticsearch 之前,你需要先安装⼀个较新版本的 Java,最好的选择是,你可以从

获得官⽅提供的最新版本的Java。  你可以从 elastic 的官⽹

/downloads/elasticsearch 获取最新版本的Elasticsearch。解压⽂档后,按照下⾯的操作,即可在前台(foregroud)启动 Elasticsearch:cd elasticsearch-./bin/elasticsearch{ "name" : "YTK8L4q", "cluster_name" : "elasticsearch", "cluster_uuid" : "hB2CZPlvSJavhJxx85fUqQ", "version" : { "number" : "6.5.4", "build_flavor" : "default", "build_type" : "tar", "build_hash" : "d2ef93d", "build_date" : "2018-12-17T21:17:40.758843Z", "build_snapshot" : false, "lucene_version" : "7.5.0", "minimum_wire_compatibility_version" : "5.6.0", "minimum_index_compatibility_version" : "5.0.0" }, "tagline" : "You Know, for Search"}cd kibana-./bin/kabanaKibana启动界⾯  下⾯,让我们来了解Elasticsearch的⼀些基本概念,这有助于我们更好地理解和使⽤Elasticsearch。Elasticsearch基本概念全⽂搜索(Full-text Search)  全⽂检索是指计算机索引程序通过扫描⽂章中的每⼀个词,对每⼀个词建⽴⼀个索引,指明该词在⽂章中出现的次数和位置,当⽤户查询时,检索程序就根据事先建⽴的索引进⾏查找,并将查找的结果反馈给⽤户的检索⽅式。  在全⽂搜索的世界中,存在着⼏个庞⼤的帝国,也就是主流⼯具,主要有:Apache LuceneElasticsearchSolrFerret倒排索引(Inverted Index)  该索引表中的每⼀项都包括⼀个属性值和具有该属性值的各记录的地址。由于不是由记录来确定属性值,⽽是由属性值来确定记录的位置,因⽽称为倒排索引(inverted index)。Elasticsearch能够实现快速、⾼效的搜索功能,正是基于倒排索引原理。节点 & 集群(Node & Cluster)  Elasticsearch 本质上是⼀个分布式数据库,允许多台服务器协同⼯作,每台服务器可以运⾏多个Elasticsearch实例。单个Elasticsearch实例称为⼀个节点(Node),⼀组节点构成⼀个集群(Cluster)。索引(Index)  Elasticsearch 数据管理的顶层单位就叫做 Index(索引),相当于关系型数据库⾥的数据库的概念。另外,每个Index的名字必须是⼩写。⽂档(Document)  Index⾥⾯单条的记录称为 Document(⽂档)。许多条 Document 构成了⼀个 Index。Document 使⽤ JSON 格式表⽰。同⼀个Index ⾥⾯的 Document,不要求有相同的结构(scheme),但是最好保持相同,这样有利于提⾼搜索效率。类型(Type)  Document 可以分组,⽐如employee这个 Index ⾥⾯,可以按部门分组,也可以按职级分组。这种分组就叫做 Type,它是虚拟的逻辑分组,⽤来过滤 Document,类似关系型数据库中的数据表。  不同的 Type 应该有相似的结构(Schema),性质完全不同的数据(⽐如 products 和 logs)应该存成两个 Index,⽽不是⼀个 Index⾥⾯的两个 Type(虽然可以做到)。⽂档元数据(Document metadata)  ⽂档元数据为_index, _type, _id, 这三者可以唯⼀表⽰⼀个⽂档,_index表⽰⽂档在哪存放,_type表⽰⽂档的对象类别,_id为⽂档的唯⼀标识。字段(Fields)  每个Document都类似⼀个JSON结构,它包含了许多字段,每个字段都有其对应的值,多个字段组成了⼀个 Document,可以类⽐关系型数据库数据表中的字段。  在 Elasticsearch 中,⽂档(Document)归属于⼀种类型(Type),⽽这些类型存在于索引(Index)中,下图展⽰了Elasticsearch与传统关系型数据库的类⽐:Elasticsearch⼊门  Elasticsearch提供了多种交互使⽤⽅式,包括Java API和RESTful API ,本⽂主要介绍RESTful API 。所有其他语⾔可以使⽤RESTfulAPI 通过端⼝

9200 和 Elasticsearch 进⾏通信,你可以⽤你最喜爱的 web 客户端访问 Elasticsearch 。甚⾄,你还可以使⽤

curl 命令来和Elasticsearch 交互。  ⼀个Elasticsearch请求和任何 HTTP 请求⼀样,都由若⼲相同的部件组成:curl -X '://:/?' -d ''返回的数据格式为JSON,因为Elasticsearch中的⽂档以JSON格式储存。其中,被

< > 标记的部件:部件VERBPROTOCOLHOSTPORTPATHQUERY_STRINGBODY说明适当的 HTTP

⽅法 或

谓词 :

GET、

POST、

PUT、

HEAD 或者

DELETE。http 或者

https(如果你在 Elasticsearch 前⾯有⼀个

https 代理)Elasticsearch 集群中任意节点的主机名,或者⽤

localhost 代表本地机器上的节点。运⾏ Elasticsearch HTTP 服务的端⼝号,默认是

9200 。API 的终端路径(例如

_count 将返回集群中⽂档数量)。Path 可能包含多个组件,例如:_cluster/stats 和

_nodes/stats/jvm 。任意可选的查询字符串参数 (例如

pretty 将格式化地输出 JSON 返回值,使其更容易阅读)⼀个 JSON 格式的请求体 (如果请求需要的话)对于HTTP⽅法,它们的具体作⽤为:HTTP⽅法GETPOSTPUTDELETEHEAD获取请求对象的当前状态改变对象的当前状态创建⼀个对象销毁对象请求获取对象的基础信息说明  我们以下⾯的数据为例,来展⽰Elasticsearch的⽤法。以下全部的操作都在Kibana中完成,创建的index为conference, type为event .插⼊数据  ⾸先创建index为conference, 创建type为event, 插⼊id为1的第⼀条数据,只需运⾏下⾯命令就⾏:PUT /conference/event/1{ "host": "Dave", "title": "Elasticsearch at Rangespan and Exonar", "description": "Representatives from Rangespan and Exonar will come and discuss how they use Elasticsearch", "attendees": ["Dave", "Andrew", "David", "Clint"], "date": "2013-06-24T18:30", "reviews": 3}在上⾯的命令中,路径/conference/event/1表⽰⽂档的index为conference, type为event, id为1. 类似于上⾯的操作,依次插⼊剩余的4条数据,完成插⼊后,查看数据如下:插⼊数据删除数据  ⽐如我们想要删除conference中event⾥⾯id为5的数据,只需运⾏下⾯命令即可:DELETE /conference/event/5返回结果如下:{ "_index" : "conference", "_type" : "event", "_id" : "5", "_version" : 2, "result" : "deleted", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 1, "_primary_term" : 1}表⽰该⽂档已成功删除。如果想删除整个event类型,可输⼊命令:DELETE /conference/event如果想删除整个conference索引,可输⼊命令:DELETE /conference修改数据  修改数据的命令为POST, ⽐如我们想要将conference中event⾥⾯id为4的⽂档的作者改为Bob,那么需要运⾏命令如下:POST /conference/event/4/_update{ "doc": {"host": "Bob"}}返回的信息如下:(表⽰修改数据成功){ "_index" : "conference", "_type" : "event", "_id" : "4", "_version" : 7, "result" : "updated", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 7, "_primary_term" : 1}查看修改后的数据如下:修改数据查询数据  查询数据的命令为GET,查询命令也是Elasticsearch最为重要的功能之⼀。⽐如我们想查询conference中event⾥⾯id为1的数据,运⾏命令如下:GET /conference/event/1返回的结果如下:{ "_index" : "conference", "_type" : "event", "_id" : "1", "_version" : 2, "found" : true, "_source" : { "host" : "Dave", "title" : "Elasticsearch at Rangespan and Exonar", "description" : "Representatives from Rangespan and Exonar will come and discuss how they use Elasticsearch", "attendees" : [ "Dave", "Andrew", "David", "Clint" ], "date" : "2013-06-24T18:30", "reviews" : 3 }}在_source 属性中,内容是原始的 JSON ⽂档,还包含有其它属性,⽐如_index, _type, _id, _found等。  如果想要搜索conference中event⾥⾯所有的⽂档,运⾏命令如下:GET /conference/event/_search返回结果包括了所有四个⽂档,放在数组 hits 中。  当然,Elasticsearch 提供更加丰富灵活的查询语⾔叫做

查询表达式 , 它⽀持构建更加复杂和健壮的查询。利⽤查询表达式,我们可以检索出conference中event⾥⾯所有host为Bob的⽂档,命令如下:GET /conference/event/_search{ "query" : { "match" : { "host" : "Bob" } }}返回的结果只包括了⼀个⽂档,放在数组 hits 中。  接着,让我们尝试稍微⾼级点⼉的全⽂搜索——⼀项传统数据库确实很难搞定的任务。搜索下所有description中含有"use Elasticsearch"的event:GET /conference/event/_search{ "query" : { "match" : { "description" : "use Elasticsearch" } }}返回的结果(部分)如下:{ ... "hits" : { "total" : 2, "max_score" : 0.65109104, "hits" : [ { ... "_score" : 0.65109104, "_source" : { "host" : "Dave Nolan", "title" : "real-time Elasticsearch", "description" : "We will discuss using Elasticsearch to index data in real time", ... } }, { ... "_score" : 0.5753642, "_source" : { "host" : "Dave", "title" : "Elasticsearch at Rangespan and Exonar", "description" : "Representatives from Rangespan and Exonar will come and discuss how they use Elasticsearch", ... } } ] }}返回的结果包含了两个⽂档,放在数组 hits 中。让我们对这个结果做⼀些分析,第⼀个⽂档的description⾥⾯含有“using Elasticsearch”,这个能匹配“use Elasticsearch”是因为Elasticsearch含有内置的词⼲提取算法,之后两个⽂档按_score进⾏排序,_score字段表⽰⽂档的相似度(默认的相似度算法为BM25)。  如果想搜索下所有description中严格含有"use Elasticsearch"这个短语的event,可以使⽤下⾯的命令:GET /conference/event/_search{ "query" : { "match_phrase": { "description" : "use Elasticsearch" } }}这时候返回的结果只有⼀个⽂档,就是上⾯输出的第⼆个⽂档。  当然,Elasticsearch还⽀持更多的搜索功能,⽐如过滤器,⾼亮搜索,结构化搜索等,希望接下来能有更多的时间和经历来介绍~总结  后续有机会再介绍如何利⽤Python来操作Elasticsearch~  本次分享到此结束,感谢⼤家阅读~注意:本⼈现已开通微信公众号: Python爬⾍与算法(微信号为:easy_web_scrape), 欢迎⼤家关注哦~~

发布者:admin,转转请注明出处:http://www.yc00.com/news/1687987694a64201.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信