与Elasticsearch交互
如何与Elasticsearch交互取决于你是否使用Java
Java API
Elasticsearch为Java用户提供了两种内置客户端
节点客户端(node client)
自己不存储任何数据,但他知道数据在集群中的具体位置,并且能够直接转发请求到对应的节点上传输客户端(Transport client)
这个更轻量的传输客户端能够发送请求到远程集群。它自己不加入集群,只是简单转发请求给集群中的节点。
基于HTTP协议,以JSON为数据交互格式的RESTful API
其他所有程序语言都可以使用RESTful API,通过9200端口与Elasticsearch进行通信,也可以使用你喜欢的WEB客户端,事实上,如你所见,你甚至可以通过curl
命令与Elasticsearch通信。
向Elasticsearch发出的请求的组成部分与其他普通的HTTP请求是一样的:
curl -X<VERB> '<PROTOCOL>://<HOST>:<POST>/<PATH>?<QYERY_STRING>' -d '<BODY>'
- VERB HTTP方法:GET POST PUT HEAD DELETE
- PROTOCOL http或者https协议(只有在Elasticsearch前面有https代理的时候可用)
- HOST Elasticsearch集群中的任何一个节点的主机名,如果是在本地的节点,那么就叫localhost
- POST Elasticsearch HTTP服务所在的端口,默认为9200
- PATH API路径(例如
_count
将返回集群中文档的数量),PATH可以包含多个组建,例如_cluster/stats
或者_nodes/stats/jvm
- QUERY_STRING 一些可选的查询请求参数,例如
?pretty
参数将使请求返回更加美观易读的JSON数据 - BODY 一个JSON格式的请求主题(如果请求需要的话)
举例说明,为了计算集群中文档数量,我们可以这样做:
curl -XGET 'http://localhost:9200/_count?prety' -d'
{
"query": {
"match_all": {}
}
}
'
Elasticssearch返回一个类似200 OK
的HTTP状态码和JSON格式的响应主体(除了HEAD请求)。上面的请求会得到如下的JSON格式的响应主体:
{
"count": 0,
"_shards";{
"total": 6,
"successful": 5,
"failed": 0
}
}
我们看不到HTTP头是因为我们没有让curl
显示它们,如果要显示,使用curl
后跟-i
参数:
curl -i -XGET 'localhost:9200/'
一个完整的请求形如:
curl -XGET 'localhost:9200/_count?pretty' -d '
{
"query": {
"match_all": {}
}
}
'
我们将简写成这样:
GET /_count
{
"query": {
"match_all": {}
}
}
事实上,在Sense控制台中也使用了与上面相同的格式。
面向文档
应用中的对象很少只是简单的键值列表,更多时候它拥有复杂的数据结构,比如包含日期、地理位置、另一个对象或者数组。
总有一天你会想到把这些对象存储到数据库中,将这些数据保存到由行和列组成的关系数据库中,就好象是把一个丰富信息表现力强的对象拆散了放入一个非常大的表格中,你不得不拆散对象以适应表模式(通常一列表示一个字段),然后又不得不在查询的时候重建它们。
Elasticsearch是面向文档的,这意味着它可以存储整个对象或文档。然而它不仅仅是存储,还会索引每个文档的内容使之可以搜索。在Elasticsearch中,你可以对文档(而非成行成列的数据)进行索引、搜索、排序、过滤。这中理解数据的方式与以往完全不同,这也是Elasticsearch能够执行复杂的全文搜索的原因之一。
JSON
Elasticsearch使用Javascript对象符号,也就是JSON,作为文档序列化格式。JSON现在已经被大多语言所支持,而且已经成为NoSQL领域的标准格式。它简洁、简单且容易阅读。
以下使用JSON文档来表示一个用户对象:
{
"email":"john@smith.com",
"first_name":"John",
"last_name":"smith",
"info":{
"bio":"Eco-warrior and defender of the weak",
"age":25,
"interests":["dolphins","whales"]
},
"hoin_data":"2018/07/22"
}
尽管原始的user
对象很复杂,但它的含义和结构已经北完整的体现在JSON中了,在Elasticsearch中将对想转化为JSON并做索引要比在表结构中做相同的事情简单的多。