如何使用 CRUD 操作与 ElasticSearch 中的数据交互

金钱(警告)

** 状态:** 被贬值

如果您目前正在运行运行 Ubuntu 12.04 的服务器,我们强烈建议升级或迁移到支持的 Ubuntu 版本:

** 原因:** Ubuntu 12.04 已于 2017 年 4 月 28 日到期(EOL)并且不再收到安全补丁或更新。

** 相反,请参阅:** 此指南可能仍然有用作为参考,但可能不会在其他Ubuntu版本上工作. 如果可用,我们强烈建议使用为您正在使用的Ubuntu版本撰写的指南。

介绍


对于 Web 应用程序和网站来说,灵活的搜索和索引几乎总是有用的,有时是绝对必要的. 虽然有很多复杂的解决方案可以管理数据,并允许您通过 HTTP 方法检索和交互,但由于其易于配置和令人难以置信的模拟性,ElasticSearch** 已经获得了普及。

在本文中,我们将讨论如何与ElasticSearch互动,以便根据您的具体需求使用它. 我们将在Ubuntu 12.04 VPS上展示这一点。

要遵循,您必须使用本教程 安装 ElasticSearch,我们将假定您使用该项目网站提供的最新.deb 文件安装了 ElasticSearch。

ElasticSearch 如何工作


在深入了解 ElasticSearch 使用的关键问题之前,重要的是了解软件如何实现其解决方案。

ElasticSearch 提供了 RESTful API,您可以以各种方式进行交互,这基本上是一种界面类型,描述了客户端和服务器的交互方式。如果说服务器是RESTful,它提供了通过常见的 HTTP 方法(GET, POST, PUT, DELETE)进行交互的方式,并且不保持状态信息。

ElasticSearch 暴露了一个 API,允许您使用 HTTP 词汇与数据进行交互,并通过使用 URI 组件传递参数和信息。

在典型的 ElasticSearch 交互中,您指定您正在使用的操作来确定要对数据执行什么类型的操作. 要获取信息,您可以使用GET命令。

采用粗糙方法


CRUD是指创建、阅读、更新和删除,这些都是有效管理持久数据存储所需的操作,幸运的是,它们在 HTTP 方法中也具有逻辑等同性,这使得使用标准方法进行互动很容易。

ElasticSearch 提供可以执行所有这些功能的 API 访问,我们将讨论 ElasticSearch 如何执行这些类型的操作。

为了方便解释,我们将使用弯曲来演示,因为您可以明确表示 HTTP 方法,您可以从终端会话中轻松地与 ElasticSearch 交互。

默认情况下,ElasticSearch 可以通过服务器上的端口 9200 访问。

创建内容


ElasticSearch 中的对象创建通常被称为索引,这只是将数据添加到商店并决定类别的过程,我们可以使用 HTTP 方法 PUT 或 POST 在 ElasticSearch 中创建对象。

在最简单的形式中,您可以指定将数据发布的 索引、存储的对象的 类型和您存储的对象的 id

curl -X PUT http://server_name.com:9200/index/type/object_id -d '{ <document data> }'

在这种情况下,该索引可以被视为数据库,它是顶级组织单位,可以将某些信息从其他信息中分离开来。

类型是一种任意类型分类。它可以是任何东西,但可以用来将某些信息组合在一起.例如,您可以有一个用户文档的数据类型。

如果您正在使用 PUT 命令创建该 id,则可以指定该 id,或者如果您选择使用 POST 命令,则可以放弃自动生成。

-d旗之后,你会进入你想存储的对象. 这是一个具有灵活格式的JSON类型对象. 类别是在飞行上创建的,所以你可以指定你想要的任何东西。

例如,如果我们正在构建我们的游乐场设备的索引,我们可以索引这样的幻灯片:

1curl -XPUT "http://localhost:9200/playground/equipment/1" -d ' { "type": "slide", "quantity": 2 }'

您应该收到回复,表明操作成功:

1{"ok":true,"_index":"playground","_type":"equipment","_id":"1","_version":1}

正如您所看到的,这基本上告诉您,它与您提供的信息进行了索引。

由于 PUT 命令可用于更新信息以及创建信息,您可能需要指定您想要创建记录,而不是更新已经存在的记录。

1curl -XPUT "http://localhost:9200/playground/equipment/1/_create" -d '{ "type": "slide", "quantity": 2 }'

这会导致API调用返回错误,如果文档已经存在:

1{"error":"DocumentAlreadyExistsException[[playground][2] [equipment][1]: document already exists]","status":409}

阅读内容


将数据添加到索引的整个点是获得在以后的时刻获取该数据的能力,我们使用HTTP GET方法访问API来读取内容。

获取数据的最基本方法是通过索引、类型和 id 来指定确切的对象:

1curl -XGET "http://localhost:9200/playground/equipment/1"

这将返回我们在创建对象时收到的文档信息. 附加到此输出中是一个名为 `_source' 的密钥,其中包含文档本身作为其值:

1{"_index":"playground","_type":"equipment","_id":"1","_version":2,"exists":true, "_source" :  { "type": "slide", "quantity": 1 }}

对于我们的目的,我们可能希望输出更加人性化,所以我们可以在请求的末尾附上漂亮:

1curl -XGET "http://localhost:9200/playground/equipment/1?pretty"

1{
2    "_index" : "playground",
3    "_type" : "equipment",
4    "_id" : "1",
5    "_version" : 2,
6    "exists" : true, "_source" : { "type": "slide", "quantity": 1 }
7}

通常,我们只想返回文档本身,我们可以通过附加 /_source 到查询字符串来做到这一点:

1curl -XGET "http://localhost:9200/playground/equipment/1/_source?pretty"

1{ "type": "slide", "quantity": 1 }

如果我们只想返回特定字段,我们可以通过在查询的末尾添加一个 ?fields=<field1>,<field1>:

1curl -XGET "http://localhost:9200/playground/equipment/1?fields=type"

这将添加一个名为字段的添加密钥,其中包含过滤的 _source 的 JSON 对象:

1{"_index":"playground","_type":"equipment","_id":"1","_version":2,"exists":true,"fields":{"type":"slide"}}

更新内容


我们可以通过使用 HTTP POST 命令轻松更新内容,这将允许我们使用线程脚本和参数修改数据,另一种选择是只使用 PUT 命令,并基本上用更换(更新)对象重新创建对象。

我们可以使用 POST 命令更新数据对象,并将 `/_update 附加到 URI. 我们将它传递给一个具有‘script’ 和‘params’ 密钥的对象。

例如,要更新我们游乐场上的幻灯片数量,我们可以输入这样的东西:

1curl -XPOST "http://localhost:9200/playground/equipment/1/_update" -d '{ "script": "ctx._source.quantity += step", "params": { "step": 1 } }'

如果我们在完成此操作后阅读数据,我们可以看到数量已经增加:

1curl -XGET "http://localhost:9200/playground/equipment/1/_source"

1{"type":"slide","quantity":3}

我们可以通过简单地更新对象并将值分配给新密钥来添加任意新字段:

1curl -XPOST "http://localhost:9200/playground/equipment/1/_update" -d '{ "script": "ctx._source.name_of_new_key = \"value of new field\"" }'

请注意,您可能需要逃避一些报价标记,以避免混淆引擎。

我们还可以通过调用源的 .remove 方法来删除字段,并传递字段名称:

1curl -XPOST "http://localhost:9200/playground/equipment/1/_update" -d '{ "script": "ctx._source.remove(\"name_of_new_key\")" }'

如果传递脚本对你试图执行的操作太复杂,你也可以简单地引用你想要更新的字段,并通过使用doc键来传输新的值,而不是上面的示例中的script:

1curl -XPOST "http://localhost:9200/playground/equipment/1/_update" -d '{ "doc" : { "type": "swing" } }'

现在,我们可以再次找到文档,它的类型被取代了旋转:

1curl -XGET "http://localhost:9200/playground/equipment/1/_source"

1{"type":"swing","quantity":3}

删除内容


ElasticSearch 中的删除操作是相当直接的,它只会删除具有匹配 ID 的文档,我们可以通过使用 DELETE 命令通过 HTTP 实现此功能。

例如,要删除我们玩场索引中有 36 的 ID 的文档,我们可以使用以下命令:

1curl -XDELETE "http://localhost:9200/playground/equipment/36"

1{"ok":true,"found":true,"_index":"playground","_type":"equipment","_id":"36","_version":2}

如果没有匹配命令的对象,你会得到一个看起来像这样的响应:

1{"ok":true,"found":false,"_index":"playground","_type":"equipment","_id":"36","_version":1}

找到密钥是指是否找到并处理了匹配对象。

搜索内容


我们可以通过/_search URI 组件来搜索我们的对象,这可以用于服务器本身,索引后,或类型后,取决于您想要搜索的领域。

例如,要在服务器上搜索所有内容的数量为4,我们可以使用这样的搜索字符串:

1curl -XGET "http://localhost:9200/_search?q=quantity:4'

1{"took":5,"timed_out":false,"_shards":{"total":25,"successful":25,"failed":0},"hits":{"total":1,"max_score":1.0,"hits":[{"_index":"playground","_type":"equipment","_id":"1","_score":1.0, "_source" : {"type":"slide","quantity":4}}]}}

这是另一个领域,通过漂亮参数可以是有帮助的:

1curl -XGET "http://localhost:9200/_search?q=quantity:4&pretty"

 1{
 2  "took" : 14,
 3  "timed_out" : false,
 4  "_shards" : {
 5    "total" : 25,
 6    "successful" : 25,
 7    "failed" : 0
 8  },
 9  "hits" : {
10    "total" : 1,
11    "max_score" : 1.0,
12    "hits" : [ {
13      "_index" : "playground",
14      "_type" : "equipment",
15      "_id" : "1",
16      "_score" : 1.0, "_source" : {"type":"slide","quantity":4}
17    } ]
18  }
19}

如果您只想搜索游乐场设备,并排除其他区域,您可以通过在 URI 中添加索引和类型来更改搜索域:

1curl -XGET "http://localhost:9200/playground/equipment/_search?q=quantity:4&pretty"

如果要指定类型,但不包括索引,则可以用 _all 代替索引:

1curl -XGET "http://localhost:9200/_all/equipment/_search?q=quantity:4&pretty"

您还可以使用 ElasticSearch 域特定的语言进行搜索,该语言作为一个看起来非常像标准 JSON 的文档传输:

1curl -XGET "http://localhost:9200/playground/equipment/_search" -d '{ "query": { "term": { "type": "slide" } } }'

搜索和过滤结果的选项还有很多,但这为您如何获取已存储的数据提供了很好的基础。

结论


ElasticSearch是一个灵活的解决方案,可以轻松和动态地索引文本对象. 如果您可以编程地索引内容,那么这个解决方案在生成搜索结果方面几乎无限,您的应用程序或用户可以利用。

虽然这篇文章介绍了使用ElasticSearch的一些基本概念,但您通过程序或网站与搜索互动的方式完全取决于您,您可以将其用作一个工具,以快速获得一些基本的搜索功能,或者您可以创建复杂的对象索引,这将允许您以极其精细的方式访问您的数据。

By Justin Ellingwood
Published At
Categories with 技术
comments powered by Disqus