如何与Elasticsearch交互取决于你是否使用Java。
交互
Java API
Elasticsearch为Java用户提供了两种内置客户端:
- 节点客户端(node client):节点客户端以无数据节点(none data node)身份加入集群,换言之,它自己不存储任何数据,但是它知道数据在集群中的具体位置,并且能够直接转发请求到对应的节点上。
- 传输客户端(Transport client):这个更轻量的传输客户端能够发送请求到远程集群。它自己不加入集群,只是简单转发请求给集群中的节点。
- 两个Java客户端都通过9300端口与集群交互,使用Elasticsearch传输协议(Elasticsearch Transport Protocol)。集群中的节点之间也通过9300端口进行通信。如果此端口未开放,你的节点将不能组成集群。
TIP:Java客户端所在的Elasticsearch版本必须与集群中其他节点一致,否则,它们可能互相无法识别。
- 两个Java客户端都通过9300端口与集群交互,使用Elasticsearch传输协议(Elasticsearch Transport Protocol)。集群中的节点之间也通过9300端口进行通信。如果此端口未开放,你的节点将不能组成集群。
基于HTTP协议,以JSON为数据交互格式的RESTFul API
其他所有程序语言都可以使用RESTFul API,通过9200端口的与Elasticsearch进行通信,你可以使用你喜欢的Web客户端,事实上,如你所见,你甚至可以通过curl
命令与Elasticsearch通信。
NOTE
Elasticsearch官方提供了多种程序语言的客户端——Groovy,JavaScript, .NET,PHP,Perl,Python,以及 Ruby——还有很多由社区提供的客户端和插件,所有这些可以在文档中找到。
向Elasticsearch发出的请求的组成部分与其它普通的HTTP请求是一样的:curl -X '://:/?' -d ''
- 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格式的请求主体(如果请求需要的话)
举例说明,为了计算集群中的文档数量,我们可以这样做:
-
curl -XGET 'http://localhost:9200/_count?pretty' -d ' { "query": { "match_all": {} } } '
- Elasticsearch返回一个类似
200 OK
的HTTP状态码和JSON格式的响应主体(除了HEAD
请求)。上面的请求会得到如下的JSON格式的响应主体:{ "count" : 0, "_shards" : { "total" : 5, "successful" : 5, "failed" : 0 } }
- 我们看不到HTTP头是因为我们没有让
curl
显示它们,如果要显示,使用curl
命令后跟-i
参数:curl -i -XGET 'localhost:9200/'
对于本书的其余部分,我们将简写curl
请求中重复的部分,例如主机名和端口,还有curl
命令本身。
- 一个完整的请求形如:
curl -XGET 'localhost:9200/_count?pretty' -d ' { "query": { "match_all": {} } }'
- 我们将简写成这样:
GET /_count { "query": { "match_all": {} } }
- 事实上,在Sense控制台中也使用了与上面相同的格式。
面向文档
- 应用中的对象很少只是简单的键值列表,更多时候它拥有复杂的数据结构,比如包含日期、地理位置、另一个对象或者数组。
- 总有一天你会想到把这些对象存储到数据库中。将这些数据保存到由行和列组成的关系数据库中,就好像是把一个丰富,信息表现力强的对象拆散了放入一个非常大的表格中:你不得不拆散对象以适应表模式(通常一列表示一个字段),然后又不得不在查询的时候重建它们。
- Elasticsearch是面向文档(document oriented) 的,这意味着它可以存储整个对象或文档(document) 。然而它不仅仅是存储,还会索引(index) 每个文档的内容使之可以被搜索。在Elasticsearch中,你可以对文档(而非成行成列的数据)进行索引、搜索、排序、过滤。这种理解数据的方式与以往完全不同,这也是Elasticsearch能够执行复杂的全文搜索的原因之一。
JSON
- Elasticsearch使用JavaScript对象符号(JavaScript Object Notation) ,也就是JSON,作为文档序列化格式。JSON现在已经被大多语言所支持,而且已经成为NoSQL领域的标准格式。它简洁、简单且容易阅读。以下使用JSON文档来表示一个用户对象:
{ "email": "john@jiangguo.net", "first_name": "John", "last_name": "Smith", "info": { "bio": "Eco-warrior and defender of the weak", "age": 25, "interests": [ "dolphins", "whales" ] }, "join_date": "2021/05/01" }
- 尽管原始的
user
对象很复杂,但它的结构和对象的含义已经被完整的体现在JSON中了,在Elasticsearch中将对象转化为JSON并做索引要比在表结构中做相同的事情简单的多。
NOTE
尽管几乎所有的语言都有相应的模块用于将任意数据结构转换为JSON,但每种语言处理细节不同。具体请查看“
serialization
” or “marshalling
”两个用于处理JSON的模块。Elasticsearch官方客户端会自动为你序列化和反序列化JSON。
下一节:我们现在开始进行一个简单教程,它涵盖了一些基本的概念介绍,比如索引(indexing)、搜索(search)以及聚合(aggregations)。通过这个教程,我们可以让你对Elasticsearch能做的事以及其易用程度有一个大致的感觉。
我们接下来将陆续介绍一些术语和基本的概念,但就算你没有马上完全理解也没有关系。我们将在本书的各个章节中更加深入的探讨这些内容。
所以,坐下来,开始以旋风般的速度来感受Elasticsearch的能力吧!