想要使用ElasticSearch,用于搜索第一步就是使用一些数据填充来索引,CRUD表“创建”或者“索引”。我们还将学习如何更新,读取和删除文档。
在ElasticSearch索引中,对应于CRUD中的“创建”和“更新” - 如果对具有给定类型的文档进行索引,并且要插入原先不存在的ID。 如果具有相同类型和ID的文档已存在,则会被覆盖。
要索引第一个JSON对象,我们对REST API创建一个PUT请求到一个由索引名称,类型名称和ID组成的URL。 也就是:http://localhost:9200/<index>/<type>/[<id>]
。
索引和类型是必需的,而id
部分是可选的。如果不指定ID
,ElasticSearch会为我们生成一个ID
。 但是,如果不指定id,应该使用HTTP的POST
而不是PUT
请求。
索引名称是任意的。如果服务器上没有此名称的索引,则将使用默认配置来创建一个索引。
至于类型名称,它也是任意的。 它有几个用途,包括:
现在我们来索引一些内容! 可以把任何东西放到索引中,只要它可以表示为单个JSON对象。 在本教程中,使用索引和搜索电影的一个示例。这是一个经典的电影对象信息:
{ "title": "The Godfather", "director": "Francis Ford Coppola", "year": 1972 }要创建一个索引,这里使用索引的名称为“movies”,类型名称(“movie”)和id(“1”),并按照上述模式使用JSON对象在正文中进行请求。
curl -XPUT "http://localhost:9200/movies/movie/1" -d' { "title": "The Godfather", "director": "Francis Ford Coppola", "year": 1972 }'可以使用curl来执行它,也可以使用Sense。这里使用Sense,可以自己填充URL,方法和请求正文,或者您以复制上述curl示例,将光标置于Sense中的正文字段中写入上面的Json对象,然后按点击绿色小箭头来执行创建索引操作。如下图所示
执行请求后,可以看到接收到来自ElasticSearch响应的JSON对象。如下所示
{ "_index": "movies", "_type": "movie", "_id": "1", "_version": 1, "result": "created", "_shards": { "total": 2, "successful": 1, "failed": 0 }, "created": true }响应对象包含有关索引操作的信息,例如它是否成功(“ok”)和文档ID,如果不指定则ElasticSearch会自己生成一个。
如果运行Sense提供的默认搜索请求(可以使用Sense中的“历史记录”按钮访问,因为确实已执行它)过了,就会看到返回有数据的结果。
{ "took": 146, "timed_out": false, "_shards": { "total": 5, "successful": 5, "failed": 0 }, "hits": { "total": 1, "max_score": 1, "hits": [ { "_index": "movies", "_type": "movie", "_id": "1", "_score": 1, "_source": { "title": "The Godfather", "director": "Francis Ford Coppola", "year": 1972 } } ] } }
curl -XPUT "http://localhost:9200/movies/movie/1" -d' { "title": "The Godfather", "director": "Francis Ford Coppola", "year": 1972, "genres": ["Crime", "Drama"] }'ElasticSearch的响应结果与前面的大体上一样,但有一点区别,结果对象中的
_version
属性的值为2
,而不是1
。响应结果如下
{ "_index": "movies", "_type": "movie", "_id": "1", "_version": 2, "result": "updated", "_shards": { "total": 2, "successful": 1, "failed": 0 }, "created": false }
版本号(_version
)可用于跟踪文档已编入索引的次数。它的主要目的是允许乐观的并发控制,因为可以在索引请求中提供一个版本,如果提供的版本高于索引中的版本,ElasticSearch将只覆盖文档内容,ID值不变,版本号自动添加。
上面已经学习了索引新文档以及更新存在的文档。还看到了一个简单搜索请求的示例。如果只是想检索一个具有已知ID的索引,一个方法是搜索索引中的文档。另一个简单而快速的方法是通过ID
,使用GET
来检索它。
简单的做法是向同一个URL发出一个GET请求,URL的ID部分是强制性的。通过ID从ElasticSearch中检索文档可发出URL的GET请求:http://localhost:9200/<index>/<type>/<id>
。
使用以下请求尝试获取电影信息:
curl -XGET "http://localhost:9200/movies/movie/1" -d''执行结果如下所示
正如下图所看到的,结果对象包含与索引时所看到的类似的元数据,如索引,类型和版本信息。 最后最重要的是,它有一个名称为“_source
”的属性,它包含实际获取的文档信息。
关于GET没有什么可说的,因为它很简单,继续最后删除操作。
为了通过ID从索引中删除单个指定的文档,使用与获取索引文档相同的URL,只是这里将HTTP方法更改为DELETE
。
curl -XDELETE "http://localhost:9200/movies/movie/1" -d''响应对象包含元数据方面的一些常见数据字段,以及名为“
_found
”的属性,表示文档确实已找到并且操作成功。
在执行DELETE
调用后切换回GET
,可以验证文档是否确实已删除。