Построение индекса для поисковой машины / Хабр
Полное содержание и список моих статей по поисковой машине будет обновлятся здесь.
В предыдущих статьях я рассказывал про работу поисковой машины, вот и дошел до сложного технически момента. Напомню что разделяют 2 типа индексов – прямой и обратный. Прямой – сопоставление документу списка слов в нем встреченного. Обратный – слову сопоставляется список документов, в которых оно есть. Логично, что для быстрого поиска лучше всего подходит обратный индекс. Интересный вопрос и про то, в каком порядке в списке хранить документы.
На предыдущем шаге DataFlow от модуля-индексатора мы получили кусочек данных в виде прямого индекса, ссылочной информации и информации о страницах. Обычно у меня он составляет около 200-300mb и содержит примерно 100 тысяч страниц. Со временем я отказался от стратегии хранения цельного прямого индекса, и храню только все эти кусочки + полный обратный индекс в нескольких версиях, чтобы можно было откатиться назад.
Устройство обратного индекса с виду, простое, – храним файл, в нем в начале таблица адресов начала данных по каждому слову, потом собственно данные. Это я утрировано. Так получается самый выгодный для оптимизации скорости поиска формат — не надо прыгать по страницам — как писали Брин и Пейдж, — 1 seek, 1 read. На каждой итерации перестроения, я использую 20-50 кусочков информации описанных выше, очевидно загрузить всю инфу из них в память я не могу, тем более что там полезно хранить еще кучу служебных данных об индексе.
Чтобы решить и эту, и много других проблем связанных с ограничениями ФС, диска, параллельным доступом к нескольким спискам страниц, я разбил весь индекс на 256 частей. В часть I попадают списки страниц для слов WORD_ID%256=I
Таким образом делим индекс на примерно равные части. Кроме того вся обработка на очередной итерации перестроения индекса связана только в рамках одной части. Т.е. из 20-50 кусков БД по 200-300 Mb необходимо загрузить только те данные, которые связаны со словами, попадающими в обрабатываемую часть.
Итого: делаем 256 повторений одной и той же процедуры:
- читаем нужные данные из входных кусков БД, предварительно загрузив всю информацию о словах, страницах и Url страниц. В памяти сортируем, делаем списки правильной структуры. Упаковываем инфу о странице и добавляем ее ID, HASH и другие данные.
- открываем баррель (я обозвал так куски индекса) обратного индекса «крайней версии» для чтения. Открываем пустой баррель «новой версии» индекса для записи.
- Для каждого слова по порядку сливаем 2 списка – один построенный сортированный в памяти, а другой читаемый и уже отсортированный в файле.
- Закрываем, дописываем все что надо, радуемся.
На практике естественно оказалось, что тот список, который уже хранится в «предыдущей версии» индекса оказывается отсортированным при новой итерации только тогда, когда никакая внешняя информация о страницах не менялась, а это очевидно не так.
Ведь пока мы копили инфу для индекса, могли пересчитаться данные о PR, метрики страниц, тематичность сайтов, и тд. И как следствие, изменится коэффициенты для сортировки. Вопрос нужно ли вообще сортировать списки по подобным параметрам, до сих пор открыт. По слухам гугл сортирует страницы в списках по PR, но очевидно тогда надо уметь быстро отбрасывать шелуху при поиске – которую специально накачали PR, но тематичности недостаточно.
Я использую совмещенный коэффициент, построенный из общей информации о слове на странице (кол-во встреч; место встречи – title, meta, ссылки, текст; выделение, форматирование), из метрик тематичности (пока что они развиты у меня весьма слабо), из PR, из пословного PR (PR по каждому слову у меня тоже есть) и некоторых других.
Причем очевидно, что при высокочастотных запросах, нам реально нужны дай бог первая 1000-2000 результатов в списке, для верности будем считать 262 тысячи. Т.к. все популярные ответы очевидно попадут в них, а дальше на них можно запускать уже функцию ранжирования которая как следует их отсортирует.
При низкочастотных запросах, когда нам реально нужны 2-3-10 результатов, без полного прохождения индекса не обойтись, однако и общая длина списка страниц редко когда будет больше 100 тысяч.
В целом если мы сможем гарантировать что первые N тысяч страниц в списке будут лучшими из остальных пары миллионов, то задача решена, а гарантировать это довольно просто эвристическими методами. Тогда для корректного перестроения каждого барреля:
- запоминаем какие PR сильно изменились при пересчете
- грузим первые N тысяч из списка+немного из остатка по критериям PR, метрики страницы и другой эвристике
- туда же грузим из входных данных нужную порцию о словах текущего барреля
- только для выделенных страниц уже обновляем все данные на корректные, новые – PR, метрики
- сортируем сотню тысяч результатов, вместо пары десятков миллионов и уже в памяти
- пишем отсортированное, а остальное просто копируем из предыдущего индекса удаляя дубли
Ну и конечно надо иметь функцию «обновить целиком» когда раз в месяц-полгода, к примеру, индекс будет перестраиваться весь самым простым прямым алгоритмом
Понятно, что даже такой объем работы в применении к 3 миллионам средне употребляемых слов и цифр дается нелегко, но зато по сравнению с полным перестроением выигрыш существенен: ведь не надо сортировать на диске, не надо грузить внешние метрики, PR и другие параметры – их ведь тоже нельзя кэшировать все в памяти.
Забавно что итеративный способ перестроения дает в разы большую производительность чем простейшее построение обратного индекса из прямого. Некоторые поисковики конечно умудряются это делать достаточно быстро на довольно мощном железе, однако это все равно не лучший подход хоть и самый корректный. Просто количество длинных вставок в обратный индекс сводит все плюсы на нет, да и в известных мне структурах хранения страдает либо скорость вставки либо скорость последовательного чтения.
Поисковый индекс | это… Что такое Поисковый индекс?
Индексирование, совершаемое поисковой машиной — процесс сбора, сортировки и сохранения данных с целью облегчить быстрый и точный поиск информации. Дизайн индекса включает междисциплинарные понятия из лингвистики, когнитивной психологии, математики информатики и физики. Альтернативное название для этого процесса в контексте поисковых машин, разработанных, чтобы искать веб-страницы в Интернете, является
Популярные движки сосредотачиваются на полнотекстовой индексации в онлайне, документов естественного языка[1]. Мультимедийные документы, такие как видео и аудио[2] и графика[3][4] также могут участвовать в поиске.
Метапоисковые машины переиспользуют индексы других поисковых сервисов и не хранят локальный индекс, в то время как основанные на скешированных страницах поисковые машины надолго хранят как индекс, так и корпусы. В отличие от полнотекстовых индексов, частично-текстовые сервисы ограничивают глубину индексации, чтобы уменьшить размер индекса. Большие сервисы, как правило, выполняют индексацию в предопределенных временных рамках из-за необходимого времени и обработки затрат, в то время как поисковые машины, основанные на агентах, строят индекс в масштабе реального времени.
Содержание
|
Индексация
Цель использования индекса — в повышении скорости поиска релевантных документов по поисковому запросу. Без индекса поисковая машина должна была бы сканировать каждый документ в корпусе, что потребовало бы большого количества времени и вычислительной мощности. Например, в то время, как индекс 10 000 документов может быть опрошен в пределах миллисекунд, последовательный просмотр каждого слова в 10 000 больших документов мог бы занять часы. Дополнительное хранилище, требуемое для хранения индекса, а также значительное увеличение времени, требуемого для его обновления, являются компромиссом за экономию времени при поиске информации.
Факторы, учитываемые при дизайне индекса
Примечания
- ↑ Clarke, C., Cormack, G.: Dynamic Inverted Indexes for a Distributed Full-Text Retrieval System. TechRep MT-95-01, University of Waterloo, February 1995.
- ↑ Stephen V. Rice, Stephen M. Bailey. Searching for Sounds. Comparisonics Corporation. May 2004. Verified Dec 2006
- ↑ Charles E. Jacobs, Adam Finkelstein, David H. Salesin. Fast Multiresolution Image Querying. Department of Computer Science and Engineering, University of Washington. 1995. Verified Dec 2006
- ↑ Lee, James. Software Learns to Tag Photos. MIT Technology Review. November 09, 2006. Pg 1-2. Verified Dec 2006. Commercial external link
Ссылки
- С. Брин, Л. Пейдж The Anatomy of a Large-Scale Hypertextual Web Search Engine. Архивировано из первоисточника 30 марта 2012. Проверено 20 сентября 2009.
Концепция поиска: Индекс поиска | Swiftype
searchmobilefacetsautocompletespellcheckcrawlerrankingsweightssynonymsanalyticsengageapicustomizedocumentationinstallsetuptechnologycontentdomainsuserhistoryinfohomebusinesscartchartcontactemailactivateanalyticsaltanalyticsautocompletecartcontactcontentcrawlingcustomdocumentationdomainsemailengagefacetedhistoryinfoinstallmobilepersonquerybuildersearchsetupspellchecksynonymsweightsengage_search_termengage_next_resultsengage_personalized_resultsengage_recent_resultssuccessaddarrow-downarrow-leftarrow-rightarrow-upcaret-downcaret-leftcaret-rightcaret-upcheckclosecontentconversions-smallconversionsdetailseditgridhelpsmall-infoerrorlivemagentominusmovephotopinpluspreviewrefreshsearchsettingssmall-homestatsubtracttexttrashunpinwordpressxalertcase_deflectionadvanced-permissionskeyword-detectionpredictive-aissoПоисковый индекс — это совокупность структурированных данных, на которые ссылается поисковая система при поиске результатов, релевантных конкретному запросу. Индексы являются важной частью любой поисковой системы, поскольку они должны быть адаптированы к конкретному методу поиска информации алгоритма поисковой системы. Таким образом, алгоритм и индекс неразрывно связаны друг с другом. Индекс также может использоваться как глагол (индексация), относящийся к процессу сбора неструктурированных данных веб-сайта в структурированном формате, адаптированном для алгоритма поисковой системы.
Один из способов представить себе индексы — рассмотреть следующую аналогию между поисковой инфраструктурой и офисной файловой системой. Представьте, что вы передаете стажеру стопку из тысяч листов бумаги (документов) и говорите ему упорядочить эти листы бумаги в картотеке (каталоге), чтобы помочь компании более эффективно находить информацию. Стажер сначала должен будет разобрать бумаги и получить представление обо всей информации, содержащейся в них, затем им нужно будет определиться с системой их размещения в картотеке, а затем, наконец, им нужно будет решить, что наиболее эффективный способ поиска и выбора из файлов, когда они находятся в кабинете. В этом примере процесс организации и хранения документов соответствует процессу индексации контента веб-сайта, а метод поиска среди этих организованных файлов и поиска наиболее релевантных файлов соответствует алгоритму поиска.
Swiftype Site Search использует высокопроизводительный поисковый робот, который автоматически индексирует содержимое ваших веб-сайтов в структурированном формате, оптимизированном для нашего алгоритма поиска. Чтобы настроить поля, составляющие схему их веб-сайта, владельцы сайтов могут использовать настраиваемые метатеги Swiftype или документацию по API.
Кроме того, пользователи Site Search могут управлять областью индекса своей поисковой системы на панели инструментов Swiftype Site Search, добавляя дополнительные домены с правилами черного или белого списка или удаляя и добавляя отдельные страницы в свой индекс.
Поиск приложений обеспечивает программный контроль над поиском. Конечная точка API документов позволяет пользователю отправлять документы в поисковую систему приложений пользователей для индексации. По умолчанию создается текстовая схема, но после этого пользователь получает полный контроль над различными полями через панель управления или API. С помощью поиска приложений вы можете писать простые функции, которые индексируют данные почти в реальном времени.
Индексация поиска в Windows 10: FAQ
Индексация содержимого вашего ПК помогает быстрее получать результаты при поиске на нем файлов и других объектов. Узнайте, как это работает.
Что такое индексация?
Индексирование — это процесс просмотра файлов, сообщений электронной почты и другого содержимого на вашем ПК и каталогизации их информации, такой как содержащиеся в них слова и метаданные. Когда вы выполняете поиск на своем ПК после индексации, он просматривает индекс терминов, чтобы быстрее находить результаты.
Когда вы впервые запускаете индексирование, это может занять до пары часов. После этого индексирование будет выполняться в фоновом режиме на вашем ПК по мере его использования, только переиндексируя обновленные данные.
Как индексирование ускоряет поиск?
Подобно индексу в книге, наличие цифрового индекса позволяет вашему ПК и приложениям быстрее находить контент, ища термины или общие свойства, такие как дата создания файла. Полностью построенный индекс может возвращать ответы на такие запросы, как «Показать все песни Coldplay», за доли секунды, тогда как без индекса это могло бы занять минуты.
Какая информация индексируется?
По умолчанию индексируются все свойства ваших файлов, включая имена файлов и полные пути к файлам. Для файлов с текстом их содержимое индексируется, чтобы вы могли искать слова в файлах.
Приложения, которые вы устанавливаете, также могут добавлять свою информацию в индекс для ускорения поиска. Например, Outlook 2016 добавляет все электронные письма, синхронизированные с вашим компьютером, в индекс по умолчанию и использует индекс для поиска в приложении.
Какие приложения используют индекс?
Многие встроенные приложения на вашем компьютере каким-то образом используют индекс. File Explorer, Photos и Groove используют его для доступа и отслеживания изменений в ваших файлах. Microsoft Edge использует его для предоставления результатов истории браузера в адресной строке. Outlook использует его для поиска в электронной почте. Кортана использует его для более быстрого поиска результатов на вашем ПК.
Многие приложения в Microsoft Store также зависят от индекса для предоставления актуальных результатов поиска ваших файлов и другого содержимого. Отключение индексирования приведет к тому, что эти приложения либо будут работать медленнее, либо вообще не будут работать, в зависимости от того, насколько сильно они на него полагаются.
Почему индексирование всегда выполняется автоматически на моем компьютере?
Ваш ПК с Windows 10 постоянно отслеживает изменения в файлах и обновляет индекс последней информацией. Для этого он открывает недавно измененные файлы, просматривает изменения и сохраняет новую информацию в индексе.
Где хранится информация индекса?
Все данные, собранные в результате индексирования, хранятся локально на вашем ПК. Ни один из них не отправляется ни на какой другой компьютер или в Microsoft. Однако приложения, которые вы устанавливаете на свой компьютер, могут читать данные в индексе, поэтому будьте осторожны с тем, что вы устанавливаете, и убедитесь, что вы доверяете источнику.
Сколько места занимает индекс?
Эмпирическое правило заключается в том, что индекс будет составлять менее 10 процентов от размера проиндексированных файлов. Например, если у вас есть 100 МБ текстовых файлов, индекс для этих файлов будет меньше 10 МБ.
Индекс может занимать больший процент, если у вас много очень маленьких файлов (<4 КБ) или если вы индексируете компьютерный код. В обоих случаях размер индекса резко увеличится пропорционально размеру файлов. Если у вас есть много небольших файлов и вам нужно сэкономить место на вашем ПК, рассмотрите возможность удаления местоположения этих файлов из индексации, перейдя на страницу панели управления «Параметры индексирования» и выбрав Изменить .
Какие языки можно индексировать?
Все языковые пакеты, установленные вместе с Windows, включают информацию для индексации содержимого на этом языке. Если у вас есть файлы или другой контент на языке, который не установлен на вашем ПК, индекс попытается сделать его доступным для поиска, но это не всегда возможно.
Чтобы установить дополнительные языковые пакеты, чтобы убедиться, что язык доступен для поиска на вашем ПК, перейдите к Настройки > Время и язык > Регион и язык , а затем выберите Добавить язык .
Какие типы файлов можно индексировать?
Чтобы просмотреть список типов файлов, которые можно индексировать, перейдите на страницу панели управления «Параметры индексирования» и выберите Дополнительно > Типы файлов .