一、getting started
1.use case
1.1 存储大数据,做查询
1.2 存储日志
1.3 从第三方收集数据,进行分析、查询
1.4 分析聚合数据,利用kibana展示
2.基本概念
2.1 near realtime 近实时
2.2 cluster(集群) 有多个node,每个cluster有唯一的一个名字,默认是‘elasticsearch’
2.3 node(节点) 一个集群中的其中一个服务节点,默认名字是一个uuid,可以指定它加入的集群的名字
2.4 index(索引)是具有稍微类似特征文档的集合,相当于数据库中的一个数据库实例。
一个索引也有一个名字,它在 对document(文档)执行 indexing(索引),search(搜索),update(更新)和 delete(删除)等操作时 会被涉及到。一个集群中可以有多个索引。
你也许已经注意到 索引 这个词在 Elasticsearch 语境中包含多重意思, 所以有必要做一点儿说明:
索引(名词):
如前所述,一个 索引 类似于传统关系数据库中的一个 数据库 ,是一个存储关系型文档的地方。 索引 (index) 的复数词为 indices 或 indexes 。
索引(动词):
索引一个文档 就是存储一个文档到一个 索引 (名词)中以便它可以被检索和查询到。这非常类似于 SQL 语句中的 INSERT 关键词,除了文档已存在时新文档会替换旧文档情况之外。
倒排索引:
关系型数据库通过增加一个 索引 比如一个 B树(B-tree)索引 到指定的列上,以便提升数据检索速度。Elasticsearch 和 Lucene 使用了一个叫做 倒排索引 的结构来达到相同的目的。
+ 默认的,一个文档中的每一个属性都是 被索引 的(有一个倒排索引)和可搜索的。一个没有倒排索引的属性是不能被搜索到的。我们将在 倒排索引 讨论倒排索引的更多细节。
2.5 type (类型)相当于数据库中的一个表。
在 Index(索引)中,可以定义一个或多个类型。一个类型是索引中一个逻辑的种类/分区,它的语义完全取决于您自己。
一般情况下,一个类型被定义成一组常见字段的文档。例如,假设您运行着一个博客平台并且在一个单独的索引中存储了所有的数据。在这个索引中,您也许定义了一个用户数据类型,博客数据类型,和评论数据类型。在高版本中会被移除。
2.6 document (文档) 是索引信息的基本单位,相当于数据库中的一条数据
例如,您有一存储 customer(客户)数据的文档,另一个是存储 product(产品)数据的文档,还有一个是存储 order(订单)数据的文档。该文档可以使用 JSON 来表示,它是一种无处不在的互联网数据交换格式。在索引/类型中,您可以存储许多文档。
注意,尽管一个文档物理的存在于索引中,实际上一个文档必须被 索引/分配 给索引内的类型。
3.exploring cluster 探索集群
3.1 集群健康
curl -XGET 'localhost:9200/_cat/health?v&pretty'
可以获得 green,yellow,或者 red 的 status。Green 表示一切正常(集群功能齐全), yellow 表示所有数据可用,但是有些副本尚未分配(集群功能齐全),red 意味着由于某些原因有些数据不可用。注意,集群是 red,它仍然具有部分功能(例如,它将继续从可用的分片中服务搜索请求),但是您可能需要尽快去修复它,因为您已经丢失数据了。
3.2 操作索引
curl -XGET 'localhost:9200/_cat/indices?v&pretty' 列出所有索引
curl -XPUT 'localhost:9200/customer?pretty' 添加索引
curl -XDELETE 'localhost:9200/customer?pretty' 删除索引
3.3 操作文档
curl -XPUT 'localhost:9200/customer/external/1?pretty&pretty' -d'{ "name": "John Doe"}'
添加文档,如果文档已存在,则更新。其中external是type(类型),其中 1 是 类型的ID
curl -XPOST 'localhost:9200/customer/external/1/_update?pretty&pretty' -d'{ "doc": { "name": "Jane Doe" }}'
_update 更新文档
curl -XDELETE 'localhost:9200/customer/external/2?pretty&pretty' 删除文档
curl -XGET 'localhost:9200/customer/external/1?pretty' 获取文档
curl -XPOST 'localhost:9200/customer/external/_bulk?pretty&pretty' -d'
_bulk 批量更新
将 HTTP 命令由 PUT 改为 GET 可以用来检索文档,同样的,可以使用 DELETE 命令来删除文档,以及使用 HEAD 指令来检查文档是否存在。如果想更新已存在的文档,只需再次 PUT 。
PUT 和 POST 区别:
他们都可以用来提交和更新资源,但是PUT的接口是幂等的。
3.4 查询操作
curl -XGET 'localhost:9200/bank/_search?q=*&sort=account_number:asc&pretty'
_search 查询
在响应中,我们可以看到以下几个部分 :
took - Elasticsearch 执行搜索的时间(毫秒)
time_out - 告诉我们搜索是否超时
_shards - 告诉我们多少个分片被搜索了,以及统计了成功/失败的搜索分片
hits - 搜索结果
hits.total - 搜索结果
hits.hits - 实际的搜索结果数组(默认为前 10 的文档)
sort - 结果的排序 key(键)(没有则按 score 排序)
score 和 max_score -现在暂时忽略这些字段
3.5 REST request body方法查询
curl -XGET 'localhost:9200/bank/_search?pretty' -d'
{
"query": {
"bool": {
"must": [
{ "match": { "address": "mill" } },
{ "match": { "address": "lane" } }
过滤:
{
"query": {
"bool": {
"must": { "match_all": {} },
"filter": {
"range": {
"balance": {
"gte": 20000,
"lte": 30000
}
聚合:
{
"size": 0,
"aggs": {
"group_by_state": {
"terms": {
"field": "state.keyword"
}
}
4.setup es 暂时跳过,某些生产上的设置至关重要
5.API 规范
5.1 Multiple Indices(多个索引)
/g*,u*/_search 在任何以 g 或者 u 开头的索引中搜索所有的类型
5.2 Date math support in index names(索引名称对 Date 和 Math 的支持)
Date math 索引名称解析可以让您搜索一系列 time-series indices(时间序列索引),而不是搜索所有时间序列索引并过滤结果或维护 aliases(别名)。限制搜索的索引数量减少了集群上的负载,并提高了执行性能。例如,如果您在日常日志中 searching for errors(搜索错误 ),则可以使用 date math name 模板将搜索限制为过去两天。
6. document api
7. search api
8. aggregation api 聚合api
9. index api 索引api
10. cat api
11. cluster api
12. 查询 DSL
Elasticsearch提供了一个基于JSON的完整的查询DSL来定义查询。将查询DSL视为查询的AST,由两种类型的子句组成:
叶查询子句
叶查询子句在特定查询中查找特定值,例如匹配、项值、范围查询。这些查询都可以给自己使用。
复合查询子句
复合查询子句包装其他叶子或复合查询,用于以逻辑方式组合多个查询(例如bool或dis_max查询),或更改其行为(如constant_score查询)。
查询子句的行为有所不同,具体取决于它们是在查询上下文还是过滤器上下文中使用。