前言
elasticsearch是个全文搜索工具,就是用来搜索的。现在来简单体验一下他的一些基本功能。
基本概念
在进行搜索之前,先了解一下elasticsearch的一些基本概念。
文档(document)
文档(document)是可以被索引的基本单位,在elasticsearch中文档用json格式来进行标示。如一个人员信息、某个产品信息。elasticsearch是面向文档的,这意味着它可以存储整个对象或文档(document)。然而它不仅仅是存储,还会索引(index)每个文档的内容使之可以被搜索。
类型(type)
在Elasticsearch,文档都归属一个类型(type),就如同java中类和对象一样,类型(type)就如同class,而文档(document)就如object。而这些类型存在于索引(index)中。
索引(index)
索引是具有某些相似特征的文档的集合。例如,您可以拥有客户数据的索引,产品目录的另一个索引,以及订单数据的另一个索引。索引由名称(必须全部为小写)标识,并且此名称用于在对其中的文档执行索引,搜索,更新和删除操作时引用索引。在单个集群中,您可以根据需要定义任意数量的索引。
一个索引(index)就像是传统关系数据库中的数据库,它是相关文档存储的地方。
在Elasticsearch中,文档归属于一种类型(type),而这些类型存在于索引(index)中,我们可以画一些简单的对比图来类比传统关系型数据库:
Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices -> Types -> Documents -> Fields
调用格式
在使用elasticsearch时,可以使用resetful API进行访问。
向Elasticsearch发出的请求的组成部分与其它普通的HTTP请求是一样的:
curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'
- VERB HTTP方法:GET, POST, PUT, HEAD, DELETE
PROTOCOL http或者https协议(只有在Elasticsearch前面有https代理的时候可用) - HOST Elasticsearch集群中的任何一个节点的主机名,如果是在本地的节点,那么就叫localhost
- PORT Elasticsearch HTTP服务所在的端口,默认为9200
- PATH API路径(例如_count将返回集群中文档的数量),PATH可以包含多个组件,例如_cluster/stats或者_nodes/stats/jvm
- QUERY_STRING 一些可选的查询请求参数,例如?pretty参数将使请求返回更加美观易读的JSON数据
- BODY 一个JSON格式的请求主体(如果请求需要的话)
简单使用
添加/修改数据
在查询之前,必须要添加几条数据。先来创建一个员工目录,为了创建员工目录,我们将进行如下操作:
- 为每个员工的文档(document)建立索引,每个文档包含了相应员工的所有信息。
- 每个文档的类型为employee。
- employee类型归属于索引megacorp。
- megacorp索引存储在Elasticsearch集群中。
下面来编写命令:
curl -XPUT http://localhost:9200/megacorp/employee/1 -d '
{
"first_name" : "John",
"last_name" : "Smith",
"age" : 25,
"about" : "I love to go rock climbing",
"interests": [ "sports", "music" ]
}'
path:/megacorp/employee/1
包含三部分信息:
名字 | 说明 |
---|---|
megacorp | 索引名 |
employee | 类型名 |
1 | 员工ID |
请求实体就是一个文档。
注:如果安装了x-pack后,执行这个命令后,会报401错误。这是由于x-pack的权限控制,需要用户名密码的原因。因此,这个命令我们需要加上用户名密码才能够执行通过:
curl -XPUT http://localhost:9200/megacorp/employee/1 -u elastic:changeme -d ''
接下来再加入两个:
curl -XPUT http://localhost:9200/megacorp/employee/2 -u elastic:changeme -d '
{
"first_name" : "Jane",
"last_name" : "Smith",
"age" : 32,
"about" : "I like to collect rock albums",
"interests": [ "music" ]
}'
curl -XPUT http://localhost:9200/megacorp/employee/3 -u elastic:changeme -d
'{
"first_name" : "Douglas",
"last_name" : "Fir",
"age" : 35,
"about": "I like to build cabinets",
"interests": [ "forestry" ]
}'
每次都输入这么长的curl命令 ,是不是很麻烦,这时候kibana的第一个作用就出来了。先启动kibana,然后输入http://localhost:5601
进入kibana(如果需要用户密码,还是elastic:changeme),进入后在左边工具栏找到dev tools,点击进入可以看到console 控制台,在左边输入简化的命令,点击运行 就可以出现结果,还会有关键词提示、json格式化功能。
上面的添加就可以在dev tools中简化为
PUT /megacorp/employee/3
{
"first_name" : "Douglas",
"last_name" : "Fir",
"age" : 35,
"about": "I like to build cabinets",
"interests": [ "forestry" ]
}
这样就很轻松吧。
使用 PUT 方法需要明确指定 ID,两次 PUT 的 id 相同则是替换之前的文档,第二次 id 不同则是创建新的文档
更新文档
将员工1的年龄 改为29
POST megacorp/employee/1/_update
{
“doc”:{“age”:29}
}}
使用GET 查看文档是否更新:
GET megacorp/employee/1
如果文档没有此字段,则会添加字段到文档中。更新只能一次在一个文档上执行。
删除文档
DELETE megacorp/employee/4
直接删除整个 index 要比删除 index 里的所有文档要更有效率
It is worth noting that it is much more efficient to delete a whole index instead of deleting all documents with the Delete By Query API.
批处理
批量添加:
POST customer/external/_bulk?pretty
{"index":{"_id":"1"}}
{"name":"John Doe"}
{"index":{"_id":"2"}}
{"name":"Jane Doe"}
更新、删除
POST customer/external/_bulk?pretty
{"update":{"_id":"1"}}
{"doc":{"name":"John Doe become Jane Doe"}}
{"delete":{"_id":"2"}}
批量API不会由于其中一个操作失败而失败。如果单个操作因任何原因失败,它将继续处理其后的其余操作。当批量API返回时,它将为每个操作(以相同的发送顺序)提供状态,以便您可以检查特定操作是否失败。