(四)ElasticSearch之数据

0、概述

在Elasticsearch中,每一个字段的数据都是默认被索引的。也就是说,每个字段专门有一个反向索引用于快速检索。而且,与其它数据库不同,它可以在同一个查询中利用所有的这些反向索引,以惊人的速度返回结果。

1、文档

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

{"name":         "John Smith","age":          42,"confirmed":    true,"join_date":    "2014-06-01","home": {"lat":      51.5,"lon":      0.1},"accounts": [{"type": "facebook","id":   "johnsmith"},{"type": "twitter","id":   "johnsmith"}]
}

通常,我们可以认为对象(object)文档(document)是等价相通的。不过,他们还是有所差别:对象(Object)是一个JSON结构体——类似于哈希、hashmap、字典或者关联数组;对象(Object)中还可能包含其他对象(Object)。 在Elasticsearch中,文档(document)这个术语有着特殊含义。它特指最顶层结构或者根对象(root object)序列化成的JSON数据(以唯一ID标识并存储于Elasticsearch中)。

一个文档不只有数据。它还包含了元数据(metadata)——关于文档的信息。三个必须的元数据节点是:

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

2、索引

  • 索引一个文档

文档通过index API被索引——使数据可以被存储和搜索。但是首先我们需要决定文档所在。正如我们讨论的,文档通过其_index_type_id唯一确定。们可以自己提供一个_id,或者也使用index API 为我们生成一个。

  • 使用自己的ID

如果你的文档有自然的标识符(例如user_account字段或者其他值表示文档),你就可以提供自己的_id,使用这种形式的index API:

# _id就等于你设置的id
PUT /{index}/{type}/{id}
{"field": "value",...
}

例如我们的索引叫做“website”,类型叫做“blog”,我们选择的ID是“123”,那么这个索引请求就像这样:

PUT /website/blog/123
{"title": "My first blog entry","text":  "Just trying this out...","date":  "2014/01/01"
}

Elasticsearch的响应:

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

响应指出请求的索引已经被成功创建,这个索引中包含_index_type_id元数据,以及一个新元素:_version。Elasticsearch中每个文档都有版本号,每当文档变化(包括删除)都会使_version增加。

  • 自增ID
POST /website/blog/
{"title": "My second blog entry","text":  "Still trying this out...","date":  "2014/01/01"
}

响应内容与刚才类似,只有_id字段变成了自动生成的值:

{"_index":    "website","_type":     "blog","_id":       "wM0OSFhDQXGZAWDf0-drSA","_version":  1,"created":   true
}

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

3、获取

  • 检索文档
# 在任意的查询字符串中增加pretty参数,类似于上面的例子。
# 会让Elasticsearch美化输出(pretty-print)JSON响应以便更加容易阅读。
# _source字段不会被美化,它的样子与我们输入的一致。
GET /website/blog/123?pretty
  • 检索文档的一部分
# 请求个别字段可以使用_source参数。多个字段可以使用逗号分隔
GET /website/blog/123?_source=title,text# 只想得到_source字段而不要其他的元数据
GET /website/blog/123/_source

4、存在

# 只是检查文档是否存在
# 存在200 OK,不存在404 Not Found
HEAD /website/blog/123

5、更新

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

6、创建

请记住_index_type_id三者唯一确定一个文档。

# Elasticsearch自动生成唯一_id,再次执行,又生成一个_id
POST /website/blog/
{ ... }

然而,如果想使用自定义的_id,我们必须告诉Elasticsearch应该在_index_type_id三者都不同时才接受请求。为了做到这点有两种方法,它们其实做的是同一件事情。你可以选择适合自己的方式:

# 123存在则报错提示文档已经存在,否则创建
# 或者使用PUT /website/blog/123/_create
PUT /website/blog/123?op_type=create
{"title": "My first blog entry","text":  "Just tryinsssssg this out...","date":  "2014/01/01"
}

7、删除

# 删除id=123的文档
DELETE /website/blog/123# 删除blog删除索引
DELETE /website/

8、局部更新

我们也说过文档是不可变的——它们不能被更改,只能被替换。update API必须遵循相同的规则。表面看来,我们似乎是局部更新了文档的位置,内部却是使用update检索-修改-重建索引流程;

# 添加tags字段
POST /website/blog/123/_update
{"doc" : {"tags" : [ "testing" ],"views": 0}
}

9、检索多个文档(Mget)

像Elasticsearch一样,检索多个文档依旧非常快。合并多个请求可以避免每个请求单独的网络开销。如果你需要从Elasticsearch中检索多个文档,相对于一个一个的检索,更快的方式是在一个请求中使用multi-get或者mget API。

# mget API参数是一个docs数组,数组的每个节点定义一个文档的_index、_type、_id元数据。
# 如果你只想检索一个或几个确定的字段,也可以定义一个_source参数:
POST /_mget
{"docs" : [{"_index" : "website","_type" :  "blog","_id" :    2},{"_index" : "website","_type" :  "pageviews","_id" :    1,"_source": "views"}]
}

响应体也包含一个docs数组,每个文档还包含一个响应,它们按照请求定义的顺序排列。每个这样的响应与单独使用get request响应体相同

{"docs" : [{"_index" :   "website","_id" :      "2","_type" :    "blog","found" :    true,"_source" : {"text" :  "This is a piece of cake...","title" : "My first external blog entry"},"_version" : 10},{"_index" :   "website","_id" :      "1","_type" :    "pageviews","found" :    true,"_version" : 2,"_source" : {"views" : 2}}]
}

10、批量

就像mget允许我们一次性检索多个文档一样,bulk API允许我们使用单一请求来实现多个文档的createindexupdatedelete这对索引类似于日志活动这样的数据流非常有用,它们可以以成百上千的数据为一个批次按序进行索引

POST /_bulk
{ "delete": { "_index": "website", "_type": "blog", "_id": "123" }} <1>
{ "create": { "_index": "website", "_type": "blog", "_id": "123" }}
{ "title":    "My first blog post" }
{ "index":  { "_index": "website", "_type": "blog" }}
{ "title":    "My second blog post" }
{ "update": { "_index": "website", "_type": "blog", "_id": "123", "_retry_on_conflict" : 3} }
{ "doc" : {"title" : "My updated blog post"} } <2>

11、参考

  1. 本文内容来源于https://es.xiaoleilu.com/030_Data/55_Bulk.html

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/420880.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ajax下拉框省市级联动

目录效果sql数据前后台代码实现效果 初始访问页面 选中省会&#xff0c;自动刷新页面 sql数据 -- 省市联动数据CREATE TABLE PROVINCE (PID NUMBER PRIMARY KEY,PNAME VARCHAR(20) NOT NULL )SELECT * FROM PROVINCEINSERT INTO province VALUES (1, 北京市); INSERT I…

emacs中安装markdown-mode

从markdown-mode官网下载markdown-mode.el 将markdown-mode.el文件放到你的emacs loadpath.这里假如是 ~/.emacs.d/ 在 ~/.emacs 中加入如下代码 (autoload markdown-mode "markdown-mode" "Major mode for editing Markdown files" t) (add-to-list auto-…

python的with关键字

with语句适用于对资源进行访问的场合&#xff0c;确保不管使用过程中是否发生异常都会执行必要的“清理”操作&#xff0c;释放资源&#xff0c;比如文件使用后自动关闭、线程中锁的自动获取和释放等。with表达式其实是try-finally的简写形式。但是又不是全相同。 ""…

pgm2

MRF 笔记 我们先讨论引入 MRF 的必要性。经典的例子就是四个 r.v.s 连成一个正方形的结构的时候&#xff0c;我们没法通过 BN 获得给定对角线两个 r.v.s 而剩下的条件独立&#xff08;不都是 d-sep&#xff09;&#xff0c;反过来如果希望通过 MRF 刻画某些 BN 也是不可行的&am…

一步一步学Remoting系列文章

转自&#xff1a;http://www.cnblogs.com/lovecherry/archive/2005/05/24/161437.html (原创)一步一步学Remoting之一&#xff1a;从简单开始 (原创)一步一步学Remoting之二&#xff1a;激活模式 (原创)一步一步学Remoting之三&#xff1a;复杂对象 (原创)一步一步学Remoting之…

(五)ElasticSearch 6.1.1数据类型

1、elasticsearch的数据类型 1.1、核心数据类型 1.1.1、字符串类型&#xff08;string不再支持&#xff09; 当一个字段需要用于全文搜索(会被分词), 比如产品名称、产品描述信息, 就应该使用text类型. text的内容会被分词, 可以设置是否需要存储: “index”: “true|false”…

(六)ElasticSearch 6.1.1聚合查询

1 普通类型 1.1 基本操作 1.1.1 导入实战数据 数据字段如下&#xff1a; 字段类型作用pricelong汽车售价colortext汽车颜色maketext汽车品牌solddate销售日期 # 创建索引 PUT /cars {"mappings" : {"transactions" : {"properties" : {"…

12 Essential Bootstrap Tools for Web Designers

12 Essential Bootstrap Tools for Web Designers Posted by vikas on June 6, 2014, filed in: Tools, Web Design 原文地址&#xff1a;http://designzum.com/2014/06/06/12-best-bootstrap-tools-for-web-designers/Bootstrap is a great front end website development pla…

关于目录操作walk

对于多级目录的文件处理&#xff0c;walk是神器&#xff0c;一个模板如下&#xff1a; root 所指的是当前正在遍历的这个文件夹的本身的地址dirs 是一个 list &#xff0c;内容是该文件夹中所有的目录的名字(不包括子目录)files 同样是 list , 内容是该文件夹中所有的文件(不包…

注册COM组件cmd(管理员权限)

比如&#xff0c;注册这个很老版本的office组件 C:\Windows\system32>regsvr32 d:\dsoframer.ocx转载于:https://www.cnblogs.com/3Tai/p/3779696.html

文本处理常用方法

匹配模式字符串不要有任何空格和变量&#xff0c;重要&#xff01;重要&#xff01;重要&#xff01; re 准备正则表达式 在正则表达式中&#xff0c;如果直接给出字符&#xff0c;就是精确匹配。 \d 可以匹配一个数字 \W 匹配非字母数字及下划线 \w 可以匹配一个字母或数字…

Entity Framework中IQueryable, IEnumerable, IList的区别

博客园里有这样的总结。这里姑且先列个题目&#xff0c; 提醒自己记忆。转载于:https://www.cnblogs.com/buguge/p/3779817.html

Java中重载和复写的区别

Java中重载和复写的区别重载&#xff08;overload&#xff09;复写&#xff08;override&#xff09;区别和联系重载&#xff08;overload&#xff09; 函数重载的最突出的例子就是类的构造函数&#xff0c;用户定义一个对象时可能会提供多种参数组合&#xff1b;函数重载的第…

Sublime Text3自定义快捷键

转载于:https://www.cnblogs.com/shimily/articles/3783711.html

打jar包和执行jar包

使用eclipse打jar包 默认生成的目录在/Work/Projects/eclipse-workspace 执行 java -cp hellotest.jar com.feiyangedu.sample.Main java -cp testtesttest.jar com.feiyangedu.sample.Person out&#xff1a;print person java -cp testtesttest.jar com.feiyangedu.sample.…

受限波尔兹曼机

1. 概述 前面描述的神经网络模型是一种确定的结构。而波尔兹曼网络是一种随机网络。如何来描述一个随机网络呢&#xff1f;很多书上有大量的篇幅介绍其原理。这里把它总结为以下两点。 第一&#xff0c;概率分布函数。由于网络节点的取值状态是随机的&#xff0c;从贝叶斯网的…