1、访问Elasticsearch 的客户端主要有:
1>Elasticsearch为Java用户提供了两种内置客户端: 节点客户端(node client) 传输客户端(Transport client)
节点客户端(node client)
java程序中实例化该对象,之后对该对象发起查询。该对象将会以无数据节点的身份加入集群,即它将会成为集群的一个节点,用来转发请求到其他数据节点并接受返回数据
传输客户端(Transport client)
java客户端实例化该对象,之后对该对象发起查询。该对象不会作为节点加入集群,直接将请求传送给集群并等待查询结果返回。
上述两种客户端都工作在9300端口,注意java程序实例化的客户端必须与集群中其他节点版本一致,否则可能互相无法通讯。
java客户端使用方法及实例参看:https://www.elastic.co/guide/en/elasticsearch/client/index.html ##自选版本,注意你的elasticsearch集群要与你的实例化的对象一致啊。
2>基于HTTP协议,以JSON为数据交互格式的RESTful API
其他所有程序语言都可以使用RESTful API,通过9200端口的与Elasticsearch进行通信,你可以使用你喜欢的WEB客户端,事实上,如你所见,你甚至可以通过curl
命令与Elasticsearch通信。
NOTE:Elasticsearch官方提供了多种程序语言的客户端——Groovy,Javascript, .NET,PHP,Perl,Python,以及 Ruby——还有很多由社区提供的客户端和插件,所有这些可以在文档中找到。
其他语言参考客户端:https://www.elastic.co/guide/en/elasticsearch/client/index.html
2、下边对我们经常使用的curl命令进行简要介绍:
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格式的请求主体(如果请求需要的话)
举例说明,为了计算集群中的文档数量,我们可以这样做:
curl -XGET 'http://localhost:9200/_count?pretty' -d '
{
"query": {
"match_all": {}
}
}
'
3、索引数据。将下边语句放入sense控制台
Elasticsearch中,文档归属于一种类型(type),而这些类型存在于索引(index)中,我们可以画一些简单的对比图来类比传统关系型数据库:
Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices -> Types -> Documents -> Fields
//向索引megacorp和employee类型中添加3篇文档
PUT /megacorp/employee/1
{
"first_name" : "John",
"last_name" : "Smith",
"age" : 25,
"about" : "I love to go rock climbing",
"interests": [ "sports", "music" ]
}
PUT /megacorp/employee/2
{
"first_name" : "Jane",
"last_name" : "Smith",
"age" : 32,
"about" : "I like to collect rock albums",
"interests": [ "music" ]
}
PUT /megacorp/employee/3
{
"first_name" : "Douglas",
"last_name" : "Fir",
"age" : 35,
"about": "I like to build cabinets",
"interests": [ "forestry" ]
}
4、搜索聚合查询
//搜索GET /megacorp/employee/1
GET /megacorp/employee/_search
GET /megacorp/employee/_search?q=last_name:Smith ##字符串查询
GET /megacorp/employee/_search ##DSL查询
{
"query" : {
"match" : {
"last_name" : "Smith"
}
}
}
GET /megacorp/employee/_search ###DSL查询之过滤查询
{
"query" : {
"filtered" : {
"filter" : {
"range" : {
"age" : { "gt" : 30 }
}
},
"query" : {
"match" : {
"last_name" : "smith"
}
}
}
}
}
GET /megacorp/employee/_search ##DSL之
全文查询
{
"query" : {
"match" : {
"about" : "rock climbing"
}
}
}
GET /megacorp/employee/_search ##DSL查询之全文查询(短语匹配)
{
"query" : {
"match_phrase" : {
"about" : "rock climbing"
}
}
}
GET /megacorp/employee/_search ###DSL查询之高亮查询结果。返回结果将会把about字段内容也复制一份到highlight中。
{
"query" : {
"match_phrase" : {
"about" : "rock climbing"
}
},
"highlight": {
"fields" : {
"about" : {}
}
}
}
//统计分析
GET /megacorp/employee/_search ##对interests字段进行聚合统计
{
"aggs": {
"all_interests": {
"terms": { "field": "interests" }
}
}
}
GET /megacorp/employee/_search ##查询过滤后在进行统计
{
"query": {
"match": {
"last_name": "smith"
}
},
"aggs": {
"all_interests": {
"terms": {
"field": "interests"
}
}
}
}
GET /megacorp/employee/_search ##聚合完后再次对每一组进行子聚合
{
"aggs" : {
"all_interests" : {
"terms" : { "field" : "interests" },
"aggs" : {
"avg_age" : {
"avg" : { "field" : "age" }
}
}
}
}
}
5、总结:这里仅仅对elasticsearch 索引数据、查询数据、统计查询和API简要介绍。系统的进行学习相关查询统计语句才能更好的使用elasticsearch进行数据的存储和检索及统计。
后方将着重会对数据的检索和统计进行总结(查询和统计是各种客户端最常用的语句)。然后对数据的索引进行详细的总结。