ElasticSearch
介绍
Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene™ 基础上的搜索引擎.当然 Elasticsearch 并不仅仅是 Lucene 那么简单,它不仅包括了全文搜索功能,还可以进行以下工作:
- 分布式实时文件存储,并将每一个字段都编入索引,使其可以被搜索。
- 实时分析的分布式搜索引擎。
- 可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。
基本概念
先说Elasticsearch的文件存储,Elasticsearch是面向文档型数据库,一条数据在这里就是一个文档,用JSON作为文档序列化的格式,比如下面这条用户数据:
{
"name" : "John",
"sex" : "Male",
"age" : 25,
"birthDate": "1990/05/01",
"about" : "I love to go rock climbing",
"interests": [ "sports", "music" ]
}
用Mysql这样的数据库存储就会容易想到建立一张User表,有balabala的字段等,在Elasticsearch里这就是一个文档,当然这个文档会属于一个User的类型,各种各样的类型存在于一个索引当中。这里有一份简易的将Elasticsearch和关系型数据术语对照表:
关系数据库 ⇒ 数据库 ⇒ 表 ⇒ 行 ⇒ 列(Columns)
Elasticsearch ⇒ 索引(Index) ⇒ 类型(type) ⇒ 文档(Docments) ⇒ 字段(Fields)
一个 Elasticsearch 集群可以包含多个索引(数据库),也就是说其中包含了很多类型(表)。这些类型中包含了很多的文档(行),然后每个文档中又包含了很多的字段(列)。Elasticsearch的交互,可以使用Java API,也可以直接使用HTTP的Restful API方式,比如我们打算插入一条记录,可以简单发送一个HTTP的请求:
PUT /megacorp/employee/1
{
"name" : "John",
"sex" : "Male",
"age" : 25,
"about" : "I love to go rock climbing",
"interests": [ "sports", "music" ]
}
更新,查询也是类似这样的操作,具体操作手册可以参见Elasticsearch权威指南
ElasticSearch的使用
ES字段的含义
名称 | 含义 | 对应在mysql中的含义 |
---|---|---|
index | 索引 | 数据库 |
type | 类型 | 表 |
document | 文档 | 行 |
fields | 字段 | 列 |
1.索引(Index)
Elasticsearch索引是一组具有共同特征的文档集合。每个索引(index)包含多个类型(type),这些类型依次包含多个文档(document),每个文档包含多个字段(Fields)。在Elasticsearch中索引由多个JSON文档组成。在Elasticsearch集群中可以有多个索引。
在ELK中,当logstash的JSON文档被发送给Elasticsearch时,它们被发送为默认的索引模式“logstash-%{+YYYY.mm.dd}”。它按日划分索引,以便在需要时可以方便地搜索和删除索引。这个模式可以在日志存储的输出插件中改变。
2.文档(document)
Elasticsearch文档是一个存储在索引中的JSON文档。每个文档都有一个类型和对应的ID,这是惟一的。
3.字段(Field)
文档内的一个基本单位,键值对形式(book_name : “learning elk”)
4.类型(Type)
类型用于在索引中提供一个逻辑分区。它基本上表示一类类似类型的文档。一个索引可以有多个类型,我们可以根据上下文来解除它们。
5.映射(Mapping)
映射用于映射文档的每个field及其对应的数据类型,例如字符串、整数、浮点数、双精度数、日期等等。在索引创建过程中,elasticsearch会自动创建一个针对fields的映射,并且根据特定的需求类型,可以很容易地查询或修改这些映射。
6.分片(Shard)
分片是实际的物理实体用于存储每个索引的数据。每个索引都可以有大量的主和复制分片。分片分布在集群中的所有节点中,可以在节点故障或新节点添加时从一个节点移动到另一个节点。
7.主分片(Primary shard)与备份分片(replica shard)
备份分片通常驻留在一个不同的节点上,而不是主碎片,在故障转移和负载平衡的情况下,可以满足多个请求。
8.集群(Cluster)
集群是存储索引数据的节点集合。elasticsearch提供了水平的可伸缩性用以存储集群中的数据。每个集群都由一个集群名称来表示,不同的节点指明集群名称连接在一起。集群名称在elasticsearch.yml中的clustersearch.name的属性设置,它默认为“elasticsearch”:
9.节点(Node)
节点是一个单独运行的elasticsearch实例,它属于一个集群。默认情况下,elasticsearch中的每个节点都加入名为“elasticsearch”的集群。每个节点都可以在elasticsearch中使用自己的elasticsearch.yml,它们可以对内存和资源分配有不同的设置。
语句讲解
- 根据时间查询的代码:
GET smetrend_date/info/_search
{
"query": {
"range": {
"publish_date": {
"gte": "2018-01-08",
"lte": "2019-12-12",
"format": "yyyy-MM-dd"
}
}
}
}
- 查询前200字频率的出现的次数
POST smetrend_date/info/_search
{
"size" : 0,
"aggs" : {
"messages" : {
"terms" : {
"size" : 100,
"field" : "text_summary"
}
}
}
}
- 查询前200词频率的出现的次数
GET smetrend_date/info/_search
{
"size": 0,
"aggs": {
"messages": {
"terms": {
"size": 200,
"field": "text_summary",
"include": "[\u4E00-\u9FA5][\u4E00-\u9FA5]"
}
}
},
"highlight": {
"fields": {
"text_summary": {}
}
}
}
- 查询不含国家二字的统计
GET smetrend_date/info/_search
{
"size" : 0,
"aggs" : {
"messages" : {
"terms" : {
"size" : 200,
"field" : "text_summary",
"include" : "[\u4E00-\u9FA5][\u4E00-\u9FA5]",
"exclude" : "国家.*"
}
}
},
"highlight": {
"fields": {
"text_summary": {}
}
}
}
- 时间范围与二字关键词混合搜索
GET smetrend_date/info/_search
{
"query": {
"range": {
"publish_date": {
"gte": "2018-12-08",
"lte": "2018-12-12",
"format": "yyyy-MM-dd"
}
}
},
"aggs": {
"messages": {
"terms": {
"size": 200,
"field": "text_summary",
"include": "[\u4E00-\u9FA5][\u4E00-\u9FA5]",
"exclude": "国家.*"
}
}
}
}