Elasticsearch

Как говорит wiki — Elasticsearch это тиражируемая свободная программная поисковая система.

Подобные движки используются при сложном поиске по базе документов. Например, поиск с учетом морфологии языка или поиск по geo координатам.

Хочу поделиться с вами часто используемыми примерами запросов.

О примерах

Все запросы указанные ниже были написаны для применения в kibana dev tools, но их всегда можно модифицировать в обычные rest запросы вашего приложения или например для отправки через postman.

Просмотр всех индексов

Просмотр списка индексов:

GET _cat/indices

Для просмотра всех документов в индексах хранящихся в elastic выполните:

GET _search
{
  "query": {
    "match_all": {}
  }
}

Создание индекса

Создание индекса с настройками по умолчанию выполняются следующей командой:

PUT .history

Обновление данных в индексе

POST .history/_doc/zlF2-YIBbhSYlsdYa_kz/_update
{
    "doc" : {
        "myfield": «new value»
    }
}

Изменение параметров индекса

Стоит отметить что при сохранении первых данных в пустом индексе Elastic автоматически сделает маппинг данных на основе тех что вы ему передадите.

PUT .history/_mapping
{
  "properties": {
    "query": {
      "type" : "text",
      "analyzer": "keyword",
      "fielddata": true
    }
  }
}

Удаление индекса

DELETE .history

Удаление документа в индексе по ID

DELETE .history/_doc/kDLL_XcB1xupZgXeCj3H

Поиск в индексе

Для вывода определенного индекса отправьте следующий запрос, например:

GET .history/_search
{
   "query": {
     "match": {
       "user": "admin"
     }
   }
} 

Где .history — это имя индекса, напишите сюда свой.

/_search — это команда поиска. Ниже идёт тело запроса имеющего формат JSON.

Поиск по нескольким полям

GET .history/_search
{
  "query": {
    "bool": {
      "should": [
        { "match": {"user": "admin"}},
        { "match": {"query": "source sns_* qsize=10000"}}
      ]
    }
  }
}

Поиск совпадений

GET .history/_count
{
  "query": {
    "bool": {
      "must": [
        { "term": {"user": "admin"}},
        { "term": {"query": "source sns_* qsize=10000"}}
      ]
    }
  }
}

Агрегирование данных

Параметр "size": 0 — убирает лимит на поиск;
"field" — имя поля по которому будет происходить агрегирование.

GET .history/_search
{
  "query": {
    "match": {
      "user": "admin"
    }
  },
  "size": 0,
  "aggs" : {
      "agg_query" : {
          "terms" : { 
            "field" : "query",  
            "size" : 500 
            
          }
      }
  }
}

Агрегирование по нескольким полям

GET .history/_search
{
  "size": 0,
  "query":{
    "match": {
      "title": "example_title"
    }
  },
  "aggs": {
    "hitCount": {
      "terms": {
          "field": "state_text.keyword",
          "size": 100000,
          "order": {
            "_key": "asc"
          }
      },
      "aggs": {
        "month_counter": {
          "date_histogram": {
            "field": "timestamp",
            "interval": "month"
          }
        }
      }
    }
  }
}