Elasticsearch入门,这一篇就够了

实时搜索引擎Elasticsearch

ES为开发者提供了很是丰富的基于HTTP协议的Rest API,只须要向ES服务端发送简单的Rest请求,就能够实现很是强大的功能。本篇文章主要介绍ES中经常使用操做的Rest API的使用,同时会讲解ES的源代码工程中的API接口文档,经过了解这个API文档的接口描述结构,就基本上能够实现ES中的绝大部分功能。

注意:查询是ES的核心。做为一个先进的搜索引擎,ES中提供了多种查询接口。本篇仅仅会涉及查询API的结构,而具体如何使用ES所提供的各类查询API,会在接下来的博文中作详细介绍。

基础知识

若是以前没有用过相似于ES这样的索引数据库(暂且将ES归为数据库类,与传统的数据库有较大的区别),要理解本篇博文介绍的API是有些难度的。本节先介绍一些基础知识,对理解全文有很帮助。

Rest介绍

笔者在学习软件开发过程当中,屡次听到过Rest Http这个概念,但在很长的一段时间里,死活搞不懂这玩意究竟是个什么东西。刚开始看相关资料时,看得云里雾里,彻底不知所云 _。这玩意太过于抽象和理论,内心以为有必要搞这么复杂么。随着本身动手开发的东西愈来愈多,才开始对它有了一丢丢感受。

Rest彻底不是三言两语就能将清楚的,它有本身的一套体系,因此笔者打算之后单独写一些有关Rest的博文。在这里推荐一篇优秀的文章,它对Rest讲的至关清楚,本人看完以后真有醍醐灌顶的感受!

Mapping详解

Mapping是ES中的一个很重要的内容,它相似于传统关系型数据中table的schema,用于定义一个索引(index)的某个类型(type)的数据的结构。

在传统关系型数据库,咱们必须首先建立table并同时定义其schema,以下面的SQL语句。下面代码中小括号内的代码的做用就是定义person_info的schema(模式)。

create table person_info ( name varchar(20), age tinyint )

 

在ES中,咱们无需手动建立type(至关于table)和mapping(相关与schema)。在默认配置下,ES能够根据插入的数据自动地建立type及其mapping。在下面的API介绍部分中,会作相关的试验。固然,在实际使用过程当中咱们可能就想硬性规定mapping,能够经过配置文件关闭ES的自动建立mapping功能。

mapping中主要包括字段名、字段数据类型和字段索引类型这3个方面的定义。

字段名:这就不用说了,与传统数据库字段名做用同样,就是给字段起个惟一的名字,好让系统和用户能识别。

字段数据类型:定义该字段保存的数据的类型,不符合数据类型定义的数据不能保存到ES中。下表列出的是ES中所支持的数据类型。(大类是对全部类型的一种归类,小类是实际使用的类型。)

大类 包含的小类
String string
Whole number byte, short, integer, long
Floating point float, double
Boolean boolean
Date date

字段索引类型:索引是ES中的核心,ES之因此可以实现实时搜索,彻底归功于Lucene这个优秀的Java开源索引。在传统数据库中,若是字段上创建索引,咱们仍然可以以它做为查询条件进行查询,只不过查询速度慢点。而在ES中,字段若是不创建索引,则就不能以这个字段做为查询条件来搜索。也就是说,不创建索引的字段仅仅能起到数据载体的做用。string类型的数据确定是平常使用得最多的数据类型,下面介绍mapping中string类型字段能够配置的索引类型。

索引类型 解释
analyzed 首先分析这个字符串,而后再创建索引。换言之,以全文形式索引此字段。
not_analyzed 索引这个字段,使之能够被搜索,可是索引内容和指定值同样。不分析此字段。
no 不索引这个字段。这个字段不能被搜索到。

若是索引类型设置为analyzed,在表示ES会先对这个字段进行分析(通常来讲,就是天然语言中的分词),ES内置了很多分析器(analyser),若是以为它们对中文的支持很差,也可使用第三方分析器。因为笔者在实际项目中仅仅将ES用做普通的数据查询引擎,因此并无研究过这些分析器。若是将ES当作真正的搜索引擎,那么挑选正确的分析器是相当重要的。

mapping中除了上面介绍的3个主要的内容外,还有其余的定义内容,详见官网文档

经常使用的Rest API介绍

下面介绍一下ES中的一些经常使用的Rest API。掌握了这些API的用法,基本上就能够简单地使用ES了。

咱们须要借助可以发送HTTP请求的工具调用这些API,工具是能够任意的,包括网页浏览器。这里利用Linux上的curl命令来发送HTTP请求。基本的命令结构为:

curl <-Xaction> url -d 'body' # 这里的action表示HTTP协议中的各类动做,包括GET、POST、PUT、DELETE等。

 

注意。文中的示例代码里面包含了用户注释的文字,就是 # 号后面的文字。运行代码时,请注意删除这些注释。

查看集群(Cluster)信息相关API

(1)查看集群健康信息。

curl -XGET "localhost:9200/_cat/heath?v"

返回结果为:

epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks 1440206633 18:23:53 elasticsearch green 1 1 0 0 0 0 0 0 

 

返回结果的主要字段意义:

  • cluster:集群名,是在ES的配置文件中配置的cluster.name的值。
  • status:集群状态。集群共有green、yellow或red中的三种状态。green表明一切正常(集群功能齐全),yellow意味着全部的数据都是可用的,可是某些复制没有被分配(集群功能齐全),red则表明由于某些缘由,某些数据不可用。若是是red状态,则要引发高度注意,数据颇有可能已经丢失。
  • node.total:集群中的节点数。
  • node.data:集群中的数据节点数。
  • shards:集群中总的分片数量。
  • pri:主分片数量,英文全称为private。
  • relo:复制分片总数。
  • unassign:未指定的分片数量,是应有分片数和现有的分片数的差值(包括主分片和复制分片)。

咱们也能够在请求中添加help参数来查看每一个操做返回结果字段的意义。

curl -XGET "localhost:9200/_cat/heath?help"

返回结果以下:

epoch         | t,time | seconds since 1970-01-01 00:00:00 timestamp | ts,hms,hhmmss | time in HH:MM:SS cluster | cl | cluster name status | st | health status node.total | nt,nodeTotal | total number of nodes node.data | nd,nodeData | number of nodes that can store data shards | t,sh,shards.total,shardsTotal | total number of shards pri | p,shards.primary,shardsPrimary | number of primary shards relo | r,shards.relocating,shardsRelocating | number of relocating nodes init | i,shards.initializing,shardsInitializing | number of initializing nodes unassign | u,shards.unassigned,shardsUnassigned | number of unassigned shards pending_tasks | pt,pendingTasks | number of pending tasks 

 

确实是很好很强大。有了这个东东,就能够减小看文档的时间。ES中许多API均可以添加help参数来显示字段含义,哪些能够这么作呢?每一个API都试试就知道了。

固然,若是你以为返回的东西太多,看着眼烦,咱们也能够人为地指定返回的字段。

curl -XGET "localhost:9200/_cat/health?h=cluster,pri,relo&v"

此次的返回结果就简单不少罗。对于患有严重强迫症的患者来讲,这是福音啊!

cluster pri relo elasticsearch 0 0 

(2)查看集群中的节点信息。

curl -XGET "localhost:9200/_cat/nodes?v"

返回节点的详细信息以下:

host          ip            heap.percent ram.percent load node.role master name master.hadoop localhost 3 35 0.00 d * Ezekiel 

 

(3)查看集群中的索引信息。

curl -XGET "localhost:9200/_cat/indices?v"

 

返回集群中的索引信息以下:

health status index      pri rep docs.count docs.deleted store.size pri.store.size yellow open index_test 5 1 0 0 575b 575b 

 

更多的查看和监视ES的API参见官网文档

索引(Index)相关API

(1)建立一个新的索引。

curl -XPUT "localhost:9200/index_test"

若是返回下面的信息,则说明索引建立成功。若是不是,则ES会返回相应的异常信息。一般能够经过异常信息的最后一项推断出失败的缘由。

{
    "acknowledged": true }

上面的操做使用默认的配置信息建立一个索引。大多数状况下,咱们想在索引建立的时候就将咱们所需的mapping和其余配置肯定好。下面的操做就能够在建立索引的同时,建立settings和mapping。

curl -XPUT "localhost:9200/index_test" -d ' # 注意这里的'号 { "settings": { "index": { "number_of_replicas": "1", # 设置复制数 "number_of_shards": "5" # 设置主分片数 } }, "mappings": { # 建立mapping "test_type": { # 在index中建立一个新的type(至关于table) "properties": { "name": { # 建立一个字段(string类型数据,使用普通索引) "type": "string", "index": "not_analyzed" }, "age": { "type": "integer" } } } } }'

 

(2)删除一个索引。

curl -XDELETE "localhost:9200/index_test"

若是返回与建立索引一样的信息,则说明删除成功。反之,则返回相应的异常信息。更多的索引操做参见ES官网文档

映射(Mapping)相关API

(1)建立索引的mapping。

curl -XPUT 'localhost:9200/index_test/_mapping/test_type' -d ' { "test_type": { # 注意,这里的test_type与url上的test_type名保存一致 "properties": { "name": { "type": "string", "index": "not_analyzed" }, "age": { "type": "integer" } } } }'

 

若是不想单首创建mapping,可使用上一节的方法(建立索引时建立mappings)。

假设咱们的项目中有多个环境(开发环境、测试环境等),那每个环境的mapping总要一致的吧,那每次建立一次mappings就比较麻烦了,并且还容易致使数据不一致。莫急,ES还给咱们准备另一种建立mapping的方式。能够按照下面的步骤来作。

步骤1 建立一个扩展名为test_type.json的文件名,其中type_test就是mapping所对应的type名。

步骤2 在test_type.json中输入mapping信息。假设你的mapping以下:

{
  "test_type": { # 注意,这里的test_type与json文件名必须一致 "properties": { "name": { "type": "string", "index": "not_analyzed" }, "age": { "type": "integer" } } } }

 

步骤3 在$ES_HOME/config/路径下建立mappings/index_test子目录,这里的index_test目录名必须与咱们要创建的索引名一致。将test_type.json文件拷贝到index_tes目录下。

步骤4 建立index_test索引。操做以下:

curl -XPUT "localhost:9200/index_test" # 注意,这里的索引名必须与mappings下新建的index_test目录名一致

这样咱们就建立了一个新的索引,而且使用了test_type.json所定义的mapping做为索引的mapping。就是这么简单方便!

(2)删除mapping。

curl -XDELETE 'localhost:9200/index_test/_mapping/test_type'

(3)查看索引的mapping。

curl -XGET 'localhost:9200/index_test/_mapping/test_type'

 

更多的mapping相关操做参加官网文档

文档(document)相关API

(1)新增一个文档。

curl -XPUT 'localhost:9200/index_test/test_type/1?pretty' -d ' # 这里的pretty参数的做用是使得返回的json显示地更加好看。1是文档的id值(惟一键)。 { "name": "zhangsan", "age" : "12" }'

 

(2)更新一个文档

curl -XPOST 'localhost:9200/index_test/test_type/1?pretty' -d ' # 这里的1必须是索引中已经存在id,不然就会变成新增文档操做 { "name": "lisi", "age" : "12" }' 

 

(3)删除一个文档

curl -XDELETE 'localhost:9200/index_test/test_type/1?pretty' # 这里的1必须是索引中已经存在id

 

(4)查询单个文档

curl -XGET 'localhost:9200/index_test/test_type/1?pretty'

 

上面的操做仅仅查询id为1的一条文档,这样看彷佛ES的查询也太弱了。前面已经说过了,查询操做是ES中的核心,是其立身的根本。可是本文的重点并不在这里,为了防止文章的篇幅过长,以后将专本介绍ES中的查询操做。

源代码中提供的Rest API文档结构

ES的源代码托管在Github上。将源代码下载下来以后,里面有一个文件夹专门存放ES中绝大部分的Rest API。有了这些文档,就没必要每次都要到官网上查询接口文档了(PS:ES的官网真的很慢)。 
下面以cat.health.json文件为例简单地介绍这些Rest API文档的结构。一旦结构搞清楚了,文档看起来就比较顺心,ES用起来就更加驾轻就熟了!

{
  "cat.health": { "documentation": "http://www.elastic.co/guide/en/elasticsearch/reference/master/cat-health.html", # 该文档对应的官方站点 "methods": ["GET"], "url": { # url部分可选 "path": "/_cat/health", "paths": ["/_cat/health"], "parts": { }, "params": { "local": { "type" : "boolean", "description" : "Return local information, do not retrieve the state from master node (default: false)" }, "master_timeout": { "type" : "time", "description" : "Explicit operation timeout for connection to master node" }, "h": { "type": "list", "description" : "Comma-separated list of column names to display" }, "help": { "type": "boolean", "description": "Return help information", "default": false }, "ts": { "type": "boolean", "description": "Set to false to disable timestamping", "default": true }, "v": { "type": "boolean", "description": "Verbose mode. Display column headers", "default": true } } }, "body": null } }

 

 

上面文档接口所对应的Reqeust操做以下:

curl -XGET "localhost:9200/_cat/health?v" -d 'body'

 

该操做命令可划分为5个部分,下面把这5个部分与文档对应起来。经过这个例子,就能够在阅读其余文档后,使用正确的操做了。

  1. 第1部分(-XGET):对应文档中methods所包含的GET操做。
  2. 第2部分(localhost:9200):是ES服务端所在主机的hostname和port。
  3. 第3部分(/_cat/health):对应文档中的url。其中path是最简单的url;paths是除了path以外的其余url;parts描述和解释paths里面的url的可变部分(一般用{}包裹,如{index})。
  4. 第4部分v:表示参数,对应文档中的params。像“v”这种boolean类型的参数,不须要特地指定其布尔值(true或者false),出现即表示true,不然为false。
  5. 第5部分body:表示要传递的数据主体,对应文档中的body。若是body里面指明“required=true”,则表示必须传入body数据。具体body里面须要传怎样的数据,则能够访问文档中的documentation字段所指明的官方站点进行查询。

总结

本文重点介绍了ES中的一些经常使用Rest API的用法,并在开始部分简单地介绍了一些基础知识(Rest和mapping)。掌握了这些API的调用,就能够利用ES完成简单的应用程序了。固然,ES的API远不止这些,若是想要更加深刻地了解ES的使用及其内部原理,建议先仔细地阅读ES的官网文档。而后下载其源代码进行研究。

 

想进阶的同窗,请参考:

Elasticsearch: 权威指南

相关文章
相关标签/搜索