介绍
灵活的搜索和索引web应用程序和网站几乎总是有用的,有时是绝对必要的。 虽然有很多复杂的解决方案,管理数据,并允许您检索和通过HTTP方式与之交互,ElasticSearch已经得到普及,由于其简单的配置和令人难以置信的延展性。
在本文中,我们将讨论如何与ElasticSearch进行交互,以便根据您的特定需求使用它。 我们将在Ubuntu 12.04 VPS上演示这个。
跟着一起,您必须安装ElasticSearch使用本教程。 我们假设您使用项目网站提供的最新.deb文件安装了ElasticSearch。
ElasticSearch如何工作
在深入了解ElasticSearch使用的螺母和螺栓之前,了解软件如何实施其解决方案非常重要。
ElasticSearch提供了一个RESTful API,您可以通过各种方式进行交互。 这基本上是一种描述客户端和服务器交互方式的接口类型。 如果服务器被称为“RESTful”,它提供了一种通过常用HTTP方法(GET,POST,PUT,DELETE)进行交互的方法,并且不维护状态信息。 每个请求都是独立的,资源以常见的文本格式(如JSON)返回。
ElasticSearch公开了一个API,允许您使用HTTP动词与数据交互,并通过使用URI组件传递参数和信息。 这意味着它基于URI的格式来存储数据。
在典型的ElasticSearch交互中,您需要指定用于确定对后续数据执行哪种操作的操作。 检索信息,您可以使用GET
命令。 要创建或更新记录,你可以使用一个PUT
或POST
命令。
实现CRUD方法
CRUD表示创建,读取,更新和删除。 这些都是有效管理持久性数据存储所需的所有操作。 幸运的是,这些在HTTP方法中也有逻辑等同,这使得使用标准方法进行交互变得容易。 CRUD方法分别由HTTP方法POST,GET,PUT和DELETE实现。
ElasticSearch提供可以执行所有这些功能的API访问。 我们将讨论ElasticSearch如何做这些类型的操作。
为了便于说明,我们将使用curl
来证明,因为你可以明确说明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,或者如果选择使用POST命令,则可以将其关闭以自动生成,可以指定ID。
后-d
标志,你,你想存储对象通过。 这是一个类似JSON的对象,具有灵活的格式。 类别是即时创建的,因此您可以指定任何您想要的。
例如,如果我们正在为我们的游乐场设备建立一个索引,我们可以这样索引幻灯片:
curl -XPUT "http://localhost:9200/playground/equipment/1" -d ' { "type": "slide", "quantity": 2 }'
您应该收到一个回应,指示操作成功:
{"ok":true,"_index":"playground","_type":"equipment","_id":"1","_version":1}
正如你可以看到,这基本上告诉你,它已索引与您提供的信息。 您也可能注意到您的信息已版本化。 这对以后的查询很有用。
因为PUT命令可用于更新信息以及创建它,您可能希望指定要创建记录,而不更新已经存在的记录。 要做到这一点,只需添加/_create
到你的URI的结尾:
curl -XPUT "http://localhost:9200/playground/equipment/1/_create" -d '{ "type": "slide", "quantity": 2 }'
如果文档已存在,这将导致API调用返回错误:
{"error":"DocumentAlreadyExistsException[[playground][2] [equipment][1]: document already exists]","status":409}
阅读内容
将数据添加到索引的整个点是获得在稍后时间点检索该数据的能力。 我们使用HTTP GET方法访问API来读取内容。
检索数据的最基本的方法是通过索引,类型和id指定确切的对象:
curl -XGET "http://localhost:9200/playground/equipment/1"
这将返回我们在创建对象时收到的有关文档的信息。 追加到这个输出是一个名为关键_source
包含文档本身的价值:
{"_index":"playground","_type":"equipment","_id":"1","_version":2,"exists":true, "_source" : { "type": "slide", "quantity": 1 }}
对于我们而言,我们可能想输出更人性化,所以我们可以追加?pretty
到请求结束:
curl -XGET "http://localhost:9200/playground/equipment/1?pretty"
{
"_index" : "playground",
"_type" : "equipment",
"_id" : "1",
"_version" : 2,
"exists" : true, "_source" : { "type": "slide", "quantity": 1 }
}
通常,我们只需要返回文档本身。 我们可以通过附加做到这一点/_source
到查询字符串:
curl -XGET "http://localhost:9200/playground/equipment/1/_source?pretty"
{ "type": "slide", "quantity": 1 }
如果我们想回到只有特定的领域,我们可以通过添加一个这样做的?fields=<field1>,<field1>
到查询的结尾:
curl -XGET "http://localhost:9200/playground/equipment/1?fields=type"
这将添加一个添加一个名为领域的关键包含与过滤的JSON对象_source
:
{"_index":"playground","_type":"equipment","_id":"1","_version":2,"exists":true,"fields":{"type":"slide"}}
更新内容
我们可以使用HTTP POST命令轻松更新内容。 这将允许我们使用内联脚本和参数修改数据。 另一个选项是只使用PUT命令,并基本上用重置(更新)对象“重新创建”对象。
我们可以更新使用POST命令,并追加一个数据对象/_update
到URI。 我们通过它与键的对象script
和params
。 它可以通过使用前缀引用文件中的内部定义键ctx._source
。
例如,要更新我们的操场上的幻灯片数量,我们可以输入如下:
curl -XPOST "http://localhost:9200/playground/equipment/1/_update" -d '{ "script": "ctx._source.quantity += step", "params": { "step": 1 } }'
如果我们在完成此操作后读取数据,我们可以看到“数量”已增加:
curl -XGET "http://localhost:9200/playground/equipment/1/_source"
{"type":"slide","quantity":3}
我们可以通过简单地更新对象并将值分配给新键来添加任意新字段:
curl -XPOST "http://localhost:9200/playground/equipment/1/_update" -d '{ "script": "ctx._source.name_of_new_key = \"value of new field\"" }'
请注意,您可能需要转义一些引号,以避免混淆引擎。
我们也可以通过调用删除字段.remove
源的方法并传递字段名称:
curl -XPOST "http://localhost:9200/playground/equipment/1/_update" -d '{ "script": "ctx._source.remove(\"name_of_new_key\")" }'
如果传递脚本对于您尝试执行的操作来说太复杂,您还可以简单地引用要更新的字段,并使用“doc”键而不是前面的“脚本”来传递新值例子:
curl -XPOST "http://localhost:9200/playground/equipment/1/_update" -d '{ "doc" : { "type": "swing" } }'
现在,我们可以再次找到文档,它的“类型”已经替换为“swing”:
curl -XGET "http://localhost:9200/playground/equipment/1/_source"
{"type":"swing","quantity":3}
删除内容
ElasticSearch中的删除操作相当简单。 它只是删除具有匹配ID的文档。 我们可以通过使用DELETE命令通过HTTP达到这一点。
例如,要删除我们的playground索引中ID为36的文档,我们可以使用这个命令:
curl -XDELETE "http://localhost:9200/playground/equipment/36"
{"ok":true,"found":true,"_index":"playground","_type":"equipment","_id":"36","_version":2}
这表示操作成功。 如果没有匹配该命令的对象,您会得到一个如下所示的响应:
{"ok":true,"found":false,"_index":"playground","_type":"equipment","_id":"36","_version":1}
“found”键是告诉是否找到和处理匹配对象的键。
搜索内容
我们可以搜索通过将我们的对象/_search
URI组件。 这可以在服务器本身之后,在索引之后,或在类型之后使用,这取决于您要搜索的领域。
例如,要在服务器上搜索数量为“4”的任何内容,我们可以使用如下所示的搜索字符串:
curl -XGET "http://localhost:9200/_search?q=quantity:4'
{"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}}]}}
这是另一个领域,传递“漂亮”参数可能是有帮助的:
curl -XGET "http://localhost:9200/_search?q=quantity:4&pretty"
{
"took" : 14,
"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}
} ]
}
}
如果您只想在游乐场设备中搜索并排除其他区域,则可以通过在URI中包括索引和类型来更改搜索域:
curl -XGET "http://localhost:9200/playground/equipment/_search?q=quantity:4&pretty"
如果要指定类型,但不包括索引,则可以替代与索引_all
:
curl -XGET "http://localhost:9200/_all/equipment/_search?q=quantity:4&pretty"
您还可以使用ElasticSearch域特定语言进行搜索,该语言以类似于标准JSON的文档形式传递:
curl -XGET "http://localhost:9200/playground/equipment/_search" -d '{ "query": { "term": { "type": "slide" } } }'
还有更多选项用于搜索和过滤结果,但这为如何检索已存储的数据提供了良好的基础。
结论
ElasticSearch是一个灵活的解决方案,可以轻松和动态地索引文本对象。 如果您可以通过编程方式索引内容,那么此解决方案在生成您的应用程序或用户可以使用的搜索结果的能力方面几乎是无限的。
虽然本文向您介绍了如何使用ElasticSearch的一些基本概念,但您通过程序或网站与搜索进行交互的方式完全取决于您。 您可以将其用作快速获得一些基本搜索功能的工具,或者您可以创建精细的对象索引,以允许您以极精细的方式访问数据。 ElasticSearch只是一个引擎,你可以连接起来满足你的应用程序需求。