Практическое руководство по работе с Elasticsearch | Рекомендуемая коллекция

Elasticsearch
Практическое руководство по работе с Elasticsearch | Рекомендуемая коллекция

Я пиво и острые полоски.

Делать добрые дела, не прося вознаграждения.

Официальный предоставляет нам API для работы с Elasticsearch на нескольких языках, которыми можно легко управлять в проекте. Научитесь работать с Elasticsearch с собственными запросами, упростите обслуживание базы данных и ускорьте обучение использованию API на разных языках.

Этот блог использует кибану для инициирования запросов, а кибану можно использовать для просмотра сочетаний клавиш.

индексная операция

создать индекс

Создайте индекс, используяPUTЗапрос, за которым следует имя индекса, поскольку тип 7.x по умолчанию —_doc, поэтому вам не нужно идти в ногу с типом. В то же время, как простой запрос PUT, тело запроса JSON может быть добавлено для сложного создания.

PUT /user
{
  "settings": {
    "index": {
      "number_of_shards": 3,  
      "number_of_replicas": 2 
    }
  },
  "mappings": {
    "properties": {
      "name": { "type": "text" },
      "age": {"type": "short"},
      "city":{"type": "keyword"}
    }
  }
}

создать индексuser, вы можете передать параметрsettingУстановите количество осколков и реплик черезnumber_of_shardsУстановите в общей сложности 3 осколка, черезnumber_of_replicasУстановите 2 реплики для каждого шарда, если не указано по умолчанию, оба параметра равны 1. пройти черезmappingsОпределяет тип вставки каждого Filed в документе. Кроме того, вы также можете установитьaliasesполе, создайте псевдоним для индекса, чтобы можно было не только получить доступ к индексу через псевдоним, но также можно было определить условия запроса, можно было указать сегменты запроса и т. д.Для получения подробной информации см..

падение индекса

Чтобы удалить индекс, используйте запрос DELETE.

DELETE /user

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

Для просмотра указателя используйтеGETЗапрос, вы можете просмотреть параметры, установленные индексом.

После удаления я снова добавил индекс, и никаких настроек не было, поэтому и шарды, и реплики были 1.

Вы также можете просмотреть определенный параметр, добавив параметр после индекса, например:

GET /user/_settings
GET /user/_mappings
GET /user/_aliases

Изменить настройки раздела индекса

в состоянии пройтиPUTЗапрос на изменение настроек части индекса. Например, можно изменить количество реплик шардов, но нельзя изменить количество шардов таким образом.

PUT /user/_settings
{
  "number_of_replicas": 3 
}

Копию осколка можно изменить с помощью вышеуказанного запроса.

манипулирование документами

Создайте индекс и посмотрите на добавление, удаление и изменение документов.Это наиболее часто используемое место в повседневной работе.

Вставить документ

Добавить использование документаPUT,POSTпросить.

PUT /<target>/_doc/<_id>

POST /<target>/_doc/

PUT /<target>/_create/<_id>

POST /<target>/_create/<_id>

targetимя индекса,_docявляется типом по умолчанию. Из первых двух запросов видно, что id может быть указан сам или автоматически сгенерирован ES._createГарантируется вставка только в том случае, если документ не существует, в то время как_docМожет также использоваться для обновления документов.

POST /user/_doc/1
{
  "name":"pjjlt",
  "age":26,
  "city":"sjz"
}

обновить документацию

Для обновления документации вы можете использоватьPUTилиPOSTКлючевые слова запроса, полное обновление.

POST /user/_doc/1
{
  "name":"pjjlt",
  "age":3,
  "city":"sjz"
}

также через_updateКоманда частичного обновления, так называемое частичное обновление, означает, что нет необходимости добавлять все поля в тело запроса, добавляются только те поля, которые необходимо изменить, а остальные поля остаются без изменений. Полное обновление заменяет весь документ.

POST /user/_update/1
{
  "doc":{
    "age": 26
  }
}

Кроме того, его можно модифицировать скриптом, например, все существующиеageДокумент для поля, значение которого изменено на 5 лет.

POST /user/_update_by_query
{
  "script": {
    "source": "ctx._source['age']=5" 
  },
  "query": {
    "bool": {
      "must": [
        {
          "exists": {
            "field": "age"
          }
        }
      ]
    }
  }
}

такжеupdateа также_update_by_queryПоля также могут быть измененыFiled, например, изменить имя на имя1, этот контент используется меньше, если вам интересно, обратитесь к официальной документации.

удалить документ

Для удаления документов можно использоватьDELEETEЗапросить, удалить документ с указанным id, также можно использовать_delete_by_query, который удаляет документы при заданных условиях.

DELETE /user/_doc/1
POST /user/_delete_by_query
{
  "query": {
    "match": {
      "name": "pjjlt"
    }
  }
}

Найти документацию

Поиск документов — самая захватывающая часть операций ES, здесь представлены только простые запросы, а сложные запросы и агрегированные запросы будут введены позже.

Запросить документ по id.

GET /user/_doc/1

Найти все документы в индексе

GET /user/_search?pretty

prettyПараметры будут играть роль только в браузере, отформатированы и возвращены в json. Приведенная выше команда по умолчанию возвращает 10 элементов данных. Если вы хотите вернуть больше данных, вы можете добавитьsizeполе.

GET /user/_search?pretty&size=20

Видно, что часть данных находится вhitsВнутри клиент elasticsearch, предоставляемый Spring, будет иметь соответствующие классы сущностей, которые очень удобно использовать в проекте. Давайте посмотрим на значение этих частей.

элемент имея в виду
took сколько времени занимает выполнение запроса
time_out Время запроса истекло
_shards Сколько осколков было обыскано и сколько из них было успешным
Сколько пропусков, сколько неудач
hits.total Сколько всего данных
hits._max_score Среди запрошенных документов оценка наиболее релевантного документа
hits.hits._source запрошенные данные
hits.hits.id первичный ключ документа

Массовые операции

Пакетная операция означает, что пакет команд выполняется одновременно (сокращение операций ввода-вывода), и эти команды не обязательно относятся к одному и тому же типу.

использовать_bulkКоманда может выполнять пакетное добавление, удаление и изменение документов.

POST _bulk
{ "update" : { "_index" : "user", "_id" : "1" } }
{ "doc" : {"age" : 18} }
{ "create" : { "_index" : "user", "_id" : "2" } }
{ "name" : "小明","age":32,"city":"beijing" }
{ "create" : { "_index" : "user", "_id" : "3" } }
{ "name" : "小红","age":21,"city":"sjz" }
{ "create" : { "_index" : "user", "_id" : "4" } }
{ "name" : "mark","age":22,"city":"tianjin" }
{ "delete" : { "_index" : "user", "_id" : "4" } }

Приведенная выше команда обновляет возраст документа с идентификатором 1, добавляет документы с идентификаторами 2, 3 и 4 и удаляет документ с идентификатором 4.

Вышеупомянутые команды нелегко увидеть, когда они сложены вместе, поэтому для удобства читателей ниже они написаны отдельно.

Массовое добавление

POST _bulk
{ "create" : { "_index" : "user", "_id" : "2" } }
{ "name" : "小明","age":32,"city":"beijing" }
{ "create" : { "_index" : "user", "_id" : "3" } }
{ "name" : "小红","age":21,"city":"sjz" }

{ "index" : { "_index" : "user", "_id" : "4" } }
{ "name" : "mark","age":22,"city":"tianjin" }

createКоманда заключается в том, чтобы вставить, только если документ не существует,indexОн рассудит, что если он существует, то будет обновлен, а если не существует, то будет вставлен.

Массовое обновление

POST _bulk
{ "update" : { "_index" : "user", "_id" : "1" } }
{ "doc" : {"age" : 18} }
{ "update" : { "_index" : "user", "_id" : "2" } }
{ "doc" : {"age" : 20} }

Как и при добавлении,updateСледующая строка команды должна следовать за данными data.

пакетное удаление

POST _bulk
{ "delete" : { "_index" : "user", "_id" : "3" } }
{ "delete" : { "_index" : "user", "_id" : "4" } }

Массовый поиск

пакетный поиск, использование_mgetКлючевое слово, массовый поиск также имеет сокращенную форму, если оно не охватывает индекс.

GET /_mget
{
  "docs": [
    {
      "_index": "user",
      "_id": "1"
    },
    {
      "_index": "user",
      "_id": "2"
    }
  ]
}

# 还可以简写形式
POST /user/_mget
{
  "ids": [
    "1",
    "2",
    "3"
  ]
}

DSL-запрос

Elasticsearch предоставляет полный DSL запросов на основе JSON (язык домена) для определения запросов. DSL запроса можно рассматривать как AST (абстрактное синтаксическое дерево) запроса, состоящее из двух типов предложений:Leaf query clauses(пункт запроса листа) иCompound query clauses(предложение составного запроса)

Вышеупомянутое взято с официального сайта, Короче говоря, DSL должен помещать условия запроса в JSON для запроса.

Leaf query clausesНайдите конкретное значение в определенном поле, например.match,term,rangeзапрос и т.д.

Compound query clausesОбъедините листовые предложения запроса с другими соответствующими предложениями запроса, например.boolзапрос и т.д.

match

match – это стандартный запрос. При запросе текста текст сначала будет сегментирован. При запросе точного значения ищется заданное значение, например число, дата, логическое значение или строка not_analyzed.

GET /user/_search
{
  "query": {
    "match": {
      "name":"小明"
    }
  }
}

Вышеупомянутая операция сначала разделит «Сяо Мин» на «Сяо» и «Мин» (конечно, это зависит от вашего токенизатора), а затем перейдет ко всем документам, чтобы найти совпадающие документы, и вернет их в соответствии со степенью релевантности. .

match_phrase

match_phrase сохранит пробелы, а match будет игнорировать пробелы.

GET /user/_search
{
  "query": {
    "match_phrase": {
      "name":"小 明"
    }
  }
}

Обратите внимание, что слово «сегментация» представляет собой пробел, который дает предыдущий элемент, например, за приведенной выше строкой «молекула» следует «маленький», «мин».

multi_match

Запрос с несколькими полями, условие запроса, чтобы увидеть, есть ли во всех нескольких полях совпадающие поля. Позже мы также можем использоватьshouldболее гибкий.

GET /user/_search
{
  "query": {
    "multi_match": {
      "query":    "哈哈", 
      "fields": [ "name","city" ] 
    }
  }
}

match_all

соответствует всем и может установить_score,дефолт_scoreЭто 1, Латиао Цзюнь думает, что здесь нет расчета._score, поэтому скорость будет намного выше.

GET /user/_search
{
  "query": {
    "match_all": { "boost" : 1.2 }
  }
}

boostПараметр можно не указывать, по умолчанию 1.

term

Термин — это точное совпадение, в основном используемое для точного поиска, такого как числа, идентификаторы, адреса электронной почты и т. д.

GET /user/_search
{
  "query": {
    "term": {
      "age": 18
    }
  }
}

terms

terms — это запрос термина с несколькими условиями, и несколько параметров могут быть переданы в виде массива.

GET /user/_search
{
  "query": {
    "terms": {
      "age":[18,21]
    }
  }
}

wildcard

Подстановочные знаки легко понять, взглянув на пример. Подстановочные знаки могут решить проблему, связанную с несоответствием сегментации слов. Например, «ха-ха» может соответствовать «* а».

GET /user/_search
{
  "query": {
    "wildcard": {
      "name":"*a"
    }
  }
}

exists

Проверьте, имеет ли документ определенный атрибут, и вернитесь, чтобы включить егоFiledдокументация.

GET /user/_search
{
  "query": {
    "exists": {
      "field": "name"
    }
  }
}

fuzzy

Возвращает совпадения, которые совпадают или похожи на запрос.

GET /user/_search
{
  "query": {
    "fuzzy": {
      "name":"mjjlt"
    }
  }
}

Критерии поискаmjjlt, вы можете искать имя какpjjltдокументация. Часто ли эта операция встречается в Baidu?

ids

Запрос с несколькими идентификаторами, этот идентификатор является идентификатором первичного ключа, то есть вы указываете или автоматически генерируете его.

GET /user/_search
{
  "query": {
    "ids": {
      "values":[1,2,3]
    }
  }
}

prefix

совпадение префикса

GET /user/_search
{
  "query": {
    "prefix": {
      "name":"pj"
    }
  }
}

range

Ассортимент совпадает. Параметры могут бытьgt(больше, чем),gte(больше или равно),lt(меньше, чем),lte(меньше или равно)

GET /user/_search
{
  "query": {
    "range": {
      "age":{
          "gt":1,
          "lt":30
      }
    }
  }
}

regexp

Обычный матч. value — регулярное выражение, flags — соответствующий формат, значение по умолчанию — ALL, и все они включены. больше форматовпожалуйста ткните

GET /user/_search
{
  "query": {
    "regexp": {
      "name":{
          "value": "p.*t",
          "flags": "ALL"
      }
    }
  }
}

bool

bool можно использовать для объединения других подзапросов. Обычно включаемые подзапросы включают: must, filter, should, must_not.

must

mustВнутреннее условие должно содержать, внутреннее условиеandОтношение. Например, просмотрите все пользовательские документы, имя которых содержит слово «маленький» и возраст которых составляет 32 года.

GET /user/_search
{
  "query": {
    "bool" : {
      "must": [
        {"term" : { "name" : "小" }},
        {"term" : { "age" : 32 }}
      ]
    }
  }
}

filter

filterОтфильтрован ли документ по каким-то условиям, это единственное из четырех ключевых словНезависимо от релевантности, _score не будет рассчитываться, часто используемые фильтры будут генерировать кеш.

GET /user/_search
{
  "query": {
    "bool" : {
      "filter": {
        "term" : { "name" : "小" }
      }
    }
  }
}

Сравнивая два рисунка, видно, что фильтр не считает _score, и скорость поиска выше.

must_not

это иmustИ наоборот, поле в документе не должно содержать значение, эквивалентное «не».

should

shouldможно рассматривать какorНапример, следующее имя запроса содержит «маленький» или пользователей, возраст которых составляет 18 лет.

GET /user/_search
{
  "query": {
    "bool" : {
      "should": [
        {"term" : { "name" : "小" }},
        {"term" : { "age" : 18 }}
      ]
    }
  }
}

Совокупный запрос

В дополнение к функции полнотекстового поиска Elasticsearch предоставляет функции статистического анализа данных Elasticsearch. Вы можете запросить максимальное и минимальное значения группы данных,группировкаЗапросите некоторые данные.

  • Метрика: тип анализа метрик, например, вычисление максимального значения, минимального значения, среднего значения и т. д. (операция выполнения совокупного анализа документов в корзине).
  • Bucket: тип сегмента, аналогичный синтаксису GROUP BY в SQL (набор документов, удовлетворяющих определенным условиям).
  • Конвейер: Тип анализа конвейера, основанный на результатах анализа агрегации предыдущего уровня для текущего анализа.

Метрические данные

Общие математические операции

Обычно используемые математические операции здесьmin(минимум),max(максимум),sum(а также),avg(средний). Обратите внимание, что эти операции могут вывести только один результат анализа. Использование аналогично.

GET /user/_search
{
    "aggs" : {
        "avg_user_age" : 
        { 
          "avg" : { "field" : "age" } 
        }
    }
}

Приведенный выше пример запрашивает средний возраст всех пользователей, возвращает все документы и агрегированные результаты запроса.aggsключевое слово агрегированного запроса,avg_user_ageЭто имя запроса, которое может быть определено пользователем.

cardinality

Вычислить номер поля после дедупликации

GET /user/_search
{
    "aggs" : {
        "avg_user" : 
        { 
          "cardinality" : { "field" : "age" } 
        }
    }
}

Можно подсчитать, что количество документов с разным возрастом во всех документах.

percentiles

Накапливает пропорцию количества документов, соответствующих каждому значению значения указанного поля, от малого к большому, и возвращает значение, соответствующее указанной пропорции.

Процент статистики по умолчанию: **[ 1, 5, 25, 50, 75, 95, 99]**

GET /user/_search
{
    "aggs" : {
        "avg_user" : 
        { 
          "percentiles": { "field" : "age" } 
        }
    }
}

# 返回值(省略文档部分,只分析结果部分)
  "aggregations" : {
    "avg_user" : {
      "values" : {
        "1.0" : 12.0,
        "5.0" : 12.0,
        "25.0" : 20.25,
        "50.0" : 29.0,
        "75.0" : 57.75,
        "95.0" : 123.0,
        "99.0" : 123.0
      }
    }
  }

Видно, что верхний 1% пользователей моложе 12 лет, 5% пользователей моложе 12 лет, 25% пользователей моложе 20,25 лет и 50% пользователей моложе 29 лет. Старый. . .

percentile_ranks

процентили — найти поле документа в процентах, а процентили_ранги — найти процент поля в данном документе.

GET /user/_search
{
    "aggs" : {
        "avg_user" : 
        { 
          "percentile_ranks": 
            { 
              "field" : "age",
              "values" : [18, 30]
            } 
        }
    }
}

# 返回值(省略文档部分,只分析结果部分)
  "aggregations" : {
    "avg_user" : {
      "values" : {
        "18.0" : 18.51851851851852,
        "30.0" : 54.44444444444445
      }
    }
  }

Видно, что 18,52% пользователей моложе или равны 18 годам, а 54,4% пользователей моложе или равны 30 годам.

top_hits

top_hits может получить первые n документов при определенных условиях.

GET /user/_search
{
  "aggs": {
    "avg_user" : {
      "top_hits": {
          "sort": [
          {
            "age": {
              "order": "asc"
            }
          }
        ],
        "size": 1
      }
    }
  },
  "size": 0
}

Возьмем самого младшего возраста.

Ведро

Подобно концепции группировки.

terms

Возвращает количество документов в группе в соответствии с заданной группировкой.

GET /user/_search
{
    "aggs" : {
        "avg_user" : 
        { 
          "terms": {
                  "field": "city"
                }
        }
    }
}

Вышеупомянутое сгруппировано по городам, чтобы увидеть, сколько пользователей в каждом городе.

ranges

группировать по интервалу

GET /user/_search
{
  "aggs": {
    "price_ranges": {
      "range": {
        "field": "age",
        "ranges": [
          { "to": 20 },
          { "from": 20, "to": 30 },
          { "from": 30 }
        ]
      }
    }
  }
}

Вы можете просмотреть количество пользователей для каждой возрастной группы.

Также есть несколько очень интересных инструкций, например [IP range], которые можно сгруппировать по интервалу ip сегмента, который будет использоваться в дальнейшем, надеюсь текст можно обновить без абзацев...