Основные понятия Elasticsearch и синтаксис запросов

задняя часть
Основные понятия Elasticsearch и синтаксис запросов

Преамбула

Есть много подобныхmysqlизsum, group byЗапрос
elk
===

лось общая архитектура

www.elastic.co/cn/products

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:

Общая проблема