Весь процесс ElasticSearch

Java задняя часть Elasticsearch
Весь процесс ElasticSearch

Давайте сначала поговорим о чем-нибудь интересном :)

Много лет назад недавно женившийся безработный застройщик по имени Шей Бэнон последовал за своей женой в Лондон, где он учился готовить. В поисках прибыльной работы он начал использовать раннюю версию Lucene, чтобы создать поисковую систему рецептов для своей жены.

Использовать Lucene напрямую было сложно, поэтому Шей решил создать уровень абстракции, который Java-разработчики могли бы использовать для простого добавления функций поиска в свои программы. Он выпустил свой первый проект с открытым исходным кодом Compass.

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

Первая общедоступная версия была выпущена в феврале 2010 года, и с тех пор Elasticsearch стал одним из самых активных проектов на Github. Компания начала предлагать коммерческие услуги по Elasticsearch и разрабатывать новые функции, однако Elasticsearch всегда будет с открытым исходным кодом и доступным для всех.

Говорят, что жена Шэя все еще ждет своего поисковика рецептов...​

что такое ЭС

  • поисковый движок
  • Поиск почти в реальном времени
  • RESTful API
  • Распределенный и высокодоступный
  • Для хранения документов формат json
  • На основе Apache Lucene

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

  • Кластер Кластер
  • Узел представляет собой один узел кластера
  • Индекс Индекс
  • Разделение осколков
  • Реплика
  • Сегмент
  • Документ документ
  • Поле поля
  • Перевернутый индекс
  • Тип текста/ключевого слова

Используйте весь процесс

schema(mapping)

es не требует определения предварительной схемы, схема определяется при индексировании документа

Поскольку интерактивной формой данных es является json, документ можно использовать "из коробки". Если при написании документа нет предопределенного сопоставления, каждое поле документа будет определять тип в соответствии с переданными данными json. Правило по умолчанию (dynamic field mapping)следующее:

json-тип тип es
null поле не увеличится
boolean boolean
string Дата (черезDate detection) двойной/длинный (черезNumeric detection)текст (подполе с ключевым словом)
number float/long
object Object
array массив (тип элемента массива зависит от типа первого ненулевого элемента)

В то же время es также поддерживает определение шаблонов.dynamic_template, чтобы расширить и изменить правила по умолчанию. Например, в следующем примере изменяется сопоставление строк по умолчанию:

{

  "mappings": {

    "dynamic_templates": [

      {

        "strings_as_keywords": {

          "match_mapping_type": "string",

          "mapping": {

            "type": "text"

          }

        }

      }

    ]

}

Однако, если в динамических полях нет необходимости, я не рекомендую использовать динамическое сопоставление es. Неправильное использование загрязнит сопоставление, поэтому вы можете указать для параметра dynamic значение false, чтобы отключить динамическое сопоставление.

Конечно, вы можете использовать API-интерфейс сопоставления put для предварительного определения структуры сопоставления индекса, включая тип поля, используемый анализатор (текстовый тип), необходимость индексирования и т. д.

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

Рекомендуется использовать псевдоним (алиас), т.е. открыто расширение маппинга, но модификация маппинга запрещена. Например, поле можно добавить к отображению, но нельзя удалить/изменить поле. Поэтому используйте псевдоним, чтобы указать на реальный индекс. Таким образом, когда есть поля, которые необходимо изменить, вы можете использовать API-интерфейс переиндексации для перестроения индекса, а затем использовать API-псевдоним для изменения точки, что может обеспечить бесшовное переключение.

запись данных

Распределенный процесс записи

Видно, что общая задержка записи es равна времени записи на мастер-узел + max (время записи на подчиненный узел).

Процесс написания шарда

Еще три важных понятия

  • refresh
  • flush
  • fsync todo: будут ли потеряны данные

Оптимизация записи

  • Массовые операции с использованием массового API
  • Отрегулируйте интервал refresh_interval, es будет создавать сегмент lucene при каждом обновлении и пытаться объединить сегменты, накладные расходы высоки, если требования к поиску в реальном времени не высоки, вы можете соответствующим образом увеличить размер refresh_interval
  • Поля, для которых не требуется индекс, определяют атрибут индекса как not_analyzed.
  • SSD (классическая производительность не очень хорошая, для компенсации используется аппаратное обеспечение)

читать

Search

Поиск данных может быть легко осуществлен с помощью API поиска. es предоставляет множество поисковых API, таких как match_query, term_query и т. д., которые могут легко собирать запросы DSL (Domain Specific Language), и разработчикам не нужно учитывать порядок запросов в DSL, порядок запросов в dsl не повлияет Окончательная эффективность выполнения, реальный порядок выполнения будет изменен после CBO (оптимизатор на основе затрат).

  • индекс термина использует FST (конечные автоматы) -> позиционирование перевернутой цепочки

  • SkipList -> Объединить перевернутые цепочки

Aggregation

  • Метрики выполняют количество, максимальное количество и другие операции над набором данных, попавшим в запрос, который представляет собой одно значение.
  • Bucket делит набор данных, на который попал запрос, на более мелкие наборы данных в соответствии с условиями, а затем выполняет Metrics для этих небольших наборов, что может быть аналогично группировке по в sql.

Sort

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

Документ, возвращенный ES, по умолчанию будет отсортирован в порядке убывания по _score (релевантность документа), то есть по значению балла после расчета балла.Если указаны другие поля сортировки, они будут отсортированы в соответствии с указанными полями. Скрипт также поддерживается для создания более сложных правил сортировки.

_score, расчет оценки зависит от разных методов запроса. Например, нечеткий запрос вычисляет степень корреляции с написанием поискового запроса, запрос термина вычисляет процентное соотношение между содержанием и ключевым словом и так далее. Но в целом под полнотекстовым поиском понимается вычисление степени корреляции между контентом и ключевыми словами.Алгоритм подобия ElasticSearch используетTF/IDF, частота термина/обратная частота документа, включая следующее:

  • Частота терминов: как часто искомый термин появляется в этом поле. Чем выше частота, тем выше корреляция. 5 вхождений в поле более релевантны, чем 1 вхождение.
  • Обратная частота документа: как часто каждый термин появляется в указателе. Чем выше частота, тем ниже корреляция. Поисковый термин, который появляется в большинстве документов, будет иметь меньший вес, чем несколько документов, то есть для проверки общей важности поискового термина в документе.
  • Рекомендации по длине поля:Какова длина поля? Чем больше длина, тем ниже корреляция. Поисковый запрос появляется в краткомtitleчем одно и то же слово встречается в более длинномcontentПоля более актуальны.

Page

  1. Пейджинг на основе смещения
  • from + size, from указывает смещение, а size указывает количество данных, которые нужно извлечь
  • Принцип выполнения:

es from+size分页.png

  1. Клиент инициирует запрос, а осколок, получивший запрос, становится узлом-координатором, отвечающим за слияние данных последующего запроса.
  2. Выполнить запрос, получить результирующий набор size from+size, координировать узел для создания приоритетной очереди размера from+size локально и распределить запрос на другие сегменты из координационного узла.
  3. Другие сегменты также выполняют запрос, получают результирующий набор size from+size и возвращают набор координирующему узлу.
  4. Координационный узел объединяет набор результатов, наконец, получает приоритетную очередь размера from+size и возвращает данные последнего размера клиенту.
  • Функции:

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

    1. scroll
  • Для этого запроса все результаты, соответствующие условиям, будут кэшироваться в узле-координаторе, а затем напрямую извлекаться из кеша узла-координатора.
  • Из-за наличия кеша последующие изменения документа не будут синхронизироваться с кешем, что не подходит для запросов в реальном времени.
  • Кроме того, поскольку объем кэшированных данных равен всем документам, затронутым запросом, накладные расходы памяти кучи при прокрутке очень велики.
  • Подходит для малочастотных сценариев не в реальном времени, таких как реконструкция индекса/миграция данных.
  1. search_after
  • Используйте результаты поиска на предыдущей странице, чтобы получить следующую страницу. Уникальный идентификатор документа должен быть включен в поле сортировки, чтобы обеспечить согласованность search_after.
  • Размер набора данных, запрошенный каждым сегментом, равен размеру
  • Случайный доступ к пейджингу не поддерживается
  • Обработка в режиме реального времени, если документ изменен и затронут фактор сортировки, могут быть дублирующиеся данные

оптимизация чтения

  • Поле номера типа без необходимости поиска по диапазону, тип определяется как ключевое слово
  • Используйте запрос с подстановочными знаками с осторожностью, старайтесь использовать результат сегментации слов и используйте запрос на соответствие, если есть необходимость использовать запрос с подстановочными знаками, обратите внимание на экранирование символов.
  • Ограничьте длину поисковых запросов
  • Сценарии потоковой передачи используют search_after
  • Поля, не требующие оценки, заменяют содержимое запроса контекстом фильтра,Разница между запросом и фильтром

Справочная документация

  1. ЕС на гитхабе:GitHub.com/эластик/голодный…
  2. Официальная документация ЕС:woohoo.elastic.co/expensive/en/bad…
  3. Процесс записи ES:blog.CSDN.net/R_P_J/art IC…