Как поисковые системы проводят операции «И»? - PullRequest
4 голосов
/ 26 февраля 2010

Рассмотрим следующие результаты поиска:

OK. Страницы индексируются, нужно только просмотреть количество и первые несколько элементов в таблице индекса, поэтому скорость понятна.

Теперь рассмотрим следующий поиск с операцией AND :

Это ставит меня в тупик;) Как, на самом деле, поисковые системы могут так быстро получить результат операций И ​​над гигантскими наборами данных? Я вижу следующие два способа выполнить задачу, и оба ужасны:

  1. Вы ведете поиск «Давида». Возьмите гигантский временный стол и найдите на нем «Джона». ОДНАКО временная таблица не индексируется «Джоном», поэтому необходим поиск методом перебора. Это просто не будет вычисляться в течение 0,25 с независимо от того, какой у вас HW
  2. Индексирование по всем возможным словам такие комбинации, как «Дэвид Джон». затем мы сталкиваемся с комбинаторным взрывом по количеству ключей и даже у Google нет хранилища способность справиться с этим.

И вы можете И вместе столько поисковых фраз, сколько хотите , и вы все равно получите ответы менее чем за 0,5 секунды! Как?

Ответы [ 4 ]

2 голосов
/ 26 февраля 2010

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

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

При поиске запроса с двумя терминами, концептуально, вы берете списки рассылки для каждого из двух терминов ('david' и 'john') и идете по ним, ища документы, которые есть в обоих списках. Если оба списка упорядочены одинаково, это можно сделать за O (N). Конечно, N все еще огромен, поэтому это будет сделано на сотнях машин параллельно.

Также могут быть дополнительные хитрости. Например, если документы с наивысшим рейтингом были размещены выше в списках, то, возможно, алгоритм мог бы решить, что он нашел 10 лучших результатов, не пройдя по всем спискам. Затем он будет угадывать на оставшееся количество результатов (на основе размера двух списков).

1 голос
/ 26 февраля 2010

Я не знаю, как это делает Google, но я могу рассказать вам, как Я сделал это, когда клиенту нужно что-то подобное:

Начинается с инвертированного индекса, как описано в Avi. Это просто список таблиц для каждого слова в каждом документе, идентификатор документа, слово и оценка релевантности слова в этом документе. (Другой подход состоит в том, чтобы индексировать каждое появление слова индивидуально вместе с его положением, но в этом случае это не требовалось.)

Оттуда, это даже проще, чем описание Avi - нет необходимости делать отдельный поиск для каждого термина. Стандартные операции с базой данных могут легко сделать это за один проход:

SELECT document_id, sum(score) total_score, count(score) matches FROM rev_index
WHERE word IN ('david', 'john') GROUP BY document_id HAVING matches = 2
ORDER BY total_score DESC

При этом будут возвращены идентификаторы всех документов, которые имеют оценки как для «Дэвида», так и для «Иоанна» (т. Е. Оба слова появляются), упорядоченные по некоторой аппроксимации релевантности, и их выполнение займет примерно одно и то же время независимо от того, сколько или как мало терминов, которые вы ищете, так как на производительность IN не влияет размер целевого набора, и он использует простой count, чтобы определить, были ли сопоставлены все термины.

Обратите внимание, что этот упрощенный метод просто добавляет оценку «Дэвид» и оценку «Джон» вместе, чтобы определить общую релевантность; он не принимает порядок / близость / и т.д. из имен в учет. Еще раз, я уверен, что Google учитывает это в своих оценках, но моему клиенту это не нужно.

1 голос
/ 26 февраля 2010

Я думаю, что вы подходите к проблеме под неправильным углом.

У Google нет таблиц / индексов на одной машине. Вместо этого они интенсивно распределяют свой набор данных по серверам. В отчетах указывается , что в каждом отдельном запросе задействовано до 1000 физических машин !

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

Чтение о технологиях и инфраструктуре Google очень вдохновляет и очень познавательно. Я бы порекомендовал читать по BigTable , MapReduce и Файловая система Google .

Google имеет архив своих публикаций , в котором содержится много сочной информации об их технологиях. Этот поток в метафильтре также дает некоторое представление об огромном количестве оборудования, необходимого для работы поисковой системы.

0 голосов
/ 26 февраля 2010

Я сделал нечто похожее на это несколько лет назад на 16-битной машине. Верхний предел набора данных составлял около 110 000 записей (это было кладбище, поэтому ограниченный предел для захоронений), поэтому я настроил серию растровых изображений, каждое из которых содержало 128 Кбит.

В результате поиска «david» я установил соответствующий бит в одном из растровых изображений, чтобы указать, что в записи есть слово «david». Сделал то же самое для «Джона» во втором растровом изображении.

Тогда все, что вам нужно сделать, это двоичные 'и' из двух растровых изображений, и результирующее растровое изображение сообщает вам, в каких номерах записей есть и 'david', и 'john'. Быстрое сканирование полученного растрового изображения возвращает список записей, соответствующих обоим терминам.

Хотя этот метод не сработает для Google, поэтому примите во внимание мою стоимость в $ 0,02.

...