Преамбула
Есть много подобныхmysqlизsum, group byЗапрос
elk
===
лось общая архитектура
Beat
Облегченный сборщик данных, написанный на языке go, считывает данные и быстро отправляет их в Logstash для анализа или напрямую в Elasticsearch для централизованного хранения и анализа.
Logstash
Logstash — это конвейер обработки данных на стороне сервера с открытым исходным кодом, способный одновременно получать данные из нескольких источников, форматировать данные и отправлять данные в es для хранения.
ElasticSearch
Elasticsearch — распределенная поисково-аналитическая система на основе JSON, представляющая собой полнотекстовый индекс, реализованный с использованием инвертированного индекса.
Kibana
Kibana может визуализировать и манипулировать данными в Elasticsearch.
elasticsearch
ES лежит в основе экосистемы elk. Это крупномасштабная система полнотекстового поиска и анализа на основе инвертированного индекса с открытым исходным кодом. Она может поддерживать анализ поиска в хранилище практически в режиме реального времени.
Преимущество:
- Горизонтальная масштабируемость: дополнительные серверы можно настроить прямо в кластере
- Механизм сегментирования обеспечивает лучшее распределение: подход «разделяй и властвуй» для повышения эффективности обработки
- Высокая доступность: обеспечивает механизм репликации
- В режиме реального времени: улучшите скорость запросов, поместив файлы на диске в систему кэширования файлов.
Базовые концепты
- Индекс: набор документов, аналогичный концепции базы данных в mysql.
- Тип: в индексе могут быть определены различные типы.Концепция типа похожа на концепцию таблицы в mysql, которая представляет собой комбинацию ряда данных с одинаковыми характеристиками.
- Документ: концепция документа аналогична записи хранилища в mysql, и она имеет формат json.В индексе может быть много документов разных типов.
- Осколки: когда объем данных велик, выполняется горизонтальное расширение для повышения производительности поиска.
- Реплики: чтобы предотвратить потерю данных сегмента, его можно распараллелить в резервных данных и поиске для повышения производительности.
синтаксис запроса elasticsearch
_cat API
Запросите соответствующую информацию о текущем кластере es, включая количество индексов в кластере, статус работы и IP-адрес, на котором расположен текущий кластер. Цель состоит в том, чтобы вывести результаты запроса в более удобном виде.
- кот: вывод
_cat apiВсе поддерживаемые команды запросов в - здоровье кошки: проверьте рабочее состояние кластера es
- cat count: может быстро запросить количество документов в кластере или индексе
- cat indexes: запрашивать данные всех индексов в текущем кластере, включая количество осколков индекса, количество документов и пространство, используемое для хранения...
- Другие справочные официальные документы cat api:woohoo.elastic.co/expensive/en/bad…
Search APIs
Поиск данных с несколькими синтаксисом запросов и мощными функциями
REST request URI: Легкий и быстрый метод запроса URI
REST request body: метод запроса в формате json, который может иметь множество ограничений.
- "запрос": в теле запроса
queryпозвольте нам использоватьQuery DSLспособ запроса.- «term»: при запросе определите, содержит ли документ определенное значение, и не будет выполнять запрос сегментации слов для запрошенного значения.
- «match» будет токенизировать значение запроса, а затем использовать механизм оценки (TF/IDF) для оценки
- "match_phrase": запросить указанный абзац
- «Bool»: в сочетании с другими запросами правды, обычно с
must should mustnotОбъединение (или не) сложных запросов - «диапазон»: укажите поле в определенном диапазоне при запросе
"range": { "FIELD": {# 指定具体过滤的字段 "gte": 1,# gte: >=, gt: > "lte": 10 } }
- "from": просмотр результатов, которые мы получили с определенным смещением, по умолчанию он начинается с первых полученных данных.
- «размер»: укажите количество фрагментов данных, выводимых в результате поиска, по умолчанию 10 шт.
- «sort»: позволяет нам сортировать и отображать полученные результаты по указанному полю.
- "_source": укажите поле для вывода результата поиска
- "script_fields": Этот тип позволяет нам через скрипт вычислять значения, которых нет в документе, например, нам нужно вычислить установку/клик для получения cti и так далее
"script_fields": {
"FIELD": {# 指定脚本计算之后值得名称
"script": {# 脚本内的运算
}
}
}
- «aggs»: на основе поисковых запросов можно использовать вложенные агрегации для объединения сложных требований.
"aggs": {
"NAME": {# 指定结果的名称
"AGG_TYPE": {# 指定具体的聚合方法,
TODO: # 聚合体内制定具体的聚合字段
}
}
TODO: # 该处可以嵌套聚合
}
Query DSL
Query DSL — это полный набор структурированных методов запросов, основанных на формате json, предоставляемом es, включая две разные семантики запросов:
- Предложения запроса листа: синтаксис запроса листа заключается в поиске указанного значения в указанном поле, есть
match, term or range. - Предложения составного запроса. Синтаксис составного запроса будет содержать листовой синтаксис или составной синтаксис, который используется для нескольких запросов.
bool or dis_max.
Query and filter context
Поведение оператора запроса зависит от того, использует ли он контекст запроса или контекст фильтра.
-
Контекст запроса: в этом контексте результатом, возвращаемым оператором запроса, является «насколько результат соответствует оператору запроса?», а возвращаемые данные результата будут включать
_scoreзначение, символизирующее степень соответствия; -
Контекст фильтра: в контексте фильтра оператор запроса соответствует или нет (да или нет). есть встроенный
filter contextКэш сохраняется для повышения производительности запросов, поэтомуfilter context
запрос быстрее, чемquery context
пример запроса elasticsearch
Пример запроса API _cat
_cat запрашивает текущее состояние текущего кластера es
Kibana’s Console: `GET /_cat/health?v`
curl: `curl -XGET "127.0.0.1:9200/_cat/health?v"`
_cat запрашивает все индексы в текущем кластере es
Kibana’s Console: `GET /_cat/indices?v`
curl: `curl -XGET "127.0.0.1:9200/_cat/indices?v"`
Пример запроса API _search
создать индекс
PUT /customer?pretty
output:
{
"acknowledged": true,
"shards_acknowledged": true
}
вставить данные
В повседневных задачах иногда возникает 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
Запрос соответствует определенным условиям для удаления
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
}
},
....]
}
Запрос определенного поля и указание поля сортировки
Найдите тип: rba в индексах как rta_daily_report и выведите 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.
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
}
},
запрос сценария
В следующем примере данные, которых нет в документе, вычисляются с помощью полей «щелкнуть и установить» в документе.
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
}
}
]
}
}
Запрос агрегированных данных за определенный период времени, и скрипт вычисляет дополнительные поля
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
kibana
logstash
TODO: