Василий Половнёв |
Под капотом у поиска Sphinx, Thinking Sphinx и PostgreSQL. Книга — ХТМЛ-документ. Чтобы поиск знал, какой текст на каком развороте, мы парсим книгу, разбираем её по разворотам и сохраняем в PostgreSQL для последующей индексации. Во время парсинга вытаскиваем и очищаем текст разворота:
Когда текст готов, Sphinx разбивает его на слова. Чтобы поиск учитывал словоформы и находил по запросу «книга» и «книгу», и «книги», Sphinx «нормализует» слова перед тем, как положить их в индекс. За это отвечают морфологические алгоритмы. Как правило, используют лемматизаторы или стеммеры. Лемматизатор строит нормальную форму слова по словарю. Если не находит, додумывает форму по аналогии. Стеммер извлекает неизменяемую часть слова по правилам удаления суффиксов и окончаний:
Книжный поиск использует лемматизатор ( Когда читатель ищет в книге «прямоугольники», запрос уходит к бэкенду. Бэкенд обращается к Sphinx за выдержками результатов поиска (buildExcerpts) и возможными словоформами. Sphinx нормализует запрос: ищет совпадения с «прямоугольник» и «прямоугольники». Чтобы в выдаче были предложения целиком, а не Результат поиска в JSON:
Чтобы поиском было удобно пользоваться, поиск запоминает положение прокрутки и поисковый запрос. Поискал «прямоугольник», перешёл, увидел не то, открыл поиск и перешёл к следующему результату. А если результаты поиска не попадают в первый экран, разворот прокручивается к первому подсвеченному слову. По полнотекстовому поиску советую почитать и посмотреть:
Чтобы знать, что могут другие движки полнотекстового поиска, и выбирать лучший инструмент для задачи, советую почитать и посмотреть: Про превьюшки разворотов в результатах поиска — в следующем совете. |