ES快速入门


bg

一、概念

1.ES基础概念

  ES是ElasticSearch的缩写。ES是基于Apache Lucene的开源搜索引擎,是一款实时分布式搜索和分析引擎,提供RestfulAPI可以进行可视化的交互。具有如下特点:

  1) 提供分布式的实时文件存储,每个字段都被索引并可被搜索;

  2)实时分析的分布式搜索引擎;

  3)可以扩展到上百万台服务器,能处理PB级结构化或非结构化的数据

2.NRT

  NRT是近实时Near Realtime的缩写。ES是一款近实时的搜索平台,即意味着有轻微的延迟,在从开始索引文档到有结果的时间稍微延迟通常为1秒。

3.ES和SQL

  ES也是一种数据库,学习ES可以对比SQL来理解和学习。下面先列出二者的关系如表-1,方便读者有个大概了解。第二节会详细介绍关于ES的常用术语。

表-1.ES和SQL对照理解


二、存储相关

1.物理存储

1)Cluster

  集群是一个或者一个以上的节点(服务器)的集合。并在所有节点上提供联合的索引和搜索功能。集群由唯一的名称标识,默认情况下是“elasticsearch”。该名称很重要,因为如果节点设置为通过其名称加入集群,则节点只能是集群的一部分。

2)Node

  节点是作为集群一部分的单一服务器,存储您的数据,并参与集群的索引和搜索功能。就像一个集群一样,一个节点由一个名称来标识,默认情况下是一个随机的通用唯一标识符(UUID),它在启动时分配给该节点。所有的节点通过设置集群名cluster.name来确定属于某个集群。

3)Shard

  由于索引存在存储可能超过单个节点的硬件限制的大量数据。例如,占用1TB磁盘空间的10亿个文档的单个索引可能不适合单个节点的磁盘,或者可能太慢,无法单独从单个节点提供搜索请求。因此分片就是为了解决这个问题。每个索引被分成若干个分片。分片被存储在不同的节点中。分片很重要,使用分片的作用:

a) 允许水平分割/缩放内容,提高扩展能力;

b) 允许在分片(可能在多个节点上)分布和并行操作,从而提高性能/吞吐量;

4)Replica

  副本是分片的复制。副本的作用:

a) 如果分片/节点出现故障,则可提供高可用性

b) 允许扩展搜索量/吞吐量,因为可以对所有副本并行执行搜索

  默认情默认情况下,ElasticSearch中的每个索引都分配了5个主分片和1个副本况下,ElasticSearch中的每个索引都分配了5个主分片和1个副本。创建索引后,您可以随时动态更改副本数,但不能更改主分片数。

2.逻辑存储

1)Index

  索引是具有某种相似特征的文档的集合。例如,您可以拥有客户数据的索引,产品目录的另一个索引,以及订单数据的另一个索引。索引由名称(必须全部为小写)标识,该名称用于在针对其中的文档执行索引,搜索,更新和删除操作时引用索引。

2)Type

  类型是您的索引的逻辑类别/分区,允许您将不同类型的文档存储在同一索引中,例如用户的一种类型,博客文章的另一种类型。在索引中不再可能创建多个类型,并且在以后的版本中将删除整个类型的概念。

3)Document

  文档是可以索引的基本信息单元。例如,您可以为单个客户提供文档,单个产品的文档,单个订单的另一个文档。该文档以JSON(JavaScript Object Notation)表示,它是一种无处不在的互联网数据交换格式。

4)Field

  多个字段组成一个文档。一个索引的所有文档类型中对于具有相同名称的字段必须是同一种数据类型,与SQL SERVER不同,同一数据库中不同表中相同名称的列数据类型可以不一样。

5)Mapping

  映射就是字段即字段和字段类型的对应关系。映射机制用于进行字段类型确认,将每个字段匹配为一种确定的数据类型。例如:字段name,类型是String;字段age,类型是Integer。除此之外字段的类型也可以是日期、布尔值、数组、浮点数、对象等等。

三、基础操作

1.创建

增加一行数据,使用关键字Create。内容按照json数据,可以手动写,也可以根据已知的json格式创建。

语法模板一:

curl -XPOST localhost:9200/索引名/类型名/'-d'

{"title":"xxxx","text":"xxxx","date":"2014/01/01"}

备注:-d参数用于将数据放在http请求的body中发送

语法模板二:

curl -XPOST localhost:9200/create_index_action/索引名/类型名/ --data-binary @a.json

备注:依据据a.json创建

2.删除

删除一行数据,使用关键字Delete。

语法模板:

curl -XDELETE localhost:9200/索引名/类型名/ID

备注:ID号一般是自动生成的唯一标志符,也可以更具需要自定义。

3.修改

修改一行数据,使用关键字Update。

语法模板:

1)修改某一字段的值

curl -XPOST localhost:9200/索引名/类型名/ID号/_update?pretty

{

"doc":{"name":"wxxq"}

}

2)增加一个字段

curl -XPOST localhost:9200/索引名/类型名/ID号/_update?pretty

{

"doc":{"name":"wxxq","age":18}

}

3)使用脚本修改

curl -XPOST localhost:9200/索引名/类型名/ID号/_update?pretty

{

"script":"ctx._source.age+=5"

}

备注:ctx._source指的是即将更新的当前源文档

4.简单查询

查询数据,使用关键字Search。

语法模板:

1)空查询:

  curl -XGET localhost:9200/_search?pretty

  备注:返回索引中所有的文档

2)根据id号来查询:

  curl -XGET localhost:9200/索引名/类型名/_search?q="_id":"AV4CnR6NuLtuw-m9JsB_"

3)模糊查询:

  curl -XGET localhost:9200/_all/_search?q="add"

  备注:查询有add的文档

5.批处理

  批量处理数据,使用关键字bulk。

语法模板:

1)同时修改多个索引

  curl -XPOST localhost:9200/索引名/类型名/_bulk?pretty

  {"index":{"_id":"1"}}

  {"name": "John Doe" }

  {"index":{"_id":"2"}}

  {"name": "Jane Doe" }

2)对多个索引进行不同的处理操作

  curl -XPOST localhost:9200/索引名/类型名/_bulk?pretty

  {"update":{"_id":"1"}}

  {"doc": { "name": "John Doe becomes JaneDoe" } }

  {"delete":{"_id":"2"}}

6.搜索结果释义

图-1是一张搜索结果的截图,下面将针对搜索结果的结构解释来查看数据内容。


图-1.搜索结果


搜索结果备注:

took:执行ES的搜索需要的时间

timed_out:是否超时

_shards:搜索了多少个分片,成功数量,失败数量

hits:搜索结果,通过键值对展示

hits.total:符合搜索条件的文件总数

hits.hits:实际搜索结果数组

_index:该条数据所在索引

_type:该条数据所在类型

_id:该数据的唯一标识符

_source:该条数据的内容,里面由多个fields组成

四、复杂查询

1.多条件查询

curl -XGET localhost:9200/school/student/_search{

"query":{

"bool":{

               "must":[{"match":{"gender":"male"}},

                             {"match":{"age":18}}],

              "should":["match":{"hobby":"music"}],

               "must_not":["match":{"address":"BeiJing"}]

}},

"from":5,

"size":10,

"sort":{"age":{"order":"desc"}}

}

2.过滤器

curl -XGET localhost:9200/school/student/_search{

"query": {

               "bool": {

                               "must": {

                                                     "match_all": {}

                                             },

                               "filter": {

                                                      "range": {

                                                                            "money": {

                                                                                                 "gte": 20000,

                                                                                                 "lte": 30000

                                                                                              }

                                                                        }

                                           }

                        }

 },

"from":5,

"size":10,

"sort":{"age":{"order":"desc"}}

}

备注1:

gt          大于

gte        大于等于

lt            小于

lte          小于等于

备注2:

除了使用range过滤,还可以使用term,terms,exists,missing等

1) term用于精确匹配某些值,如数字,日期,布尔值

   {"term":{"age":20}}

   {"term":{"date":"2017-08-21"}}

2) terms与term类似,但允许指定多个匹配条件,当某个字段存在多个值时

    {"terms":{

                      "tag":["search","full_text","nosql"]

                   }

      }

3)exists包含某字段

{

        "exists":{

                       "fields":"tittle"

                    }

}

4)missing没有某字段

{

         "missing":{

                              "fields":"tittle"

                        }

}

3.聚合

聚合(aggregations)类似于SQL的Group By。

curl -XGET localhost:9200/school/student/_search{

 "size":0,

"aggs":{

"group_by_age":{

                                   "range":{

                                                           "field":"age",

                                                           "ranges":[{"from":20,

                                                                              "to":30},

                                                                            {"from":30,

                                                                               "to":40},

                                                                             {"from":40,

                                                                                 "to":50}]

                                                    }

                         }

   }

}

聚合还支持嵌套查询

curl -XGET localhost:9200/school/student/_search{

"size":0,

"aggs":{

"group_by_age":{

                             "range":{

                                           "field":"age",

                                          "ranges":[{"from":20,

                                                              "to":30},

                                                          {"from":30,

                                                                "to":40},

                                                          {"from":40,

                                                                "to":50}]

                                    }

        }

},

"aggs":{

              "group_by_gender":{

                                                   "terms":{

                                                                  "field":"gender"

                                                      },

                                                    "aggs":{

                                                                   "avg":{

                                                                              "field":"balance"

                                                                            }

                                                               }

                                           }

             } 

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,290评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,399评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,021评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,034评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,412评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,651评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,902评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,605评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,339评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,586评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,076评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,400评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,060评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,851评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,685评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,595评论 2 270

推荐阅读更多精彩内容