ElasticSearch为Java用户提供了两种内置客户端:
1.节点客户端:以无数据节点身份加入集群,(无数据节点的含义就是不存储任何数据)但他知道数据在集群中的具体位置,并能直接转发请求到对应节点上。
2.传输客户端:不加入集群,只是简单转发请求给集群中的节点。
两个客户端都通过9300端口与集群交互。集群中的节点之间也通过9300端口通信。
一个节点是一个单一的服务器,是集群的一部分,存储数据,并且参与集群的索引和搜索功能。通过配置特定的集群名称来加入特定的集群。
一个集群是由一个或多个节点(服务器)组成的。 一个集群中只有一个节点是有效的并且是非常好的。
向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格式的请求主体(如果请求需要的话)
1.索引
Elasticsearch是面向文档(document oriented)的,它可以存储整个对象或文档(document)。然而它不仅仅是存储,还会索引(index)每个文档的内容使之可以被搜索。
在elasticSearch中存储数据的行为叫做索引(index)(数据库),每个文档归属于类型(type)(表)。每一个类型包含多个文档(document)(记录、行),每个文档包含多个字段(field)(字段)。
Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices(对应数据库) -> Types(对于数据表) -> Documents(对应表的记录) -> Fields(字段)
在elasticSearch中“索引”的含义:
-
类似于传统关系数据库的数据库名称
-
类似于数据库中的insert关键字。
-
倒排索引,类似于数据库中的特定列的索引。
eg:创建员工目录:为每个员工的文档建立索引user,每个文档的类型为employee,索引存储在ElasticSearch集群中 。
path:PUT /megacorp/employee/1
{
"first_name" : "李",
"last_name" : "尔",
"age" : 25,
"about" : "我喜欢爬山、游泳",
"interests": [ "运动", "音乐" ]
}
path包含三部分信息:
名字 | 说明 |
megacorp | 索引名 |
employee | 类型名 |
1 | 这个员工的ID |
在目录中加入更多员工信息。
2.检索文档
-
索引过程已经存储了一些数据,体验elasticSearch检索单个员工的信息。 执行HTTP GET请求并指出文档的“地址”——索引、类型和ID既可。
GET /megacorp/employee/1
-
在结尾使用关键字_search来取代原来的文档ID。响应内容的hits数组中包含了我们所有的三个文档。默认情况下搜索会返回前10个结果
GET /megacorp/employee/_search
-
查询字符串查询(参数在url中)
GET /megacorp/employee/_search?q=last_name:尔
-
使用DSL语句查询(参数使用json格式传递)
GET /megacorp/employee/_search
{
"query" : {
"match" : {
"last_name" : "尔"
}
}
}
复杂的搜索之添加搜索过滤器
eg:得到年龄大于22岁的员工(大于:gt,小于:lt)
GET /megacorp/employee/_search
{
"query" : {
"filtered" : {
"filter" : {
"range" : {
"age" : { "gt" : 22 }
}
},
"query" : {
"match" : {
"last_name" : "尔"
}
}
}
}
}
全文搜索。按照文档与查询条件的匹配程度排序并返回结果集。传统数据库中,只有匹配不匹配,没有匹配查询。
GET /megacorp/employee/_search
{
"query" : {
"match" : {
"about" : "爬"
}
}
}
短语搜索。只要将match查询变更为match_phrase查询即可。 查询同时包含"游"和"泳"(并且是相邻的)的员工记录
GET /megacorp/employee/_search
{
"query" : {
"match_phrase" : {
"about" : "游泳"
}
}
}
聚合。类似于数据库的group by(要先开启text类型)。
开启text类型
POST /megacorp/employee/
{
"properties": {
"interest": {
"type":"text",
"fielddata":true
}
}
}
找到所有职员中最大的共同点(兴趣爱好)是什么
GET /megacorp/employee/_search
{
"aggs": {
"all_interests": {
"terms": { "field": "interests" }
}
}
}