你的位置:首页 > Java教程

[Java教程]Elasticsearch索引(company)_Centos下CURL增删改


目录

  返回目录:http://www.cnblogs.com/hanyinglong/p/5464604.html

1.Elasticsearch索引说明

  a. 通过上面几篇博客已经将Elasticsearch的安装配置以及基本概念和通信方式基本了解了,当了解完这些内容之后,继而就可以去使用它,学习它,也应用在项目中,从这篇博客开始将使用一个简单的教程来学习Elasticsearch,通过此教程,希望可以让大家对Elasticsearch能做的事以及易用程度有了解并且可以使用它,至于更加深层次的内容,欢迎大家去尝试。

  b. 我们以前面的实体对象为(Employee,在第二章中有定义其实体类)来说明整个教程,既然存在实体类了,那么首先要将公司员工的数据存储下来,每个文档代表一个员工,在Elasticsearch中存储数据的行为就叫做索引(indexing),不过在索引之前,我们需要明确数据应该存储在哪里。

    b.1 在Elasticsearch中,文档属于一种类型(Type(Employee)),而这些类型存在于索引中(Index(Company)),如下数据库和Elasticsearch的存储结构的对比,可以使用它们来理解Elasticsearch的存储结构

      (1)  Relational DB(关系型数据库)——>Databases(数据库(Company))——>Tables(表(Employee))——>Rows(行)——>Colums(列)(后面两个对属性的描述)

      (2)  Elasticsearch——>Indices——>Types——>Documents——>Fields

      备注:Elasticsearch集群可以包含多个索引(Indices)(数据库),每一个索引可以包含多个类型(Types)(表),每一个类型包含多个文档(Documents)(行),然后每个文档包含多个字段(Fields)(列),可以和我们的关系型数据库互相参考理解。

  c. 在Elasticsearch中,我们经常提到索引,但是你发现你很难理解它的索引到底是什么?这是因为索引(Index)在Elasticsearch中有着不同的含义,在这里简单区分一下:

    c.1 索引(名词)  一个索引(Index)就像四号传统关系数据库中的数据库,它是相关文档存储的地方,index的复数是indices或者indexes。

    c.2 索引(动词)  索引一个文档,表示把一个文档存储到索引里,以便它可以被检索。

    c.3 倒排索引 传统关系型数据库为特定的列增加一个索引来加速检索,Elasticsearch和Lucene使用一种叫做倒排索引(Inverted index)的数据结构来达到相同的目的。

  d. 默认情况下,Elasticsearch文档中的所有字段都会被索引(拥有一个倒排索引),只有这样可以加速他们的快速搜索。

  e. 接下来让我们建立一个公司员工索引,为了创建这个员工索引,我们将进行一下动作

    e.1 为每个员工的文档(Document)建立索引,每个文档包含了相关员工的所有信息。

    e.2 每个文档的类型是employee,employee类型归属于索引company,company索引储存在Elasticsearch集群中。

  f.下面我们进行增删改索引的操作。

2.Elasticsearch创建索引文档(初始化)

  a. 文档通过index api被索引,使数据可以被储存和搜索,正如前面我们所述,文档通过其_index、_type、_id唯一确定,前面的_index和_type需要我们自己定义,而_id我们可以自己定义也可以使用index api为我们生成一个默认的,创建索引的语法是:

    curl -XPUT 'http://192.168.37.133:9200/ {index} / {type} / {id}?pretty' -d '{

      "field":"value"

    }'

    a.1 从语法中我们看到path:/{index}/{type}/{id}?pretty包含四部分内容,index:索引名,type:类型名,id:这个公司员工的Id,pretty的意思是返回使用JSON,它不需要你做额外的管理工作,比如创建索引或者定义每个字段的数据类型,能够直接索引文档,Elasticsearch已经内置了所有的缺省设置,所有管理操作都是透明的。

  b. 使用自己的Id

    b.1 如果你的文档有自然的标识符(类似于数据库中的主键)(例如Employee中的Id),你就可以提供自己的_id,例如,我们添加一条数据,索引名叫company,类型名叫employee,Id为:e449576b-2125-49e2-99ee-5985212cf502,那么这个索引的请求和返回如下所示:

     

    备注:如上图所示:响应指出请求的索引已经被成功创建,这个索引中包含了_index、_type、_id元数据、_version。Elasticsearch中每个文档都有版本号,每当文档变化的时候(包括删除)都会使_version增加。

  c. 系统自增Id

    c.1 如果我们的数据没有自增Id,可以让Elasticsearch自动为数据生成,请求结构发生了变化:将PUT方法换成POST方法。而URL中现在只需要包含_index和_type两个字段。再添加一条数据,如下图所示:

    

    备注:自动生成的ID有22个字符长,URL-safe, Base64-encoded string universally unique identifiers, 或者叫UUIDs。

  d. 到这里我们将创建索引已经完成。接下来便阐述在索引增改删文档。我们创建了一个索引为company,类型为employee的索引库

3.Elasticsearch创建文档

  a. 从第二步我们已经创建了索引和类型,那么接下来我们就需要创建新的文档了,其实在上面也已经有所说明,但是这里还存在一些问题,故而划出来一个节点简单说明一下

  b. 当索引一个文档的时候,我们如何确定是完全创建了一个新的还是覆盖了一个已经存在的索引呢?需要我们记住_index、_type、_id三者唯一确定一个文档,所以要想保证文档是新加入的,最简单的方式就是使用POST方法让Elasticsearch自动生成唯一的_Id(这样保证了每次的_id都是不同的),然而如果我们想使用自定义的_id,就必须告诉Elasticsearch应该在_index、_type、_id三者都不同时才能接受请求,为了做到这点,有以下两种方式来实现:

    b.1 使用op_type参数(语法如下):

      curl -XPUT 'http://192.168.37.133:9200/company/employee/22dd91d9-e92d-4fe7-a5e0-48fbbdd130f7?op_type=create&pretty' -d '{

        实体对象:(实体对象(字段和上面截图一致),字段定义的值重新写(方便后面查询))
      }'

    b.2  直接在URL后面添加_create特性

      curl -XPUT 'http://192.168.37.133:9200/company/employee/fc6304c9-a257-4920-a756-f02fee7ac157/_create?pretty' -d '{

        实体对象:(实体对象(字段和上面截图一致),字段定义的值重新写(方便后面查询))

      }'

    备注:如果请求成功的创建了一个新的文档,Elasticsech将会返回正常的元数据并且创建状态Created:true。

  c. 当然,如果包含相同的_index、_type、_id的文档已经存在,Elasticsearch将返回409的响应状体,而且提示错误也非常明显,如下图所示:

   

  d. 到这里我们已经对索引添加文档的两种情况进行了说明,而此时索引库里面我们已经写入了几条语句,这时候我们再次多录入几条数据来进行后面的测试。

4.Elasticsearch更新整个文档

  a.从上面可以看到我们已经为Elasticsearch创建了索引并且添加了部分文档数据,那么当含有数据之后,我们就将会对数据进行更新和删除,这里我们来简单说一下Elasticsearch更新整个文档,后面我们还会说Elasticsearch局部更新。

  b. 文档在Elasticsearch中是不可变的,也就是当我们对Elasticsearch录入数据之后,我们不能修改他们,如果我们需要更新已存在的文档,可以使用前面提到的index API重建索引或者替换掉它,换言之则是从就文档中检索出来数据之后修改它,然后删除旧的文档,重新索引新的文档。

    b.1 从上面图片中我们可以看到Elasticseach中含有一个叫《羊七》的用户,我们修改它的名字为《羊癫疯》,爱好为《报纸,代码,写作》,是否正式员工为《true》,账户下的Email为《yangdianfeng@live.cn》,如图所示(和上面的图片内容进行对比):

   

  c. 剖析上图内容:

    c.1 从上图中可以看到在响应中Elasticsearch把_version增加了,说明修改已经成功,关于_version后面会专门有一篇文章去说,它是关于Elasticsearch版本控制的。

    c.2 created标识为false,是因为同索引、同类型下已经存在同Id的文档,大家千万不要看到created为false就以为修改失败了。根本版本增长特性_version得知它已经修改成功了。

    c.3 通过上面的修改命令之后,在Elasticsearch内部已经标记就文档为删除并且添加了一个完整的新文档,当然旧版本不会立即消失,但是你也无法访问它,Elasticsearch会在特定的情况下删除它。

    c.4 后面将会在《局部更新》中探讨update API,这个API允许修改文档的局部内容,但事实上Elasticsearch执行过程与之前所说的过程一致:从原文档中检索到需要修改的数据,修改它,删除原来的文档,索引新的文档,唯一不同的就是update API完成这个过程只需要一个客户端请求即可,不在需要get和index请求了。

  d. 上面说Elasticsearch被标识为删除之后不是立即删除,而是在特定的情况下删除它,那么这个特定的情况是:Elasticsearch会有后台线程根据Lucene的合并规则定期进行segment merging合并操作,一般不需要用户担心或者采取任何行动,被删除的文档在segment合并时,才会真正删除掉,再次之前,它任然会占用着JVM heap和操作系统的文件cache等资源。

4.Elasticsearch删除文档

  a.删除文档的语法与之前的基本一致,只不过要使用DELETE方法:语法如下:

    curl -XDELETE 'http://192.168.37.133:9200/company/employee/AVRksJ2CE1KWUdOka6rK/?pretty' 

  b. 执行上面命令之后,如果文档被找到,Elasticsearch将返回如图所示的状态信息以及响应体,注意_version的数字变化,如果没有找到,将得到found为false的响应体

    

  c. 如果你连续执行文档不存在的命令,发现尽管文档不存在(found为false),但是_version的值还是增加了,这是内部记录的一部分,它确保了在多个节点间不同操作可以有正确的顺序

  d. 正如在更新整个文档中提到的一样,删除一个文档也不会立即从磁盘上移除,它只是被标记成已删除。Elasticsearch将会在特定的情况下进行删除,特定情况参考修改中的说明。


  通过这篇文章,我们了解了ELasticsearch是如索引以及使用CURL创建增删改索引文档的,下篇博客我们将简单来说一下使用CURL查询索引文档。

 

        每天一点点都是进步

             如果文章哪里存在问题,欢迎大家指出来,我会在第一时间修改。