Основы ElasticSearch и синтаксис запросов

Elasticsearch

1. Базовые теоретические знания

  1. представлять

    ElasticSearch — это поисковая платформа, работающая практически в реальном времени. То есть, когда вы индексируете документ, может быть небольшая задержка (обычно на втором уровне), задержка в логцентре компании происходит на уровне Kafka2ES, а не на уровне индекса.

    ElasticSearch — это распределенная и масштабируемая система поиска и анализа в реальном времени, поисковая система, построенная на основе системы полнотекстового поиска Apache Lucene™. Конечно, ElasticSearch не так прост, как Lucene, он не только включает в себя функцию полнотекстового поиска, но и умеет выполнять следующую работу:

    • Распределенное хранилище документов в реальном времени, где каждое поле можно индексировать и искать

    • Распределенная аналитическая поисковая система в реальном времени

    • Возможность масштабирования сотен сервисных узлов и поддержка структурированных или неструктурированных данных на уровне PB.

    ElasticSearch Английский перевод: эластичный поиск.

  2. основная концепция

    Это можно понять так: ElasticSearch — это документо-ориентированная база данных, часть данных — это документ в ней, а в качестве формата сериализации документов используется JSON. Ниже приведена сравнительная таблица терминов ElasticSearch и реляционной базы данных:

    MySQL

    ElasticSearch

    База данных

    соответствующий срок

    имея в виду

    Индекс (Индекс)

    Коллекция документов, аналогичная концепции базы данных в mysql.

    Стол

    тип

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

    Ряд (ряд)

    Документ

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

    Столбец

    Поля

    Показатель

    Все проиндексировано по умолчанию (все поля проиндексированы по умолчанию)

    SQL (структурированный язык запросов)

    Query DSL (специфический язык запросов)

    Shards

    Когда объем данных велик, выполняется горизонтальное расширение для повышения производительности поиска.

    Осколки содержат только часть всех данных в индексе.

    Наши документы хранятся в осколках и индексируются в осколках, но наше приложение не взаимодействует с ними напрямую, а взаимодействует непосредственно с индексом.

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

    Replicas

    Чтобы предотвратить потерю данных шарда, его можно выполнять параллельно в резервном копировании данных и поиске для повышения производительности.

  3. Преимущество

    Преимущество

    имея в виду

    Горизонтальная масштабируемость

    Добавление серверов можно настроить непосредственно в кластере, если имя кластера непротиворечиво.

    Механизм фрагментации

    Он может обеспечить лучшее распределение и разделять и властвовать для повышения эффективности обработки.

    Высокая доступность

    Обеспечивает механизм репликации.

    в реальном времени

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

    Относительно горизонтального и вертикального масштабирования баз данных: для большинства баз данных горизонтальное масштабирование означает, что ваша программа должна будет внести очень большие изменения, чтобы воспользоваться преимуществами этих недавно добавленных возможностей. Напротив, Elasticsearch по своей сути распределен и знает, как управлять узлами, чтобы обеспечить высокую масштабируемость и высокую доступность. Это означает, что ваша программа не должна заботиться об этом. Если вы соблюдаете определенные правила при создании кластеров, узлов и сегментов, вы можете масштабироваться в соответствии со своими потребностями и обеспечивать безопасность данных в случае аппаратных сбоев.

    Чтобы проиллюстрировать значение осколков и репликаций осколков, а также способы расширения, вот каштан:


    (1), запустите пустой узел, в это время у него нет ни индекса, ни данных документа.

    (2) Мы добавили индекс с именем log и установили для него три основных сегмента. (ES по умолчанию имеет 5 основных осколков).

    (3), работа с одним узлом подвержена единственной точке отказа - потере данных, затем мы расширяем второй узел, устанавливаем то же имя cluster.name для присоединения к тому же кластеру, устанавливаем индекс журнала, чтобы он был один для каждого основного сегмента. Осколки В настоящее время любой сбой узла может по-прежнему поддерживать запросы клиента.

    (4) В это время мы продолжаем расширять и расширять третий узел.Кластер ES будет реорганизован, и шарды будут переназначены для балансировки нагрузки.В настоящее время каждый узел имеет только два шарда, что меньше, чем раньше.Один, что означает, что шард каждого узла имеет больше ресурсов, таких как ЦП, ввод-вывод и т. д.

    (5) Если узел имеет только один осколок, то осколок может исключительно совместно использовать все ресурсы текущего узла. Что, если нам нужно масштабировать более 6 узлов? Количество первичных сегментов было определено при создании индекса, затем мы можем увеличить количество реплицированных сегментов и установить для каждого сегмента два реплицированных сегмента.

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

  4. показатель

    B-/B+Tree реляционной базы данных, ES принимает инвертированный индекс, и весь дизайн индекса ES направлен на повышение производительности поиска.

    Индекс дерева B-/B+:

    Это структура индекса, оптимизированная для записи. Характеристика заключается в том, что эффективность бинарного поиска составляет logN, и нет необходимости перемещать все узлы при вставке нового узла. Поэтому для хранения индекса используется древовидная структура, которая может занимать учитывать производительность вставки и запроса одновременно.

    Перевернутый индекс:

    Структура инвертированного индекса:


    Возьмите каштан:

    ID

    Name

    Age

    Sex

    1

    Kate

    24

    Женский

    2

    John

    24

    мужчина

    3

    Bill

    29

    мужчина

    Тогда индекс, созданный ES, выглядит следующим образом:

    имя:

    Term

    Posting List

    Kate

    [1]

    John

    [2]

    Bill

    [3]

    Возраст:

    Term

    Posting List

    24

    [1,2]

    29

    [3]

    Sex:

    Term

    Posting List

    мужчина

    [2,3]

    Женский

    [1]

    Как и выше, Elasticsearch установил инвертированный индекс для каждого поля: Kate, John, 24, Female называются терминами, а 1 и 2 — списками публикации. Список публикаций — это массив целых чисел, в котором хранятся все идентификаторы документов, соответствующие термину. В каждой части ES используются некоторые технологии оптимизации и сжатия. Например, Term Index использует индексную страницу, подобную словарю, которую можно понимать как дерево. Term Dictionary хранит блоки, находит соответствующий узел из Term Index, а затем переходит к Термин Найдите соответствующий блок в Словаре, чтобы диск выполнил поиск Термина.


    После упрощения хранения таким образом, ES все еще не удовлетворяет.Чтобы хранить Term Index, Term Dictionary и Posting List в памяти, Term Index использует FST-сжатие, а Posting List принимает: инкрементное сжатие кодирования, которое преобразует большие числа в десятичные дроби , по байтам, сжатым для хранения.

    Сжатие списка сообщений:


2. Запрос

То, как вы взаимодействуете с ES, зависит от того, используете ли вы JAVA или нет. Ниже мы возьмем JAVA в качестве примера для объяснения запроса ES.

JAVA API

если вы используете Java, в коде вы можете использовать два встроенных клиента ElasticSearch: Node client и Transport client. Порт по умолчанию для Java-клиентов — 9300, и для взаимодействия с кластером используется собственный транспортный протокол ES.

RESTful API with JSON over HTTP

Введение

Все другие языки могут быть использованыRESTful API через порт

9200
Общайтесь с ElasticSearch. Запрос ElasticSearch состоит из тех же частей, что и любой HTTP-запрос:

curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'

Детали, отмеченные

имея в виду

VERB

правильный HTTP

метод
или
предикат
: GET`, `POST`, `PUT`, `HEAD` или `DELETE`.

PROTOCOL

http или https` (если у вас есть https-прокси перед ElasticSearch)

HOST

Имя хоста любого узла в кластере ElasticSearch или localhost для узла на локальном компьютере.

PORT

Номер порта для запуска HTTP-сервиса ElasticSearch, по умолчанию — 9200.

PATH

Путь конечной точки к API (например, _count вернет количество документов в кластере). Путь может содержать несколько компонентов, например: _cluster/stats и _nodes/stats/jvm.

QUERY_STRING

Любые необязательные параметры строки запроса (например, pretty выводит возвращаемое значение JSON, отформатированное для облегчения чтения)

BODY

Тело запроса в формате JSON (если требуется по запросу)

Возьмите два каштана:

(1) Чтобы подсчитать количество документов в кластере, мы можем использовать это:

curl -XGET 'http://localhost:9200/_count?pretty' -d '
{
    "query": {
        "match_all": {}
    }
}

ES вернет код состояния HTTP (например: 200 OK`) и (за исключением запросов `HEAD`) возвращаемое значение в формате JSON. Тело JSON выглядит следующим образом:

{
    "count" : 0,
    "_shards" : {
        "total" : 5,
        "successful" : 5,
        "failed" : 0
    }
}

(2) Возьмем в качестве примера запрос Центра журналов Университета Синьмэй:

curl -XPOST 'http://es.data.sankuai.com/log.mapi-log-service.userbehaviours_all/_search?pretty' -d'
{
    "query": {
        //TODO:查询语句
    },
"size":"100"
}'

забрать

Два способа: отправить запрос HTTP GET для получения, использовать выражение запроса ES (DSL) для извлечения.

Первый способ — создать запрос HTTP GET: (Ниже приведен сокращенный формат, то есть в запросе опущены все одинаковые части, такие как имя хоста, номер порта и сама команда curl, а не полный запрос)

Ссылаться на:woohoo.elastic.co/дорогой/талантливый/плохой…

woohoo.elastic.co/дорогой/талантливый/плохой…

curl -XGET /megacorp/employee/1

Возвращенная информация содержит некоторую основную информацию, а также метаданные JSON для поиска:

{
  "_index" :   "megacorp",
  "_type" :    "employee",
  "_id" :      "1",
  "_version" : 1,
  "found" :    true,
  "_source" :  {
      "first_name" :  "John",
      "last_name" :   "Smith",
      "age" :         25,
      "about" :       "I love to go rock climbing",
      "interests":  [ "sports", "music" ]
  }
}

Второй способ — использовать выражение запроса ES (DSL) для извлечения: параметр запроса строится как JSON в соответствии с форматом, согласованным ES для запроса.

Ссылаться на:woohoo.elastic.co/дорогой/талантливый/плохой…

Общие запросы:

режим запроса

имея в виду

инструкции

Примечание

фильтрация терминов

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

строка not_analyzed: текстовый тип данных без слов.

{ 
  "query": { 
    "term": { 
      "title": "内蒙古" 
    } 
 } 
}

фильтровать по терминам

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

{
  "query": {
    "terms": {
      "title": [
        "内蒙古",
        "黑龙江"
      ]
    }
  }
}

range

Фильтрация диапазона позволяет нам найти пакет данных по указанному диапазону.

{
"query":{
  "range": {
    "pubTime": {
      "gt": "2017-06-25",
      "lt": "2017-07-01"
    	}
  	}
	}
}

Операторы диапазона включают:

ключевые слова

имея в виду

gt

больше, чем

gte

больше или равно

lt

меньше, чем

lte

меньше или равно

существует и отсутствует

Фильтры существования и отсутствия можно использовать, чтобы определить, содержит ли документ указанное поле или не имеет поля, аналогично условию IS_NULL в операторе SQL.

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

{
    "exists":{
        "field":"title"
    }
}

логический фильтр

Булева фильтрация может использоваться для объединения логической логики результатов запроса нескольких условий фильтрации.Она включает следующие операторы:

must :: Точное совпадение нескольких условий запроса, эквивалентное и.

must_not :: Обратное сопоставление нескольких условий запроса, эквивалентное not.

должно :: По крайней мере одно условие запроса соответствует, эквивалентно или.

Эти параметры могут наследовать условие фильтра или массив условий фильтра соответственно.

{
    "bool":{
        "must":{
            "term":{
                "folder":"inbox"
            }
        },
        "must_not":{
            "term":{
                "tag":"spam"
            }
        },
        "should":[
            {
                "term":{
                    "starred":true
                }
            },
            {
                "term":{
                    "unread":true
                }
            }
        ]
    }
}

3. Ссылка

woohoo.elastic.co/expensive/en/bad…

woohoo.elastic.co/дорогой/талантливый/плохой…

nuggets.capable/post/684490…