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:

  1. PUT /{index}/{type}/{id}
  2. "key": "value"...}
  1. 如,PUT /website/blog/123
  2. {
      "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两个字段:

  1. POST /website/blog/
  2. {
  3. "title": "My second blog entry",
  4. "text": "Still trying this out...",
  5. "date": "2015/07/16"
  6. }

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

  1. {
  2. "_index": "website",
  3. "_type": "blog",
  4. "_id": "AU6Vi9GsUzILmCnC2hkX",
  5. "_version": 1,
  6. "created": true
  7. }

更新整个文档

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

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

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

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

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

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

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

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

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

删除文档

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

  1. DELETE /website/blog/1234

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

  1. {
  2. "found" : true,
  3. "_index" : "website",
  4. "_type" : "blog",
  5. "_id" : "1234",
  6. "_version" : 3
  7. }

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

  1. {
  2. "found" : false,
  3. "_index" : "website",
  4. "_type" : "blog",
  5. "_id" : "1234",
  6. "_version" : 4
  7. }

虽然文档不存在——"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. POJ 3273 Monthly Expense 二分枚举

    题目:http://poj.org/problem?id=3273 二分枚举,据说是经典题,看了题解才做的,暂时还没有完全理解.. #include <stdio.h> #include ...

  2. 定位 - MapKit-自定义大头针

    #import <Foundation/Foundation.h> #import <MapKit/MapKit.h> @interface PPAnnotation : NS ...

  3. .where(provider).FirstOrDefault()和.FirstOrDefault(provider)的性能比较

    最近遇到一个关于Linq的问题,.where(provider).FirstOrDefault();和.FirstOrDefault(provider);的性能比较 关于这个主要有以下三种说法,但这方 ...

  4. Ubuntu 安装 JDK 7 / JDK8 的两种方式

    ubuntu 安装jdk 的两种方式: 1:通过ppa(源) 方式安装. 2:通过官网下载安装包安装. 这里推荐第1种,因为可以通过 apt-get upgrade 方式方便获得jdk的升级 使用pp ...

  5. js node

    http://blogs.msdn.com/b/scott_hanselman/archive/2011/11/29/window-iis-node-js.aspx http://www.16kan. ...

  6. 使用jxl.jar操作Excel

    在工程的build path中添加jxl.jar,网址:http://www.andykhan.com/jexcelapi/ import java.io.BufferedReader; import ...

  7. VMware配置回环地址用于测试

           我们在开发过程中,很可能需要一台服务器用于测试,在这种环境下,我们很可能需要用到vmware来构建这样的开发环境.但如果当前处在一个离线,或是不在网内的环境下,我们所搭建的环境有可能无法 ...

  8. 快速搭建Web服务器软件PHP+Apache+MySQL

    搭建网站或者博客,需要一个合适的 Web 服务器.除了如下能在购买的虚拟空间上进行操作外,我们也可以在自己的电脑上搞定,因为可以用来方便快捷地测试网站或者博客主题,无论是 Wordpress.Joom ...

  9. 《鸟哥的Linux私房菜》读书笔记四

    1.Linux的目录配置以『树状目录』来配置,至於磁碟分割槽(partition)则需要与树状目录相配合! 请问,在预设的情况下,在安装的时候系统会要求你一定要分割出来的两个Partition为何? ...

  10. ActivityManager的使用

    本节内容主要是讲解ActivityManager的使用,通过ActivityManager我们可以获得系统里正在运行的activities,包括 进程(Process)等.应用程序/包.服务(Serv ...