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, но с тонкими улучшениями в пользовательском интерфейсе, чтобы удовлетворить не только технически подкованных пользователей, но и тех, кто имеет менее технические навыки.
Более того, мы стремились ввести дополнительные функции, такие как:
- комбинированный поиск по проблемам и комментариям
- расширенные параметры фильтрации
- возможность сортировки результатов на основе реакций
- бесконечная прокрутка страниц
Давайте углубимся в детали, рассмотрим стоящие перед нами задачи и исследуем, как 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, выбираете таблицу, с которой хотите пообщаться, отправляете запрос на поиск и — вуаля! — результаты начинают поступать.
Мы не будем углубляться в детали клиента Manticore Search для PHP здесь, но если вам не терпится попробовать, загляните в их репозиторий на Manticore Search PHP Client .
Демо состоит из различных компонентов, так как оно:
- Извлекает данные из GitHub,
- Поддерживает очередь репозиториев для обработки
- Может отправлять уведомления по электронной почте
- и т.д. и т.д. и т.д.
Для вашего удобства весь код, взаимодействующий с Manticore Search, находится в Manticore.php . Это также может быть полезно для тех, кто рассматривает возможность сравнения различных движков хранения в будущем.
Интересные задачи, которые нам пришлось преодолеть
Работая над демо, помимо реализации тривиальных вещей, упомянутых выше, мы столкнулись с несколькими интересными задачами, с которыми вы также можете столкнуться в своих проектах.
Релевантность в результатах поиска при объединении двух таблиц
A critical aspect of any search system is the relevance of its results. Когда вы реализуете демонстрацию проблемы GitHub с Manticore Search в качестве бэкенда, стоит отметить, что релевантность эффективно управляется прямо из коробки. Manticore Search использует классические методы ранжирования на основе BM25, которые упорядочивают результаты поиска на основе частоты и важности ключевых слов в документах и запросах, а также нормализации длины поля (длина текстового поля, в котором находится совпадающий термин). Это означает, что нет необходимости в сложных конфигурациях или сложных алгоритмах, чтобы начать с высокоэффективного поиска. Для получения дополнительной информации вы можете обратиться к документации – Обзор ранжирования .
The challenge we faced involved performing a combined search within Github issues and comments. Технически мы разделили это на две отдельные таблицы на уровне Manticore: одну для проблем и другую для комментариев. После изучения механизмов ранжирования мы решили реализовать алгоритм Rank-Biased Precision (RBP), который позволяет нам объединять результаты из двух различных источников. Кроме того, Manticore Search предоставляет поле 'score', которое можно получить с помощью метода $doc->getScore() из PHP-клиента. Вы можете ознакомиться с кодом здесь:
Manticore.php Код
.
As a result, we not only achieve relevance 'out of the box' but also leverage RBP to combine two sources, maximizing the effectiveness of the search results!
Advanced filtering of issues and comments

Step 1: Rendering the Ranges
In the realm of search functionality, a mere basic search often doesn't suffice. Пользователям часто необходимо использовать фильтры для уточнения своих результатов. Реализация простых фильтров, таких как основанные на диапазоне или равенстве, проста в Manticore Search и многих других поисковых системах. Однако, когда дело доходит до группировки результатов в определенных диапазонах, задача может показаться сложной — но на самом деле это вполне управляемо с Manticore Search.
Our goal is to enable users to select predefined ranges and apply filters accordingly, all while avoiding the need for storing or caching any additional data. Например, мы стремимся фильтровать проблемы по количеству комментариев: ≤ 5, от 5 до 10 и ≥ 10. Manticore Search упрощает этот процесс с помощью своей функции INTERVAL . Давайте посмотрим, как это реализовано в демонстрации.
We devised a special method that generates our desired ranges along with the count of items falling within each range. Вот псевдокод, чтобы понять, как это просто:
$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();
You can review the complete code at the following URL:
Step 2: Applying filters
The next step involves filtering the results. Это достигается с помощью фильтра gt (больше чем) в сочетании с условием or. Ниже представлено упрощенное представление кода:
$search->filter('comments', 'gt', 0, Search::FILTER_AND);
$search->filter('comments', 'lte', 3, Search::FILTER_OR);
You can inspect our code snippet via this link:
Sorting by reactions
When conducting a search on GitHub, you might notice that it doesn't display or allow filtering by reactions. Однако бывают случаи, когда определение наиболее обсуждаемых проблем может быть особенно полезным — например, для оценки наиболее желаемых функций или предвидения предстоящих проблем. Вот где сортировка по реакциям становится неоценимой.
To begin with, we need to capture the reaction data. GitHub API удобно предоставляет это в виде простого 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
}
This is excellent news because Manticore Search offers native JSON support !
Next, we must consider our requirement for sorting. Нам нужно сортировать по отдельным полям JSON или по сумме нескольких полей? К счастью, Manticore Search позволяет делать и то, и другое. Это идеально соответствует нашим потребностям! Мы можем напрямую хранить JSON в таблице и использовать следующий фрагмент кода для включения сортировки:
$search->expression(
'positive_reactions',
'integer(reactions.`+1`) + integer(reactions.hooray) + integer(reactions.heart) + integer(reactions.rocket)'
);
For a comprehensive view of the sorting implementation, refer to the full code snippet here: Manticore PHP Client Sorting Example
As demonstrated, we utilize the expression function of the Manticore PHP client to access JSON fields using the . notation. Этот подход устраняет необходимость в кэшировании счетчиков или выполнении дополнительных расчетов. Вы можете создать поле JSON, получить к нему доступ с помощью выражений, поддерживать высокую скорость и избежать накладных расходов на механизмы кэширования!
Faceted search
Searching and filtering capabilities are essential components of any robust search functionality. Однако общая проблема возникает при обработке скорости получения счетов. Широко признано, что для достижения быстрых операций подсчета в MySQL необходимо использовать индексы. Эти индексы не только увеличивают размер базы данных, но и добавляют сложности к сильно загруженным приложениям, которые часто прибегают к кэшированию и затем корректируют эти счета по мере необходимости.
The good news is that Manticore Search sidesteps these issues entirely! С помощью Manticore Search получение счетов из базы данных является как простым, так и быстрым, устраняя необходимость в дополнительных слоях кэширования.
Чтобы отображать актуальные подсчеты, которые отражают фильтры, примененные на странице, мы используем те же фильтры, что и для поиска. Однако мы вводим дополнительный запрос для фасетов, который занимает всего несколько миллисекунд. Этот подход позволяет нам получать текущие подсчеты для заданных групп с практически нулевыми накладными расходами. Ниже приведен краткий фрагмент кода на PHP, демонстрирующий, как это сделать:
$facets = $search
->limit(0) // We're only interested in counts, hence no results needed
->filter('repo_id', $repoId) // Filter by repository ID
->expression('open', 'if(closed_at=0,1,0)') // Evaluate whether issues are open
->facet('open', 'counters', 2) // Get facet counts for open and closed issues
->get() // Execute the search query and retrieve the results
->getFacets(); // Extract the facets data from the results
Давайте разберем это: мы устанавливаем лимит на ноль, потому что наша цель - получить счетчики, а не результаты поиска. Мы фильтруем по 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
Мы также рады объявить о планах по внедрению векторного поиска (доступного в пакетах разработки Manticore, готовящихся к выпуску) в наш демонстрационный проект. Эта предстоящая функция направлена на дальнейшее улучшение качества результатов в сочетании с полнотекстовым поиском, демонстрируя, как использовать новые возможности в Manticore для улучшения функциональности поиска, так что следите за новостями и подписывайтесь на нас в Twitter .
Мы приветствуем ваши отзывы по этой практической демонстрации функций и возможностей Manticore Search и с нетерпением ждем возможности поделиться с вами новыми обновлениями. Ждем ваших отзывов: issues , discussions .


