предисловие
1.Elasticsearch — это распределенная система поиска и анализа данных RESTful.
(1) Запросы: Elasticsearch позволяет выполнять и комбинировать несколько типов поиска — структурированный, неструктурированный, географический, метрический — как вам угодно.
(2) Анализ. Одно дело найти десять документов, которые лучше всего соответствуют запросу. Но если вы столкнулись с логом в миллиард строк, как его интерпретировать? Агрегации Elasticsearch позволяют вам увидеть общую картину и изучить тенденции и закономерности в ваших данных.
(3) Скорость: Elasticsearch работает быстро. Действительно, очень быстро.
(4) Масштабируемость: его можно запустить на ноутбуке. Он также может работать на сотнях или тысячах серверов, на которых размещаются петабайты данных.
(5) Эластичность: Elasticsearch работает в распределенной среде, которая была разработана с учетом этого.
(6) Гибкость: с несколькими сценариями. Числа, текст, геолокация, структурированные, неструктурированные. Приветствуются все типы данных.
(7) HADOOP и SPARK: Elasticsearch + Hadoop
2.Elasticsearch — это хорошо масштабируемая система полнотекстового поиска и анализа с открытым исходным кодом. Он позволяет хранить, искать и анализировать большие объемы данных быстро и почти в режиме реального времени.
Вот несколько вариантов использования Elasticsearch:
(1) Вы управляете интернет-магазином и позволяете своим покупателям искать товары, которые вы продаете. В этом случае вы можете использовать Elasticsearch для хранения всего вашего каталога продуктов и инвентаря и предоставления им предложений по поиску и автозаполнению.
(2) вы хотите собирать данные журналов или транзакций, а также анализировать и анализировать данные, чтобы найти тенденции, статистику, сводку или отклонения от нормы. В этом случае вы можете использовать loghide (часть стека Elasticsearch/loghide/Kibana) для сбора, агрегирования и анализа данных, а затем позволить loghide вводить данные в elasticsearch. Когда данные находятся в Elasticsearch, вы можете запустить поиск и агрегацию, чтобы использовать любую интересующую вас информацию.
(3) Вы запускаете платформу оповещения о ценах, которая позволяет клиентам, разбирающимся в цене, указать правило, например: «Я заинтересован в покупке определенного электронного устройства, и я хотел бы получать уведомления, если цена продукта какого-либо поставщика упадет ниже X долларов в следующем месяце». В этом случае вы можете получить цены поставщика, отправить их в Elasticsearch и использовать его функцию Percolator, чтобы сопоставить изменения цен с запросами клиентов и, наконец, отправить оповещение, когда клиентам будет найдено совпадение.
(4) У вас есть потребности в аналитике/бизнес-аналитике, и вы хотите быстро исследовать, анализировать, визуализировать и задавать специальные вопросы о больших объемах данных (подумайте о миллионах или миллиардах записей). В этом случае вы можете использовать Elasticsearch для хранения данных, а затем использовать Kibana (часть стека Elasticsearch/loghide/Kibana) для создания пользовательских информационных панелей для визуализации различных аспектов данных, которые важны для вас. Кроме того, вы можете использовать возможности агрегации Elasticsearch для выполнения сложных запросов бизнес-аналитики к данным.
Elasticsearch Вопросы на собеседовании
1. Подробно опишите процесс обновления и удаления документов в Elasticsearch.
2. Подробно опишите процесс поиска Elasticsearch.
3. Как в Elasticsearch найти соответствующий инвертированный индекс по слову?
4. При развертывании Elasticsearch, каковы методы оптимизации настроек Linux?
5. Что касается GC, на что следует обратить внимание при использовании Elasticsearch?
6. Как Elasticsearch реализует агрегацию больших объемов данных (сотни миллионов)?
7. В случае параллелизма, гарантирует ли Elasticsearch согласованность чтения и записи?
8. Как контролировать состояние кластера Elasticsearch?
9. Представьте общую техническую структуру вашего поиска в электронной коммерции.
10, расскажите нам о вашей персонализированной программе поиска?
11. Вы знаете дерево словаря?
12. Как осуществляется орфографическая коррекция?
1. Подробно опишите процесс обновления и удаления документов в Elasticsearch.
(1) Удаление и обновление также являются операциями записи, но документы в Elasticsearch неизменяемы, поэтому их нельзя удалить или изменить, чтобы показать их изменения;
(2) Каждому сегменту на диске соответствует файл .del. При отправке запроса на удаление документ фактически не удаляется, а помечается для удаления в файле .del. Документ по-прежнему будет соответствовать запросу, но будет отфильтрован из результатов. При объединении сегментов документы, помеченные для удаления в файле .del, не будут записываться в новый сегмент.
(3) Когда создается новый документ, Elasticsearch присваивает документу номер версии.При выполнении обновления старая версия документа помечается для удаления в файле .del, а новая версия документа индексируется в новый сегмент. Старые версии документов по-прежнему будут соответствовать запросу, но будут отфильтрованы из результатов.
2. Подробно опишите процесс поиска Elasticsearch.
(1) поиск выполняется в виде двухэтапного процесса, который мы называем запрос, затем вытесните;
(2) На начальном этапе запроса запрос передается каждой копии сегмента (первичному сегменту или сегменту реплики) в индексе. Каждый шард выполняет поиск локально и строит приоритетную очередь размера из документов, соответствующих размеру +.
PS: при поиске будет запрашиваться кэш файловой системы, но некоторые данные все еще находятся в буфере памяти, поэтому поиск осуществляется почти в режиме реального времени.
(3) Каждый осколок возвращает идентификаторы и значения сортировки всех документов в своей собственной очереди приоритетов узлу-координатору, который объединяет эти значения в свою очередь приоритетов для создания глобально отсортированного списка результатов.
(4) Следующим шагом является фаза поиска.Координирующий узел определяет, какие документы необходимо получить, и отправляет несколько запросов GET в соответствующие сегменты. Каждый сегмент загружает и дополняет документ, если это необходимо, а затем возвращает документ координатору. Как только все документы получены, узел-координатор возвращает результат клиенту.
(5) Дополнение: тип поиска «Запрос, затем выборка» относится к данным этого сегмента при оценке релевантности документа, что может быть неточным, если количество документов невелико.Запрос DFS, затем выборка добавляет обработку перед запросом, спросите периодичность сроков и документов, этот показатель более точен, но производительность будет хуже. *
3. Как в Elasticsearch найти соответствующий инвертированный индекс по слову?
(1) Процесс индексации Lucene — это процесс записи инвертированного списка в этот формат файла в соответствии с основным процессом полнотекстового поиска.
(2) Процесс поиска Lucene — это процесс считывания проиндексированной информации в соответствии с этим форматом файла с последующим вычислением оценки каждого документа.
4. Какие существуют методы оптимизации параметров Linux при развертывании Elasticsearch?
(1) Идеально подходят машины с памятью 64 ГБ, но также распространены машины с памятью 32 ГБ и 16 ГБ. Все, что меньше 8 ГБ, контрпродуктивно.
(2) Если вам нужно выбирать между более быстрым процессором и большим количеством ядер, лучше выбрать больше ядер. Дополнительный параллелизм, обеспечиваемый несколькими ядрами, перевешивает немного более высокую тактовую частоту.
(3) Если вы можете позволить себе твердотельный накопитель, он будет намного лучше любого вращающегося носителя. Для узлов на основе SSD улучшена производительность как запросов, так и индексов. Если вы можете себе это позволить, SSD — хороший выбор.
(4) Избегайте кластеров, охватывающих несколько центров обработки данных, даже если центры обработки данных находятся поблизости. Определенно избегайте кластеров, охватывающих большие географические расстояния.
(5) Пожалуйста, убедитесь, что JVM работает ваше приложение, а JVM сервера точно так же. В нескольких местах в Elasticsearch используется родная сериализация Java.
(6) Установив gateway.recover_after_nodes, gateway.expected_nodes, gateway.recover_after_time, вы можете избежать слишком большого количества обменов осколками при перезапуске кластера, что может сократить восстановление данных с часов до секунд.
(7) Elasticsearch по умолчанию настроен на использование одноадресного обнаружения, чтобы предотвратить непреднамеренное присоединение узлов к кластеру. Только узлы, работающие на одном компьютере, автоматически образуют кластер. Лучше использовать одноадресную рассылку вместо многоадресной.
(8) Не изменяйте произвольно размер сборщика мусора (CMS) и каждого пула потоков.
(9) Предоставьте Lucene (менее) половину вашей памяти (но не более 32 ГБ!), задайте через переменную окружения ES_HEAP_SIZE.
(10) Перенос памяти на диск губителен для производительности сервера. Если память выгружается на диск, 100-микросекундная операция может стать 10-миллисекундной. Подумайте еще раз о совокупной 10-микросекундной задержке операции. Нетрудно понять, насколько ужасен обмен подкачки для производительности.
(11) Lucene использует много файлов. В то же время Elasticsearch также использует множество сокетов для связи между узлами и HTTP-клиентами. Все это требует достаточного количества файловых дескрипторов. Вы должны увеличить дескриптор файла до большого значения, например 64 000.
Дополнение: Метод повышения производительности на этапе индексации
(1) Используйте пакетные запросы и изменяйте их размер: 5–15 МБ на пакет — хорошая отправная точка.
(2) Хранилище: используйте SSD
(3) Сегментация и слияние: значение Elasticsearch по умолчанию составляет 20 МБ/с, что должно быть хорошим значением для механических дисков. Если вы используете SSD, рассмотрите возможность увеличения скорости до 100–200 МБ/с. Если вы выполняете пакетный импорт и вообще не заботитесь о поиске, вы можете полностью отключить регулирование слияния. Также можно увеличить параметр index.translog.flush_threshold_size со значения по умолчанию 512 МБ до большего значения, например 1 ГБ, что может привести к накоплению больших сегментов в журнале транзакций при запуске сброса.
(4) Если для ваших результатов поиска не требуется точность, близкая к реальному времени, рассмотрите возможность изменения index.refresh_interval каждого индекса на 30 секунд.
(5) Если вы выполняете импорт больших партий, рассмотрите возможность отключения реплик, установив index.number_of_replicas: 0.
5. Что касается GC, на что следует обратить внимание при использовании Elasticsearch?
(1) Индекс инвертированного словаря должен находиться в памяти и не может быть GC.Необходимо отслеживать тенденцию роста сегментной памяти на узле данных.
(2) Все виды кешей, кеш полей, кеш фильтров, кеш индексации, массовая очередь и т. д. должны иметь разумный размер, и должна ли куча быть достаточной в зависимости от наихудшего случая, то есть все виды кеши полностью заняты, есть ли место в куче, которое можно выделить для других задач? Избегайте использования методов «самообмана», таких как очистка кеша для освобождения памяти.
(3) Избегайте поиска и агрегирования, которые возвращают большое количество наборов результатов. Сценарии, которые действительно требуют извлечения большого количества данных, могут быть реализованы с помощью API сканирования и прокрутки.
(4) Статистика кластера хранится в памяти и не может масштабироваться по горизонтали.Сверхбольшие кластеры можно считать разделенными на несколько кластеров, связанных узлами племени.
(5) Если вы хотите знать, достаточно ли кучи, вы должны объединить реальные сценарии приложений и постоянно отслеживать использование кучи в кластере.
(6) Понимание требований к памяти в соответствии с данными мониторинга, разумная настройка различных автоматических выключателей и минимизация риска переполнения памяти.
6. Как Elasticsearch реализует агрегацию больших объемов данных (сотни миллионов)?
Первая приблизительная агрегация, предоставляемая Elasticsearch, — это метрика кардинальности. Он обеспечивает кардинальность поля, то есть количество различных или уникальных значений для этого поля. Он основан на алгоритме HLL. HLL сначала хеширует наши входные данные, а затем делает оценку вероятности на основе битов в результате хэш-операции, чтобы получить количество элементов. Его характеристики: настраиваемая точность для управления использованием памяти (больше точности = больше памяти); точность небольшого набора данных очень высока; мы можем установить фиксированное использование памяти, необходимое для дедупликации, с помощью параметров конфигурации. Будь то тысячи или миллиарды уникальных значений, использование памяти имеет отношение только к точности вашей конфигурации.
7. В случае параллелизма, гарантирует ли Elasticsearch согласованность чтения и записи?
(1) можно использовать оптимистичный контроль параллелизма через номер версии, чтобы гарантировать, что новая версия не будет перезаписана старой версией, а прикладной уровень будет обрабатывать определенные конфликты;
(2) Кроме того, для операций записи уровень согласованности поддерживает кворум/один/все, и по умолчанию используется кворум, то есть операции записи разрешены только тогда, когда доступно большинство сегментов. Но даже если большинство из них доступны, может произойти сбой записи в реплику из-за сети и т. д., так что реплика будет считаться отключенной, а осколок будет перестроен на другом узле.
(3) Для операций чтения вы можете установить репликацию на синхронизацию (по умолчанию), которая возвращает операцию после завершения как основного, так и реплика-шардов; если репликация настроена на асинхронную, вы также можете установить параметр запроса поиска _preference Query the основной осколок для основного, убедившись, что документ является последней версией.
8. Как контролировать состояние кластера Elasticsearch?
Marvel упрощает мониторинг Elasticsearch через Kibana. Вы можете просматривать состояние и производительность своего кластера в режиме реального времени, а также анализировать прошлые показатели кластера, индекса и узла.
9. Представьте общую техническую структуру вашего поиска в электронной коммерции.
10, расскажите нам о вашей персонализированной программе поиска?
Персонализированный поиск на основе word2vec и Elasticsearch
(1) На основе плагинов word2vec, Elasticsearch и пользовательских скриптов мы внедрили службу персонализированного поиска.По сравнению с исходной реализацией, новая версия значительно улучшила рейтинг кликов и коэффициент конверсии;
(2) Еще одна полезная функция вектора продуктов на основе word2vec заключается в том, что его можно использовать для рекомендации похожих продуктов;
(3) Использование word2vec для персонализированного поиска или персонализированных рекомендаций имеет определенные ограничения, поскольку он может обрабатывать только данные временных рядов, такие как история кликов пользователей, и не может всесторонне учитывать предпочтения пользователей. Это все еще большое улучшение. ;
11. Знаете ли вы дерево словарей?
Общие структуры данных словаря следующие:
Основная идея Trie заключается в обмене пространства на время и использовании общего префикса строк для уменьшения накладных расходов на время запроса для достижения цели повышения эффективности. Он имеет 3 основных свойства:
1) Корневой узел не содержит символов, и каждый узел, кроме корневого, содержит только один символ.
2) От корневого узла к определенному узлу соединяются проходящие по пути символы, представляющие собой строку, соответствующую узлу.
3) Все дочерние узлы каждого узла содержат разные символы.
(1) Видно, что количество узлов в каждом слое треугольного дерева равно 26^i уровня. Таким образом, чтобы сэкономить место, мы также можем использовать динамический связанный список или использовать массив для имитации динамики. Стоимость места не будет превышать количество слов × длину слова.
(2) Реализация: открыть массив размером с алфавит для каждого узла, повесить связанный список для каждого узла и использовать нотацию левого сына и правого брата для записи дерева;
(3) Для китайского словарного дерева дочерние узлы каждого узла хранятся в хеш-таблице, поэтому нет необходимости тратить слишком много места, а сложность хеширования O (1) может быть сохранена с точки зрения скорости запроса. .
12. Как осуществляется орфографическая коррекция?
(1) достигается орфографическая коррекция на основе расстояния редактирования, расстояние редактирования является стандартным методом, который используется для указания с помощью операций вставки, удаления и замены из одной строки в другую строку минимального количества шагов операции;
(2) Процесс расчета расстояния редактирования: например, чтобы рассчитать расстояние редактирования батю и красоты, сначала создайте таблицу 7 × 8 (длина батю — 5, длина кофе — 6, плюс 2 для каждого), затем заполните в следующих позициях черные номера. Другие решетки рассчитываются путем взятия минимума из следующих трех значений:
Если самый верхний символ равен самому левому символу, то левое верхнее число. В противном случае это левое верхнее число + 1. (0 для 3,3)
Левая цифра +1 (2 на 3,3 квадрата)
Число выше +1 (2 на 3,3 квадрата)
Наконец, значение в правом нижнем углу — это значение расстояния редактирования 3.
Для исправления орфографических ошибок мы рассматриваем построение метрического пространства, и любое отношение в этом пространстве удовлетворяет следующим трем основным условиям:
d(x,y) = 0 -- если расстояние между x и y равно 0, то x=y
d(x,y) = d(y,x) -- расстояние от x до y равно расстоянию от y до x
d(x,y) + d(y,z) >= d(x,z) -- тригонометрическое неравенство
(1) Согласно неравенству треугольника, другой символ, который удовлетворяет расстоянию от запроса в диапазоне n, превращается в B, а расстояние от A равно не более d+n и не менее d-n.
(2) Процесс построения дерева BK выглядит следующим образом: каждый узел имеет любое количество дочерних узлов, и каждое ребро имеет значение, представляющее расстояние редактирования. Пометка n на ребрах всех дочерних узлов до родительского узла означает, что расстояние редактирования равно n. Например, у нас есть дерево, родительским узлом которого является «книга» и двумя дочерними узлами «торт» и «книги», ребро от «книги» до «книг» помечено 1, а ребро от «книги» до «торта». имеет маркировку 4. После построения дерева из словаря всякий раз, когда вы хотите вставить новое слово, вычислите расстояние редактирования слова от корневого узла и найдите ребро со значением d (neweord, root). Рекурсивно сравнивая каждый дочерний узел, пока не останется дочерних, вы можете создать новые дочерние узлы и сохранить там новое слово. Например, чтобы вставить «бу» в дерево приведенного выше примера, мы сначала проверяем корневой узел, находим ребро, где d («книга», «бу») = 1, а затем проверяем дочерние узлы ребра, помеченные 1, чтобы получить слово «книги». Затем мы вычисляем расстояние d("books", "boo")=2, затем вставляем новое слово после "books", и метка ребра равна 2.
3. Запросите похожие слова следующим образом: вычислите расстояние редактирования d между словом и корневым узлом, а затем рекурсивно найдите ребра от каждого дочернего узла, помеченного от d-n до d+n (включительно). Если расстояние d между проверяемым узлом и искомым словом меньше n, возвращаем узел и продолжаем запрос. Например, если вы вводите мыс и максимально допустимое расстояние равно 1, сначала вычислите расстояние редактирования d("книга", "плащ")=4 от корня, а затем найдите расстояние редактирования от корневого узла от 3 до 5. , это найдет После узла пирога вычислите d("cake", "cape") = 1. Если условия выполнены, вернитесь к пирогу, а затем найдите расстояние редактирования от узла пирога, равное от 0 до 2, и найти узлы накидки и тележки соответственно, чтобы получить накидку Результат, удовлетворяющий условию.
Наконец
Приглашаю всех обратить внимание на мой официальный аккаунт [Программист в погоне за ветром].В 2019 году многие компании собрали более 1000 400-страничных pdf-документов для вопросов на собеседовании по java.
Если вам понравилась статья, не забудьте подписаться на меня и поставить лайк, спасибо за вашу поддержку!