Elasticsearch是一个分布式的文档(document)存储引擎。它能够实时存储并检索复杂数据结构——序列化的JSON文档。换言说,一旦文档被存储在Elasticsearch中,它就能够在集群的任一节点上被检索。

当然,我们不仅须要存储数据。还要高速的批量查询。尽管已经有非常多NoSQL的解决方式同意我们以文档的形式存储对象,但它们依然须要考虑怎样查询这些数据,以及哪些字段须要被索引以便检索时更加高速。

程序中大多的实体或对象可以被序列化为包括键值对的JSON对象,键(key)是字段(field)或属性(property)的名字,值(value)可以是字符串、数字、波尔类型、还有一个对象、值数组或者其它特殊类型,比方表示日期的字符串或者表示地理位置的对象。

文档元数据(Document MetaData):

一个文档不仅仅有数据。它还包括了元数据(metadata)——关于文档的信息。

三个必须的元数据节点是:

节点 说明
_index 文档存储的地方
_type 文档代表的对象的类
_id 文档的唯一标识

_index

索引(index)类似于关系型数据库里的“数据库”——它是我们存储和索引关联数据的地方。

其实,我们的数据被存储和索引在分片(shards)中,索引仅仅是一个把一个或多个分片分组在一起的逻辑空间。然而,这仅仅是一些内部细节——我们的程序全然不用关心分片。对于我们的程序而言,文档存储在索引(index)中。剩下的细节由Elasticsearch关心既可。

后面会继续探讨怎样创建并管理索引。但如今,我们将让Elasticsearch为我们创建索引。我们唯一须要做的不过选择一个索引名。这个名字必须是所有小写。不能下面划线开头,不能包括逗号。

让我们使用website做为索引名。

_type

在应用中。我们使用对象表示一些“事物”。比如一个用户、一篇博客、一个评论,或者一封邮件。每一个对象都属于一个类(class),这个类定义了属性或与对象关联的数据。user类的对象可能包括姓名、性别、年龄和Email地址。

在关系型数据库中,我们常常将同样类的对象存储在一个表里。由于它们有着同样的结构。同理,在Elasticsearch中,我们使用同样类型(type)的文档表示同样的“事物”。由于他们的数据结构也是同样的。

每一个类型(type)都有自己的映射(mapping)或者结构定义。就像传统数据库表中的列一样。全部类型下的文档被存储在同一个索引下,可是类型的映射(mapping)会告诉Elasticsearch不同的文档怎样被索引。 我们将会在《映射》章节探讨怎样定义和管理映射。可是如今我们将依赖ELasticsearch去自己主动处理数据结构。

_type的名字能够是大写或小写,不能包括下划线或逗号。

我们将使用blog做为类型名。

_id

id不过一个字符串。它与_index_type组合时。就能够在ELasticsearch中唯一标识一个文档。

当创建一个文档。你能够自己定义_id,也能够让Elasticsearch帮你自己主动生成。

ps:还有其他部分其他元数据,兴许再介绍。

使用自己的ID

假设你的文档有自然的标识符(比如user_account字段或者其它值表示文档)。你就能够提供自己的_id,使用这样的形式的index API:

PUT /{index}/{type}/{id}
{"key": "value"...}
如,PUT /website/blog/123

{
  "title": "My blog entry",
  "text":  "汉语你能够。。 ",
  "date":  "2015/07/16"
}

{

   "_index": "website",

   "_type": "blog",

   "_id": "123",

   "_version": 5,

   "created": false

}

Elasticsearch中每一个文档都有版本,每当文档变化(包含删除)都会使_version添加。兴许我们将探讨怎样使用_version号确保你程序的一部分不会覆盖掉还有一部分所做的更改。

自增ID

假设我们的数据没有自然ID。我们能够让Elasticsearch自己主动为我们生成。请求结构发生了变化:PUT方法——“在这个URL中存储文档”变成了POST方法——"在这个文档下存储文档"

(注:原来是把文档存储到某个ID相应的空间。如今是把这个文档加入到某个_type下)。

URL如今仅仅包括_index_type两个字段:

POST /website/blog/
{
"title": "My second blog entry",
"text": "Still trying this out...",
"date": "2015/07/16"
}

响应内容与刚才类似。仅仅有_id字段变成了自己主动生成的值:

{
"_index": "website",
"_type": "blog",
"_id": "AU6Vi9GsUzILmCnC2hkX",
"_version": 1,
"created": true
}

更新整个文档

文档在Elasticsearch中是不可变的——我们不能改动他们。假设须要更新已存在的文档,我们能够使用《索引文档》提到的index API 重建索引(reindex) 或者替换掉它。

PUT /website/blog/123
{
"title": "My first blog entry",
"text": "I am starting to get the hang of this...",
"date": "2014/01/02"
}

在响应中。我们能够看到Elasticsearch把_version添加了。

{
"_index" : "website",
"_type" : "blog",
"_id" : "123",
"_version" : 2,
"created": false <1>
}
  • <1> created标识为false由于同索引、同类型下已经存在同ID的文档。

在内部,Elasticsearch已经标记旧文档为删除并加入了一个完整的新文档。

旧版本号文档不会马上消失。但你也不能去訪问它。Elasticsearch会在你继续索引很多其它数据时清理被删除的文档。

在后面探讨update API。这个API 似乎 同意你改动文档的局部。但其实Elasticsearch遵循与之前所说全然同样的过程,这个步骤例如以下:

  1. 从旧文档中检索JSON
  2. 改动它
  3. 删除旧文档
  4. 索引新文档

唯一的不同是update API完毕这一过程仅仅须要一个client请求既可。不再须要getindex请求了。

删除文档

删除文档的语法模式与之前基本一致,仅仅只是要使用DELETE方法:

DELETE /website/blog/1234

假设文档被找到,Elasticsearch将返回200 OK状态码和下面响应体。注意_version数字已经添加了。

{
"found" : true,
"_index" : "website",
"_type" : "blog",
"_id" : "1234",
"_version" : 3
}

假设文档未找到。我们将得到一个404 Not Found状态码,响应体是这种:

{
"found" : false,
"_index" : "website",
"_type" : "blog",
"_id" : "1234",
"_version" : 4
}

虽然文档不存在——"found"的值是false——_version依然添加了。

这是内部记录的一部分。它确保在多节点间不同操作能够有正确的顺序。

删除一个文档也不会马上从磁盘上移除,它仅仅是被标记成已删除。

Elasticsearch将会在你之后加入很多其它索引的时候才会在后台进行删除内容的清理。

ElasticSearch怎样加入,检索数据的更多相关文章

  1. logstash-out-mongodb实现elasticsearch到Mongodb的数据同步

    本文主要实现将Elasticsearch中的索引数据Index同步到Mongodb中的集合collection中. 0.前提 1)已经安装好源数据库:elasticsearch V2.X; 2)已经安 ...

  2. ES 21 - Elasticsearch的高级检索语法 (包括term、prefix、wildcard、fuzzy、boost等)

    目录 1 term query - 索引词检索 1.1 term query - 不分词检索 1.2 terms query - in检索 2 prefix query - 前缀检索 3 wildca ...

  3. 用 mongodb + elasticsearch 实现中文检索

      而 elasticsearch 可以很好的支持各种语言的全文检索,但我们暂时又不想切换到 elasticsearch 作为后端数据库. 当然,可以在 web 应用中存储数据的时候,再主动写一份到 ...

  4. 为什么Elasticsearch不适合做数据存储?(转学习使用)

    一.问题描述 公司想尝试使用Elasticsearch来存一部分数据,以此缓解数据增长带来的对数据库的压力.在研究了一段时间后,发现Elasticsearch不适合作为数据存储使用. 二.理由如下 1 ...

  5. mysql-3 检索数据(1)

    SELECT 语句 SELECT检索表数据,必须至少给出两条信息--------想选择什么,以及从什么地方选择. 检索一个列 SELECT prod_name FROM products; 上述语句利 ...

  6. hibernate提供的5种检索数据方式

    一.五种检索数据方式 1.OID检索,即使用session.get或session.load通过类及指定id查询数据,如Customer c=(Customer)session.get("C ...

  7. SQL SERVER 2008筛选时报错 无法为该请求检索数据

    使用SqlServer2008的筛选功能时报错“无法为该请求检索数据. (Microsoft.SqlServer.Management.Sdk.Sfc)” 如下图: 解决方法: 打上SQL SERVE ...

  8. ADO.NET 快速入门(十四):使用 SQL Server 检索数据

    SqlDataReader 类提供了一种从数据源读取数据记录只进流的方法.如果想使用 OLE DB 接口的数据库或者 SQL Server7.0 之前的版本,请参考文章:使用 OLE DB 检索数据. ...

  9. ADO.NET 快速入门(十三):使用 OLE DB 检索数据

    OleDbDataReader 类提供了一种从数据源读取数据记录只进流的方法.如果想使用 SQL Server 7.0 或者更高版本,请参考文章:使用 SQL Server 检索数据.   OleDb ...

  10. InnoDB这种行锁实现特点意味者:只有通过索引条件检索数据,InnoDB才会使用行级锁,否则,InnoDB将使用表锁!

    InnoDB行锁是通过索引上的索引项来实现的,这一点MySQL与Oracle不同,后者是通过在数据中对相应数据行加锁来实现的. InnoDB这种行锁实现特点意味者:只有通过索引条件检索数据,InnoD ...

随机推荐

  1. C语言面向对象的简便方法

    都知道C语言是面向过程的,但是现在软件规模越来越大,通过面向对象的方式可以简化开发.业余时间想了个简单的方法,在C中使用一部分面向对象的基本功能.由于C语言自身的限制,并不完善,只能将就用,聊胜于无, ...

  2. asp.net MVC FileResult在IE下异常的解决办法

    var encoding = System.Text.Encoding.UTF8; Response.Charset = encoding.WebName; Response.HeaderEncodi ...

  3. ie8下jquery读取当前点击的标签位置错误,原因是里面有内容写了text-indent:-9999px

    今天写一地图的效果,鼠标点击对应的区域,弹出所点击区域的名字. 因为设计的区域名字有特殊效果,所以,在点击区域里面套了个标签写上区域名字用来识别,但是这个文字呢不同显示在页面上,所以就给 em 加个了 ...

  4. int 占一个机器字长

    int与short int是不一样的. C++标准规定,int占一个机器字长.在32位系统中int占32位,也就是4个字节, 而在老式的16位系统中,int占16位,即2个字节. 而C++标准中只限制 ...

  5. [OI笔记] 最长上升子序列与网络流建模

    与最长上升子序列相关的网络流问题: 给定一个序列 A[1..n] ,求出 A 的最长上升子序列长度.并且回答下列询问: (1) 如果每个点只能用一次,能从 A 中取出几个最长上升子序列? (2) 如果 ...

  6. 高级PHP应用程序漏洞审核技术

    前言 PHP是一种被广泛使用的脚本语言,尤其适合于web开发.具有跨平台,容易学习,功能强大等特点,据统计全世界有超过34%的网站有php的应 用,包括Yahoo.sina.163.sohu等大型门户 ...

  7. Stanford CoreNLP--Named Entities Recognizer(NER)

    Standford Named Entities Recognizer(NER),命名实体识别是信息提取(Information Extraction)的一个子任务,它把文字的原子元素(Atomic ...

  8. 高远介绍的好东东--django-celery

    终于可以到异步消息机制的高档产品啦~~~ 不知能不能代替AJAX.. 参照官方文档试下: 中文文档: http://docs.jinkan.org/docs/celery/getting-starte ...

  9. 【BZOJ 3476】 线段树===

    59  懒惰的奶牛贝西所在的牧场,散落着 N 堆牧草,其中第 i 堆牧草在 ( Xi,Yi ) 的位置,数量有 Ai 个单位.贝西从家移动到某一堆牧草的时候,只能沿坐标轴朝正北.正东.正西.正南这四个 ...

  10. Android Bitmap是不能比较的,这样做是错误的

    代码1: Bitmap dir = BitmapFactory.decodeResource(context.getResources(), R.drawable.netdisc_search_lis ...