TL;DR: В этом блоге мы демонстрируем, как мы создали приложение для поиска, очень похожее на то, которое использует GitHub для поиска проблем, используя Manticore Search.
- Попробуйте демо:
- Обход вашего репозитория - https://github.manticoresearch.com/ . Вам придется подождать.
- Поиск в обходном репозитории - https://github.manticoresearch.com/manticoresoftware/manticoresearch .
- Проект на GitHub - https://github.com/manticoresoftware/manticore-github-issue-search .
- Настройте его для себя , чтобы просматривать свои проблемы, запросы на извлечение и комментарии на GitHub новыми способами.
Введение
В нашем стремлении эффективно подчеркнуть возможности и производительность Manticore Search, мы осознали важность выбора реального приложения, которое могло бы служить убедительной витриной. Мы рассматривали несколько вариантов — распространенные выборы, такие как:
- интернет-магазины
- каталоги
- базы данных фильмов и т.д.
Хотя эти примеры знакомы и легко понимаемы, а Manticore идеально подходит для них, они не предоставили практической ценности.
Тогда нас осенило: почему бы не создать инструмент поиска для проблем GitHub? Это не только дало бы нам возможность предложить мощную демонстрацию, но также представило возможность улучшить опыт поиска с помощью передовых функций Manticore Search, что должно быть полезно хотя бы для нас, команды разработчиков Manticore.
Мы приняли этот вызов и гордимся тем, что представляем наше творение — специализированный поисковый движок, настроенный для поиска проблем GitHub. Это не просто демонстрация; это практический инструмент, который, как мы надеемся, будет полезен сообществу GitHub.
Мы приглашаем вас исследовать и взаимодействовать с нашим поиском проблем GitHub на https://github.manticoresearch.com . Откройте для себя весь потенциал Manticore Search через этот практический опыт. Наслаждайтесь преимуществами наших расширенных возможностей поиска и посмотрите сами, как Manticore Search может преобразить исследование данных.
Мы достигли скоростей поиска до 30 раз быстрее в некоторых случаях, чем GitHub. Интересно, как это работает и как мы это сделали? Давайте углубимся в то, как мы это построили.
Поиск на Github - 215 мс | Поиск на GitHub через Manticore - 6 мс |
---|---|
![]() | ![]() |
Предварительные требования
Концепция была простой — наша цель заключалась в том, чтобы получить данные из выбранных репозиториев на GitHub в базу данных поиска Manticore. С полнотекстовым индексированием данных мы могли бы обеспечить эффективные возможности поиска.
Нашим решением было сохранить дизайн, который был бы схож с GitHub, но с тонкими улучшениями в интерфейсе пользователя, чтобы учесть не только технически подкованных пользователей, но и тех, кто менее разбирается в технологиях.
Более того, мы стремились внедрить дополнительные функции, такие как:
- комбинированный поиск по проблемам и комментариям
- расширенные варианты фильтрации
- возможность сортировки результатов на основе реакций
- бесконечная прокрутка страниц
Давайте углубимся в детали, рассмотрим имеющиесяChallenges и исследуем, как Manticore может решить их через практический пример.
Выбор правильного инструмента для MVP
Разработка демо может быть довольно сложной задачей, но когда вы соревнуетесь со временем, вам нужна любая помощь, которая у вас есть. Именно поэтому мы обратились к проверенной комбинации PHP для бэкенда и JavaScript для клиентской стороны — с добавлением SEO-дружественной гибридной магии. Почему PHP, вы спрашиваете? Что ж, это как пристегнуть реактивный ранец к спине вашего проекта! Это быстро начать, просто проверять и легко тестировать. И, конечно, потому что наша команда имеет больший опыт в PHP, чем в других красивых и современных языках программирования. (Кстати, узнайте о том , как вы можете создать PHP плагин для Manticore Search, написанный на C++.)
Manticore Search также поставляется с PHP клиентом , который мы используем в демо. Использовать его так же просто, как показано ниже:
<?php
use Manticoresearch\\Client;
$client = new Client(['host' => 'localhost', 'port' => 9308]);
$index = $client->index('repo');
$docs = $index->search('bug')->get();
foreach ($docs as $doc) {
var_dump($doc->getId(), $doc->getData());
}
Вот так вы создаете Manticore Client, выбираете таблицу, с которой хотите общаться, отправляете запрос на поиск, и—вуаля! — результаты начинают поступать.
Мы не будем углубляться в детали Manticore Search Client для PHP здесь, но если вам не терпится попробовать, загляните в их репозиторий по адресу Manticore Search PHP Client .
Демо состоит из различных компонентов, так как оно:
- Получает данные из GitHub,
- Поддерживает очередь репозиториев для обработки
- Может отправлять уведомления по электронной почте
- и т.д. и т.д. и т.д.
Для вашего удобства весь код, взаимодействующий с Manticore Search, находится в Manticore.php . Это также может быть полезно для тех, кто рассматривает возможность сравнения различных движков хранения в будущем.
Интересные проблемы, с которыми нам пришлось столкнуться
Работая над демо, помимо реализации тривиальных вещей, упомянутых выше, мы столкнулись с несколькими интересными проблемами, которые вы также можете встретить в своих проектах.
Релевантность в результатах поиска при объединении двух таблиц
Критический аспект любой поисковой системы — релевантность ее результатов. При реализации демонстрации проблем GitHub с Manticore Search в качестве бэкенда стоит отметить, что релевантность эффективно управляется сразу из коробки. Manticore Search использует классические методы ранжирования на основе BM25, которые упорядочивают результаты поиска на основе частоты и важности ключевых слов в документах и запросах, а также нормализации длины полей (длины текстового поля, где найден соответствующий термин). Это означает, что нет необходимости в сложных конфигурациях или сложных алгоритмах для начала работы с высокоэффективным поиском. Дополнительные сведения вы можете найти в документации – Обзор ранжирования .
Задача, с которой мы столкнулись, заключалась в выполнении комбинированного поиска в проблемах и комментариях GitHub. Технически мы разделили это на два отдельных таблицы на уровне Manticore: одну для проблем и другую для комментариев. После изучения механизмов ранжирования мы решили реализовать алгоритм Rank-Biased Precision (RBP), который позволяет нам объединять результаты из двух различных источников. Кроме того, Manticore Search предоставляет поле ‘score’, которое можно получить с помощью метода $doc->getScore()
из PHP-клиента. Вы можете просмотреть код здесь:
Manticore.php Код
.
В результате мы не только достигаем релевантности «из коробки», но и используем RBP для объединения двух источников, максимизируя эффективность результатов поиска!
Расширенная фильтрация проблем и комментариев
Шаг 1: Построение диапазонов
В области поисковой функциональности простого базового поиска часто бывает недостаточно. Пользователи часто нуждаются в применении фильтров для уточнения результатов. Реализация простых фильтров, таких как основанные на диапазоне или равенстве, проста в Manticore Search и многих других поисковых системах. Однако когда дело доходит до группировки результатов в определенных диапазонах, задача может казаться сложной — но на самом деле с Manticore Search она вполне выполнима.
Наша цель — дать пользователям возможность выбирать предопределенные диапазоны и применять фильтры соответственно, избегая необходимости хранения или кэширования дополнительных данных. Например, мы хотим фильтровать проблемы по количеству комментариев: ≤ 5, между 5 и 10, и ≥ 10. Manticore Search упрощает этот процесс с помощью функции INTERVAL . Посмотрим, как это реализовано в демо.
Мы разработали специальный метод, который генерирует желаемые диапазоны вместе с количеством элементов в каждом диапазоне. Вот псевдокод, чтобы понять, насколько это просто:
$client = static::client();
$index = $client->index('issue');
$search = $index->search('');
$range = implode(',', $values);
$facets = $search
->limit(0)
->filter('repo_id', $repoId)
->expression('range', "INTERVAL(comments, $range)")
->facet('range', 'counters', sizeof($values) + 1)
->get()
->getFacets();
Вы можете просмотреть полный код по следующему URL:
Шаг 2: Применение фильтров
Следующий шаг — фильтрация результатов. Это достигается с помощью фильтра gt
(больше чем) в сочетании с условием or
. Ниже приведено упрощенное представление кода:
$search->filter('comments', 'gt', 0, Search::FILTER_AND);
$search->filter('comments', 'lte', 3, Search::FILTER_OR);
Вы можете просмотреть наш фрагмент кода по этой ссылке:
Сортировка по реакциям
При поиске на GitHub вы могли заметить, что он не отображает и не позволяет фильтровать по реакциям. Однако бывают моменты, когда определение наиболее обсуждаемых проблем может быть особенно полезным — например, чтобы оценить наиболее желаемые функции или предугадать предстоящие проблемы. Вот где сортировка по реакциям становится бесценной.
Для начала нам нужно захватить данные о реакциях. API GitHub удобно предоставляет это в виде простого JSON-объекта:
{
"url": "https://api.github.com/repos/ClickHouse/ClickHouse/issues/35407/reactions",
"total_count": 0,
"+1": 0,
"-1": 0,
"laugh": 0,
"hooray": 0,
"confused": 0,
"heart": 0,
"rocket": 0,
"eyes": 0
}
Это отличные новости, потому что Manticore Search предлагает встроенную поддержку JSON !
Далее нам нужно учесть наше требование к сортировке. Нужно ли нам сортировать по отдельным полям JSON или по сумме нескольких полей? К счастью, Manticore Search позволяет делать и то, и другое. Это идеально соответствует нашим потребностям! Мы можем напрямую сохранить JSON в таблице и использовать следующий фрагмент кода для включения сортировки:
$search->expression(
'positive_reactions',
'integer(reactions.`+1`) + integer(reactions.hooray) + integer(reactions.heart) + integer(reactions.rocket)'
);
Для полного представления о реализации сортировки обратитесь к полному фрагменту кода здесь: Пример сортировки Manticore PHP Client
Как продемонстрировано, мы используем функцию expression
клиента Manticore PHP для доступа к полям JSON с использованием нотации .
. Этот подход устраняет необходимость кэширования счетчиков или выполнения дополнительных вычислений. Вы можете создать поле JSON, получить к нему доступ с помощью выражений, поддерживать высокую скорость и избежать накладных расходов кэширующих механизмов!
Фасетный поиск
Возможности поиска и фильтрации являются необходимыми компонентами любого надежного функционала поиска. Однако общая проблема возникает при работе с быстротой получения счетчиков. Широко признано, что для достижения быстрой работы с подсчетами в MySQL необходимо использовать индексы. Эти индексы не только увеличивают размер базы данных, но также добавляют сложность к сильно загруженным приложениям, которые часто прибегают к кэшированию и затем корректируют эти счетчики по мере необходимости.
Хорошая новость заключается в том, что Manticore Search полностью избегает этих проблем! С Manticore Search извлечение счетчиков из базы данных является как простым, так и быстрым, что исключает необходимость в дополнительных кэшированных слоях.
Чтобы отображать текущие счётчики, которые отражают примененные фильтры на странице, мы используем те же фильтры, что и для поиска. Однако мы вводим дополнительный запрос для фасетов, который занимает всего несколько миллисекунд. Этот подход позволяет нам получить текущие счета для указанных групп с практически нулевыми накладными расходами. Ниже приведён лаконичный фрагмент кода PHP, демонстрирующий, как это сделать:
$facets = $search
->limit(0) // Нам интересны только счетчики, следовательно, результаты не нужны
->filter('repo_id', $repoId) // Фильтр по ID репозитория
->expression('open', 'if(closed_at=0,1,0)') // Оценка того, открыты ли вопросы
->facet('open', 'counters', 2) // Получить фасетные счетчики для открытых и закрытых вопросов
->get() // Выполнить поисковый запрос и получить результаты
->getFacets(); // Извлеките данные фасетов из результатов
Давайте разобьём это: мы устанавливаем предел равным нулю, потому что наша цель — получить счетчики, а не результаты поиска. Мы фильтруем по ID репозитория и применяем выражение для группировки по полю closed_at
. Эта группировка предоставляет нам счетчики как для открытых, так и для закрытых вопросов.
Для тех, кто заинтересован в полной реализации, полный фрагмент кода доступен на GitHub: Manticore GitHub Issue Search - Manticore.php
С Manticore Search проблема эффективного получения счетчиков решается почти «из коробки». Что может быть более эффективным и удобным? 😊
Заключение и дальнейшие планы
В процессе разработки нашего демонстрационного проекта мы стремились продемонстрировать возможности и эффективность Manticore Search. Результат не только оправдал наши ожидания, но также предоставил нам инструмент, который улучшает способ навигации по нашим репозиториям на Github. В рамках этой инициативы мы смогли продемонстрировать потенциал Manticore Search и интегрировали ряд улучшений и функций, которые улучшают текущие предложения на GitHub:
- Мы достигли заметно более быстрых скоростей поиска, при этом поиски обычно завершаются за 5-10 мс по сравнению с временем поиска GitHub, превышающим 200 мс.
- Наш демонстрационный проект позволяет включать комментарии в результаты поиска, предоставляя более широкий объем информации, чем то, что в настоящее время доступно на GitHub.
- Мы представили возможность для пользователей сортировать вопросы по количеству реакций, предлагая дополнительное измерение взаимодействия с пользователем.
- Доступны расширенные параметры фильтрации, позволяющие выполнять более точные поиски, такие как отображение вопросов в пределах определенного диапазона комментариев или сосредоточение поисков исключительно на комментариях.
Мы рекомендуем вам исследовать эти улучшения, посетив: https://github.manticoresearch.com
Кроме того, для тех, кто интересуется исходным кодом с открытым исходным кодом или тем, как запустить проект локально, он доступен здесь: https://github.com/manticoresoftware/manticore-github-issue-search
Мы также рады объявить о планах по внедрению векторного поиска (доступного в Dev-пакетах Manticore, готовящихся к выпуску) в наш демонстрационный проект. Эта предстоящая функция направлена на дальнейшую улучшение качества результатов при сочетании с полнотекстовым поиском, демонстрируя, как использовать новые возможности в Manticore для улучшения функционала поиска, так что оставайтесь с нами и следите за нами в Twitter .
Мы приветствуем ваши отзывы о этой практической демонстрации возможностей и функционала Manticore Search и с нетерпением ждем возможности поделиться с вами новыми обновлениями. Ждем ваших отзывов: issues , discussions .