Site icon AppTractor

Создать поиск: руководство по разработке

Как создать поиск? Полное руководство по теории и практике создания как небольшого поисковика в своем сервисе, так и системы для обработки данных целой компании.

Если вы спросите разработчика “Как мне создать поиск?” или “Как вы встроите функцию поиска в свой продукт?”, вы услышите что-то вроде: “О, мы просто запустим кластер ElasticSearch. Поисковики сейчас совсем не сложные”.

Но так ли это? Многочисленные существующие продукты по-прежнему сталкиваются с проблемами в поиске. Любой человек, разбирающийся в поисковиках, скажет вам, что немногие разработчики действительно понимают, как работают поисковые движки, а это знание нужно для улучшения качества поиска. Хотя существуют многочисленные пакеты с открытым исходным кодом, а тема широко изучена, лишь некоторые разработчики знают, как создать поиск с качественным опытом.

Зачем это читать?

Эта статья — коллекция инсайтов и ресурсов, которые помогут вам создать функцию поиска. Я расскажу о самых популярных подходах, алгоритмах, методах и инструментах, основываясь на своем опыте работы над поисковиками разного размера в Google, Airbnb и ещё нескольких стартапах. Непонимание сложности проблем поиска может привести к плохому пользовательскому опыту, напрасной трате сил и провалу продукта.

Создать поиск: немного философии

Большая часть из того, что мы обсудим, покрывает четыре основных принципа.

Поиск — это сложная проблема

Запросы могут быть самыми разными, а проблемы поисковиков сильно зависят от потребностей продукта. Например, Facebook ищет графы людей, YouTube — отдельные видео, и эти проблемы сильно отличаются от планирования авиапутешествия с Kayak.

Качество, метрики и процессы имеют большое значение

Не существует универсального решения или магической формулы ранжирования, которые бы лежали в основе хорошего подхода. Процессы — это всегда развивающиеся коллекции методов, которые улучшают пользовательский опыт постепенно. Другими словами, поиск — это не просто создание функции для ранжирования в пределах определенного домена. Поисковые системы представляют собой структуру развивающихся со временем компонентов, постепенно ведущих к улучшению всего процесса. В частности, ключ к успеху лежит в создании процессов для оценки и настройки поиска в циклах создания и развития продукта. Архитектура поисковой системы должна строиться на основе процессов и метрик, а не просто технологий.

Сначала используйте существующие технологии

Как и во многих инженерных проблемах, не стоит изобретать колесо. При возможности используйте существующие сервисы или инструменты с открытым исходным кодом. Если существующая SaaS (например, Algolia или ElasticSearch) подходит под ваши ограничения и вы можете себе это позволить, используйте её. Это решение, вероятнее всего, будет вашим лучшим первоначальным выбором для продукта, даже если потом вам нужно будет заменить его.

При использовании готового решения знайте детали

Даже если вы используете готовое общедоступное или коммерческое решение, вы должны иметь представление о сложности проблем поиска и возможных проблемах.

Теория: проблема поиска

Поиск отличается для разных продуктов, и выбор зависит от многих технических деталей. Для начала вам нужно выделить ключевые параметры вашей проблемы:

  1. Размер: насколько большой у вас свод документов? Это тысячи или миллиарды документов?
  2. Медиа: вы ищете текст, изображения, графические взаимоотношения или пространственные данные?
  3. Контроль над сводом и качеством: источники документов находятся под вашим контролем или принадлежат сторонним лицам? Готовы ли документы к индексированию или их нужно привести в порядок?
  4. Скорость индексирования: нужна ли вам индексация в реальном времени или подойдет пакетная?
  5. Язык запросов: запросы структурированы или вам нужна поддержка неструктурированных запросов?
  6. Структура запросов: что входит в запрос? Текст, изображения, звук, лица людей или адреса?
  7. Зависимость от контекста: зависят ли результаты от личности пользователя, их истории взаимодействия с продуктом, локации, времени суток и т.д.?
  8. Предложение поддержки: вам нужна поддержка неполных запросов?
  9. Время ожидания: какие требования у вас есть ко времени ожидания? Это 100 миллисекунд или 100 секунд?
  10. Контроль над доступом: являются ли данные полностью публичными или пользователи должны видеть только ограниченный набор документов?
  11. Соответствие: существуют ли организационные ограничения?
  12. Интернационализация: нужна ли вам поддержка документов с разными кодировками или символов Unicode? (Подсказка: всегда используйте UTF-8, если только вы не уверены в своих действиях на 100%). Нужна ли вам поддержка мультиязычного корпуса документов? Мультиязычных запросов?

Этот список поможет вам сделать ряд основных решений для создания индивидуальных компонентов.

Теория: процесс поиска

Теперь давайте рассмотрим список менее масштабных проблем. Они обычно решаются отдельными подсистемами в пайплайне поисковика. Это значит, что данная подсистема получает выходные данные предыдущих подсистем и создает входную информацию для следующих. Это приводит к важному свойству экосистемы: как только вы изменяете работу вышестоящей подсистемы, вы должны оценить эффект изменения в последующих компонентах.

Вам нужно решить следующие проблемы:

Подборка для индекса

Из набора документов (всех твитов, фотографий в Instagram или из всех материалов в интернете) нужно выбрать меньший набор документов, которые подойдут для рассмотрения в качестве результатов поиска и будут включены в индекс. Это делается для того, чтобы сохранить ваш индекс компактным. Например, вы можете исключить следующие классы документов:

Структура индекса

Для многих поисковых систем возврат документов осуществляется при помощи инвертированного индекса или просто индекса, как его часто называют. Индекс — это отображение поискового запроса в документах. Это может быть слово, изображение или другая функция документа, которая позволяет найти соотношение запрос-документ.

Анализ запроса и возврат документа

Многие популярные поисковые системы поддерживают неструктурированные запросы. Это значит, что система должна самостоятельно извлекать структуру из запроса. В случае инвертированного индекса вам нужно извлекать ключевые слова при помощи методов NLP.

Извлеченные слова можно использовать для возврата релевантных документов. К сожалению, многие запросы не очень хорошо сформулированы, поэтому нужно приложить дополнительные усилия:

Ранжирование

На основе списка документов, данных и обработанного запроса создайте оптимальный порядок (рейтинг) для этих документов. Изначально многие модели ранжирования были вручную отобранными комбинациями всех сигналов документа. Наборы сигналов могли включать PageRank, данные о кликах, информацию о темах и др. Многие из этих сигналов, например, PageRank, содержали параметры, которые влияли на производительность сигнала, и эти параметры должны быть также настроены вручную. Затем, по мере развития машинного обучения, основанные на сигнале дифференциальные контролируемые модели стали все популярнее. Некоторые популярные примеры: McRank и LambdaRank от Microsoft и MatrixNet от Яндекс.

В последнее время набирает популярность подход, основанный на векторном пространстве для семантического возврата и ранжирование. Идея состоит в том, чтобы изучить отдельные низкоуровневые векторные представления документа, а затем построить модель, которая представляет запросы в одном и том же векторном пространстве. Тогда возврат — это просто нахождение нескольких документов, ближайших по определенному показателю к вектору запроса. Ранжирование определяется расстоянием. Если схемы документов и запросов созданы хорошо, документы выбираются не по наличию какой-то модели (например, слова), а близостью к запросу по смыслу.

Пайплайн индексирования

Все описанные части пайплайна должны проверяться регулярно, чтобы поддерживать индекс поиска. Управление процессом поиска может быть сложным и включать множество частей. Не только данные движутся по пайплайну, но и код для каждого модуля, и основанные на данных предположения будут изменяться со временем. Процесс может осуществляться партиями данных, в реальном времени или по случаю, потоком или на базе определенных триггеров. В сложных поисковых движках (как Google) одновременно происходят процессы на нескольких слоях, например, часто обновляемая страница индексируется с большей частотой, нежели статичная страница, которую не меняли уже несколько лет.

Выдача результатов

В конечном счете, цель каждой поисковой системы — принимать запросы и использовать индекс, чтобы возвращать ранжированные результаты. Эта тема сложна и в ней много технических деталей, поэтому упомянем несколько ключевых аспектов.

Качество, оценка и улучшение

Итак, вы запустили процесс индексирования и поисковые серверы, все идет хорошо. К сожалению, создать поиск и сделать его опыт качественным очень сложно, и проблемы только начинаются с работающей инфраструктуры.

Вам нужно будет создать набор процессов для постоянной оценки и улучшения качества поиска. В этом заключается большая часть работы и самая сложная проблема.

Что такое качество? Вам нужно определить, что это в вашем случае:

Метрики

Некоторые из этих концепций сложно оценить количественно. С другой стороны, полезно будет выразить производительность поисковика в одной качественной метрике. Постоянно вычисляя этот показатель для вашей системы, вы можете отследить свой прогресс и отчитаться перед начальством. Вот несколько традиционных способов измерить качество, которые помогут вам создать свою волшебную формулу оценки:

Человеческая оценка

Качественные метрики могут показаться статистическими измерениями, но не все их можно вычислить. Показатели должны представлять субъективную оценку людей. Пренебрежение этим этапом, вероятно, является самой распространенной причиной плохого поискового опыта.

На ранних стадиях разработчики сами могут оценить результаты вручную. Затем вовлечь в процесс можно других людей. Оценщики используют особые инструменты, чтобы смотреть на результаты поиска и давать обратную связь о качестве результатов. Эти оценки вы можете использовать для управления разработкой, принятия решений или применять для селекции индекса и систем ранжирования.

Вот список некоторых типов человеческой оценки, которые можно применить к поисковой системе:

Оценка наборов данных:

Задумываться о наборах данных для оценки нужно как можно раньше. Как вы будете их собирать и обновлять? Как вы внедрите их в оценку системы? Существуют ли в них встроенные предрассудки?

Эксперименты вживую

После того, как ваш поисковый движок набирает достаточно пользователей, вы можете начать проводить эксперименты на части вашего трафика. Базовая идея — включить некую оптимизацию для группы людей и сравнить результат с контрольной группой. Метрики могут быть разными: клики на результаты, рекламы и т.д.

Время цикла оценки

Скорость совершенствования качества поиска зависит от того, насколько быстро вы завершаете цикл измерения и улучшения. Этот вопрос стоит задать себе заранее. Потребуются вам дни, часы, минуты или секунды, чтобы увидеть изменения? Проведение оценки должно быть простым для инженеров и не занимать много времени.

Создать поиск: практика

  1. Как я говорил выше, если вы можете себе это позволить — купите существующую SaaS (некоторые хорошие указаны в списке ниже). Сервис подходит вам, если:
  1. Если готовое решение не подходит под ваши ресурсы, вы можете использовать открытые библиотеки или инструменты. В случае приложений или сайтов я бы посоветовал ElasticSearch. Для встроенных опытов существует множество других инструментов, описанных ниже.
  2. Вы, вероятно, захотите сделать селекцию индекса и почистить свои документы (выделить релевантный текст из HTML-страниц) перед загрузкой в свой поисковик. Это снизит размер индекса. Если ваш корпус документов находится в одном хранилище, просто напишите для этого скрипт. Если нет, используйте Spark.

SaaS

Algolia — SaaS, которая индексирует сайт клиента и предоставляет API для поиска по страницам сайта. У них также есть API для загрузки ваших документов и поддержки зависимых от контекста запросов.

Различные поставщики ElasticSearch: AWS (ElasticSearch Cloud), elastic.co и Qbox.

Azure Search — SaaS-решение от Microsoft. Доступное через REST API, оно может масштабироваться до миллиардов документов. Имеет интерфейс запросов Lucene, чтобы упростить миграцию с решений, основанных на Lucene.

Swiftype  — корпоративное SaaS, которое индексирует внутренние сервисы вашей компании, например, Salesforce, G Suite, Dropbox.

Инструменты и библиотеки

Наборы данных

Эти наборы позволят оценить качество запросов.

Exit mobile version