#common
Есть желание немножко поразбираться и пописать про поиск и связанные штуки, так что время от времени что-то с этим связаное будет возникать.
Сегодня про задачи и специфику поиска в различных контекстах.
Давайте представим, как может выглядеть простейший поиск. Это примерно просто нахождение подстроки в строке (или во множестве строк). И это вполне себе полезная задача. Например, вы сидите в своей любимой ide и грепаете что-то по файлику. Тут обычно не нужно мутить чего-то чуть более сложного вроде исправления опечаток, семантики запроса и т.д. Нужно просто найти, что просят (может, проигнорировав кейс). Чтобы не делать это втупую, можно заюзать Бойера-Мура или Кнута-Морриса-Пратта. Даже можно какое-нибудь суффиксное дерево по текущему файлику построить, но имхо звучит как оверинжиниринг. И тут это почти наверняка хорошо работает, потому что файлы у вас обычно небольшие (думаю, даже несколько тысяч строк подобным спокойно закрываются). Другой вопрос конечно, как сделать подобное быстро, если вы ищете по целому проекту или по огромной монорепе, но про такой codesearch как-нибудь потом.
Примерно та же задача возникает, если вы хотите искать по логам. Чаще всего вас интересуют какие-то параметры и конкретное вхождение текста. Тут правда уже такими подходами не обойдёшься, потому что объёмы данных огромны (легко порядка единиц-десятков-сотен террабайт). Но всё ещё можно не наворачивать опечаточник, работу с семантикой, ml и прочее.
Это примеры поиска по различным неестественным текстам, что обычному пользователю редко пригождается.
Обычно пользователей интересует поиск по естественным текстам: сайтам с их страничками, статьям, форумам и прочему. Причём поиск тут может вестись разными способами: по коротким фразам целиком, по каким-то длинным фрагментам, по различным ключевым словам (которые надо уметь выделять и оценивать их ценность в запросе), иногда даже по семантике (тут уже надо какой-то ml наворачивать). Учитывая, что хочется, чтобы ваш сайтик искался и индексировался лучше, рядом возникает задача search engine optimization (SEO).
Ну и часто вы хотите искать что-то по какой-то предметной области. Например по товарам в рамках конкретного сайта. Или по твитам. Или по фильмам, если вы какой-нибудь kinogo. В некоторых таких кейсах у вас есть какое-то количество информации об искомых объектах кроме тайтла (например описания). И по-хорошему хочется уметь искать не только по названиям, но и другой информации, но мб учитывая её с меньшим весом.
Тут обычно берут какой-нибудь поисковый движок вроде sphinx, lucene или какой-нибудь другой и кастомят под себя.
Тут получилось просто, абстрактно и общо. Дальше будет чуть больше конкретики.
Post #227
2.04K
- 👍 8
- 🤔 8
- ❤ 4
- 🐳 2
- 🗿 2
- 💔 1