1. 程式人生 > >elasticsearch基本概念與查詢語法

elasticsearch基本概念與查詢語法

序言

後面有大量類似於mysqlsum, group by查詢
elk
===

elk總體架構

https://www.elastic.co/cn/products

Beat

基於go語言寫的輕量型資料採集器,讀取資料,迅速傳送到Logstash進行解析,亦或直接傳送到Elasticsearch進行集中式儲存和分析。

Logstash

Logstash 是開源的伺服器端資料處理管道,能夠同時從多個來源採集資料、格式化資料,然後將資料傳送到es進行儲存。

ElasticSearch

Elasticsearch 是基於JSON的分散式搜尋和分析引擎,是利用倒排索引實現的全文索引。

Kibana
Kibana 能夠視覺化 Elasticsearch 中的資料並操作。

elasticsearch

es在elk生態圈中處於核心地位,是開源大規模基於倒排索引的全文搜尋分析引擎,他幾乎能實時的支援儲存搜尋分析。
優勢:

  • 橫向可擴充套件性: 增加伺服器可直接配置在叢集中
  • 分片機制提供更好的分佈性: 分而治之的方式來提升處理效率
  • 高可用: 提供複製(replica)機制
  • 實時性: 通過將磁碟上的檔案放入檔案快取系統來提高查詢速度

基本概念

  • Index: 一系列文件的集合,類似於mysql中資料庫的概念
  • Type: 在Index裡面可以定義不同的type,type的概念類似於mysql中表的概念,是一系列具有相同特徵資料的結合。
  • Document: 文件的概念類似於mysql中的一條儲存記錄,並且為json格式,在Index下的不同type下,可以有許多document。
  • Shards: 在資料量很大的時候,進行水平的擴充套件,提高搜尋效能
  • Replicas: 防止某個分片的資料丟失,可以並行得在備份資料裡及搜尋提高效能

elasticsearch查詢語法

_cat API

查詢當前es叢集的相關訊息,包括叢集中的index數量、執行狀態、當前叢集所在的ip,目的在於將查詢的結果以更加友好的方式輸出。

  • cat: 輸出_cat api中所有支援的查詢命令
  • cat health: 檢查es叢集執行的狀況
  • cat count: 可以快速的查詢叢集或者index中文件的數量
  • cat indices: 查詢當前叢集中所有index的資料,包括index的分片數、document的數量、儲存所用的空間大小...
  • 其他cat api參考官方文件: https://www.elastic.co/guide/en/elasticsearch/reference/5.5/cat.html

Search APIs

搜尋資料,查詢語法多,功能強大
REST request URI: 輕便快速的URI查詢方法
REST request body: 可以有許多限制條件的json格式查詢方法

  • "query": 在請求訊息體中的query允許我們用Query DSL的方式查詢。
    • "term": 查詢時判斷某個document是否包含某個具體的值,不會對被查詢的值進行分詞查詢
    • "match" 將被查詢值進行分詞,然後用評分機制(TF/IDF)進行打分
    • "match_phrase": 查詢指定段落
    • "Bool": 結合其他真值查詢,通常和must should mustnot(與或非)一起組合出複雜的查詢
    • "range": 查詢時指定某個欄位在某個特定的範圍
      "range": {
            "FIELD": {# 指定具體過濾的欄位
              "gte": 1,# gte: >=, gt: >
              "lte": 10
            }
          }
      
  • "from": 以一定的偏移量來檢視我們檢索的結果,預設從檢索的第一條資料開始顯示
  • "size": 指定檢索結果中輸出的資料條數,預設為10條
  • "sort": 允許我們將檢索的結果以指定的欄位進行排序顯示
  • "_source": 指定檢索結果輸出的欄位
  • "script_fields": 該型別允許我們通過一個指令碼來計算document中不存在的值,比如我們需要計算install/click得到cti之類的
"script_fields": {
    "FIELD": {# 指定指令碼計算之後值得名稱
      "script": {# 指令碼內的運算
      }
    }
  }
  • "aggs": 基於搜尋查詢,可以巢狀聚合來組合複雜的需求
"aggs": {
    "NAME": {# 指定結果的名稱
      "AGG_TYPE": {# 指定具體的聚合方法,
        TODO: # 聚合體內製定具體的聚合欄位
      }
    }
    TODO: # 該處可以巢狀聚合
  }

Query DSL

Query DSL是es提供的一套完整的基於json格式的結構化查詢方法,包含兩類不同的查詢語義:

  • Leaf query clauses: 葉子查詢句法就是在指定的欄位中搜索指定的值,有match, term or range.
  • Compound query clauses: 複合查詢句法會包含葉子句法或者複合句法,作用是為了多重查詢,有bool or dis_max.
Query and filter context

查詢語句的行為取決於它是使用查詢型上下文還是過濾型上下文

  • Query context: 在這種上下文環境中,查詢語句的返回的結果是”結果和查詢語句的匹配程式如何“,返回的結果資料中都會帶上_score值,象徵匹配程度;

  • Filter context: 過濾型上下文環境中,查詢語句則表面匹配與否(yes or no)。es內建式為filter context保留快取用來提高查詢效能,因此filter context
    查詢的速度要快於query context

elasticsearch查詢示例

_cat api查詢示例

_cat查詢當前es叢集執行的狀況

Kibana’s Console: `GET /_cat/health?v`
curl: `curl -XGET "127.0.0.1:9200/_cat/health?v"`

_cat查詢當前es叢集中所有的indices

Kibana’s Console: `GET /_cat/indices?v`
curl: `curl -XGET "127.0.0.1:9200/_cat/indices?v"`

_search api查詢示例

建立index

PUT /customer?pretty

output:

{
  "acknowledged": true,
  "shards_acknowledged": true
}

插入資料
日常任務中,有時候往es插入資料的時候會出現504閘道器超時,這時候就需要手動的插入少量資料

PUT /rta_daily_report/campaign/164983850_rba_20170808?pretty
{
  "doc": {
    "cid": 164983850,
    "advertiser_id": 799,
    "trace_app_id": "com.zeptolab.cats.google",
    "network_cid": "6656665",
    "platform": 1,
    "direct": 2,
    "last_second_domain": "",
    "jump_type": 2,
    "direct_trace_app_id": "",
    "mode": 0,
    "third": "kuaptrk.com",
    "hops": 9,
    "yyyymmdd": "2017-08-07T16:00:00",
    "type": "rba",
    "click": 2
  }
}

output:

{
  "_index": "rta_daily_report",
  "_type": "campaign",
  "_id": "164983851_rba_20170808",
  "_version": 1,
  "result": "created",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "created": true
}

刪除資料
指定document_id刪除:

DELETE /rta_daily_report/campaign/164983850_rba_20170808?pretty

query中滿足一定條件刪除

POST rta_daily_report/_delete_by_query
{
  "query": { 
    "match": {
      "message": "some message"
    }
  }
}

根據具體document_id查詢

GET rta_daily_report/campaign/145603275_m_normal_20170804?pretty

output:

{
  "_index": "rta_daily_report",
  "_type": "campaign",
  "_id": "145603275_m_normal_20170804",
  "_version": 1,
  "found": true,
  "_source": {
    "cid": 145603275,
    "advertiser_id": 457,
    "trace_app_id": "id1105855019",
    "network_cid": "plr_gs_ios_cn_osv9",
    "platform": 2,
    "direct": 1,
    "last_second_domain": "tracking.lenzmx.com",
    "jump_type": 7,
    "direct_trace_app_id": "id1105855019",
    "mode": 3,
    "third": "3444.tlnk.io",
    "hops": 1,
    "yyyymmdd": "2017-08-03T16:00:00",
    "type": "m_normal",
    "click": 2,
    "impression": 3,
    "revenue": 0,
    "install": 0
  }
}

查詢所有資料
URI:

GET rta_daily_report/campaign/_search?q=*&pretty

request boy:

GET rta_daily_report/campaign/_search
{
  "query": {
    "match_all": {}
  }  
}

output:

"hits": {
    "total": 2705059,
    "max_score": 1,
    "hits": [
      {
        "_index": "rta_daily_report",
        "_type": "campaign",
        "_id": "163016610_rba_20170801",
        "_score": 1,
        "_source": {
          "cid": 163016610,
          "advertiser_id": 799,
          "trace_app_id": "mappstreet.videoeditor",
          "network_cid": "6287283",
          "platform": 1,
          "direct": 2,
          "last_second_domain": "",
          "jump_type": 2,
          "direct_trace_app_id": "",
          "mode": 0,
          "third": "aff.adsbreak.com",
          "hops": 8,
          "yyyymmdd": "2017-07-31T16:00:00",
          "type": "rba",
          "click": 0
        }
      },
      ....]
      }

查詢特定欄位,並且指定排序欄位
在indices為rta_daily_report中搜索type:rba,以日期升序輸出1個查詢結果
URI:

 GET rta_daily_report/_search?q=type:rba&sort=yyyymmdd:asc&pretty

request bofy:

GET rta_daily_report/_search
{
  "query": {
    "match": {
      "type": "rba"
    }
  },
  "sort": [
    {
      "yyyymmdd": {
        "order": "desc"
      }
    }
  ]
}

指定輸出欄位
查詢型別為rba/b2t,按照日期降序排列,輸出制定欄位,並且只輸出5條查詢結果,如果要匹配段落,則用"match_phrase": { "address": "mill lane" }

GET rta_daily_report/_search
{
  "query": {
    "match": {
      "type": "rba b2t"
    }
  },
  "sort": [
    {
      "yyyymmdd": {
        "order": "desc"
      }
    }
  ],
  "_source": ["yyyymmdd", "type", "cid", "click", "revenue"],
  "size": 5
} 

output:

"hits": {
    "total": 1327184,
    "max_score": null,
    "hits": [
      {
        "_index": "rta_daily_report",
        "_type": "campaign",
        "_id": "54870921_b2t_20170804",
        "_score": null,
        "_source": {
          "revenue": 76500,
          "yyyymmdd": "2017-08-03T16:00:00",
          "type": "b2t",
          "click": 22616,
          "cid": 54870921
        },
        "sort": [
          1501776000000
        ]
      },

bool組合複雜查詢
下例是查詢型別為b2t,收入必須大於0的所有單子的click、revenue相關資料

GET rta_daily_report/_search
{
  "query": {
    "bool": {
      "must": [
        {"match": {
          "type": "b2t"
        }}
     ],
     "must_not": [
       {
         "range": {
           "revenue": {
             "lte": 0
           }
         }
       }
     ]
    }
  },
  "sort": [
    {
      "yyyymmdd": {
        "order": "desc"
      }
    }
  ],
  "_source": ["yyyymmdd", "type", "cid", "click", "revenue"],
  "size": 10       
}

聚合查詢
下例是類似於sql中的聚合查詢,查詢每天不同型別對應的intall總量

GET /rta_daily_report/_search
{
  "size": 0,
  "aggs": {
    "sum_install": {
      "date_histogram": {
        "field": "yyyymmdd",
        "interval": "day"
      },
      "aggs": {
        "types": {
          "terms": {
            "field": "type.keyword",
            "size": 10
          },
          "aggs": {
            "install": {
              "sum": {
                "field": "install"
              }
            }
          }
        }
      }
    }
  }
}

output

"aggregations": {
    "sum_install": {
      "buckets": [
        {
          "key_as_string": "2017-07-31T00:00:00.000Z",
          "key": 1501459200000,
          "doc_count": 659553,
          "types": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": [
              {
                "key": "rba",
                "doc_count": 321811,
                "install": {
                  "value": 73835
                }
              },
              {
                "key": "m_normal",
                "doc_count": 321711,
                "install": {
                  "value": 18964
                }
              },

script查詢
下例通過document中的click,install欄位,計算出文件中不存在的資料。

GET /rta_daily_report/campaign/_search?pretty
{
    "query" : {
      "bool": {
        "must": [
          {
            "range": {
              "click": {
                "gt": 0
              }
            }
          },
          {
            "range": {
              "install": {
                "gt": 0
              }
            }
          }
        ]
    }},
    "size": 100, 
    "script_fields": {
      "cti": {
        "script": {
          "lang": "painless",
          "inline": "1.0 * doc['install'].value / doc['click'].value"
        }
      }
    }
}

output

"hits": {
    "total": 23036,
    "max_score": 2,
    "hits": [
      {
        "_index": "rta_daily_report",
        "_type": "campaign",
        "_id": "160647918_rta_20170801",
        "_score": 2,
        "fields": {
          "cti": [
            0.0005970149253731343
          ]
        }
      },
      {
        "_index": "rta_daily_report",
        "_type": "campaign",
        "_id": "162293741_rta_20170801",
        "_score": 2,
        "fields": {
          "cti": [
            0.00007796055196070789
          ]
        }
      },

查詢一段時間內的聚合資料

GET rta_daily_report/campaign/_search
{
  "size": 0,
  "aggs": {
    "snaptime": {
      "date_range": {
        "field": "@timestamp",
        "ranges": [
          {
            "from": "now-30d/d",
            "to": "now"
          }
        ]
      },
      "aggs": {
        "sum_revenue": {
          "sum": {
            "field": "revenue"
          }
        }
      }
    }
  }
}

output:

"aggregations": {
    "snaptime": {
      "buckets": [
        {
          "key": "2017-07-17T00:00:00.000Z-2017-08-16T03:30:16.995Z",
          "from": 1500249600000,
          "from_as_string": "2017-07-17T00:00:00.000Z",
          "to": 1502854216995,
          "to_as_string": "2017-08-16T03:30:16.995Z",
          "doc_count": 18685619,
          "sum_revenue": {
            "value": 6631665219
          }
        }
      ]
    }
  }

查詢某段時間內聚合資料,並且script計算額外欄位

GET rta_daily_report/campaign/_search
{

  "size": 0,
  "aggs" : {
    "cvr_per_month" : {
      "date_range" : {
        "field": "@timestamp",
        "ranges": [
          {
            "from": "now-30d/d",
            "to": "now"
          }
        ]
      },
      "aggs": {
        "sum_click": {
          "sum": {
            "field": "click"
          }
        },
        "sum_install": {
          "sum": {
            "field": "install"
          }
        },
        "cvr": {
          "bucket_script": {
            "buckets_path": {
              "install": "sum_install",
              "click": "sum_click"
            },
           "script": "1.0 * params.install / params.click"
          }
        }
      }
    }
  }
}

output: 
"aggregations": {
    "cvr_per_month": {
      "buckets": [
        {
          "key": "2017-07-17T00:00:00.000Z-2017-08-16T03:37:22.732Z",
          "from": 1500249600000,
          "from_as_string": "2017-07-17T00:00:00.000Z",
          "to": 1502854642732,
          "to_as_string": "2017-08-16T03:37:22.732Z",
          "doc_count": 18685619,
          "sum_click": {
            "value": 15067388421
          },
          "sum_install": {
            "value": 7602055
          },
          "cvr": {
            "value": 0.0005045370032012133
          }
        }
      ]
    }
  }

參考連結:
日期格式
查詢語法1
查詢語法2



作者:Hqmm
連結:https://www.jianshu.com/p/6333940621ec
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。