Сделал простой текстовый поиск.
![](/_next/./static/assets/text-search-d72fe2c143fbf8e1..png)
Прежде, чем приступить, посмотрел как реализован поиск в Obsidian и VSCode. Что в одном, что в другом случае в основе лежит простой регекс по содержимому файлов. А результаты поиска, например в Obsidian, ссылаются на смещение текста в файле.
Еще на этапе проектирования я ориентировался на блочную структуру документов, поэтому единицей индексирования сделал блок.
Каждый блок индексируется и отображается в результатах поиска. У каждого блока имеется свой идентификатор, что необходимо при связывании блоков между собой и позиционировании документа в случае переходов по ссылкам.
При реализации поиска немного отошел от ТЗ: перенес сайдбар результатов поиска в левую часть экрана. В правой части отображается карточка заметки.
Еще одной функциональной деталью в ТЗ было поведение графа при поиске.
Вот как это получилось сделать: при наведении мышкой на результат поиска - граф связей позиционируется на узле содержащим найденный текст. В видимую область включаются связи первого уровня.
При клике мышкой на результате поиска открывается заметка.