基于Apache Lucene构建的开源搜索引擎node
采用Java编写,提供了简单易用的RESTFul API数据库
轻松的横向拓展,可支持PB级的结构化和非结构化的数据处理数据结构
海量数据分析引擎curl
站内搜索引擎jvm
数据仓库搜索引擎
与Elaticsearch交互取决因而否使用Java Java API Elasticsearch为Java用户提供了两种内置客户端url
节点客户端以无数据节点(none data node)身份加入集群,它本身不存储任何数据,可是它知道数据在集群中的具体位置,而且可以直接妆发请求到对应的节点间上。spa
更轻量的传输客户端可以发生请求到远程集群。它本身不加入集群,只是简单转发请求给集群中的节点。3d
节点客户端和传输客户端都是经过9300端口与集群交互的,使用Elasticsearch传输协议。集群中的节点之间也是经过9300端口进行通讯的。若是这个端口没有开放,你的节点将没法组成集群。代理
注意:
Java客户端所在的Elasticsearch版本必须与集群中其余节点一致,不然,它们可能互相 没法识别。
其余的全部成勋语言均可以i使用RESTful API,经过9200端口与Elasticsearch进行通讯,可使用WEB客户端,甚至可使用curl命令与Elasticsearch通讯
向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集群中的任何一个节点的主机名,若是是在本地的节点,那么就叫 localhos
PORT Elasticsearch HTTP服务所在的端口,默认为9200
PATH API路径(例如_count将返回集群中文档的数量),PATH能够包含多个组件,例如 _cluster/stats或者_nodes/stats/jvm
QUERY_STRING 一些可选的查询请求参数,例如 ?pretty 参数将使请求返回更加美观 易读的JSON数据
BODY 一个JSON格式的请求主体(若是请求须要的话)
与传统的数据库的存储方式不一样,Elasticsearch是基于文档存储数据的,之前一个对象以一条记录存储在数据库里面,如今是以JSON的方式进行文档存储,使得存储操做变得更加方便简单。在Elasticsearch中,文档属于一种类型(type),而这些类型存在全部(index)中,关系能够用下面的方式类比:
Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices -> Types -> Documents -> Fields
复制代码
索引在Elasticsearch有不一样的含义,因此须要区分它
索引(名词)如上文所述,一个索引(index)就像是传统关系型数据库中的数据库,它是相关文档的存储的地方,index的附属是indices或indexes.
索引(动词)[索引一个文档]标识一个文档存储到索引(名词)里,以便它能够被检索或者查询。这很像SQL中的INSERT关键字,差异是,若是翁当已经存在,新的文档将覆盖就的文档
倒排索引:传统数据库为特定列增长一个索引,例如B-Tree索引来加速索引。Elasticsearch和Lucene使用一种叫作倒排索引的(inverted index)的数据结构来表达到相同的目的。
传统的数据库很难实现该功能,可是在Elasticsearch却能够轻易的实现全文的检索。
例如:
GET /_search
{
"query": {
"match": {
"about": "rock climbing"
}
}
}
复制代码
返回以下结果:
这个例子返回了两个结果,可是这两个结果的分数是分高低的,第一个的分数显然高于第二个的。这个例子也解释了Elasticsearch在文本字段中进行了全文的检索,而且返回相关性嘴袋的结果集。相关性在Elasticsearch在很是重要,这个概念也是体现了传统数据库和Elasticsearch的区别。
除了上面的全文检索,咱们有时候也须要精确的匹配若干的单词或者短语,这个时候Es也是能够作到的。
GET /_search
{
"query": {
"match_phrase": {
"about": "rock climbing"
}
}
}
复制代码
返回结果以下:
高亮匹配到关键字,这样用户能够知道Wie上面这些文档和查询相匹配。在Elasticsearch作到这个是很简单的,只须要在语句中添加highlight参数。
GET /_search
{
"query": {
"match_phrase": {
"about": "rock climbing"
}
},
"highlight": {
"fields": {
"about":{}
}
}
}
复制代码
返回的结果以下:
Elasticsearch有一个功能叫作聚合(aggresgation),容许在生产复杂的分析统计,它的功能项传统数据库的GROUP BY,可是比传统的数据库的GROUP BY要强大不少。
GET megacorp/employee/_search
{
"aggs": {
"all_interests": {
"terms": {
#这里须要注意的是若是根据某个字段统计须要在后面添加keyword关键字
"field": "interests.keyword"
}
}
}
}
复制代码