Я понимаю, что фундаментальным аспектом полнотекстового поиска является использование инвертированных индексов .Таким образом, с инвертированным индексом запрос из одного слова становится тривиальным для ответа.Предполагая, что индекс имеет следующую структуру:
some-word -> [doc385, doc211, doc39977, ...] (отсортировано по убыванию)
Чтобы ответить на запрос для этого словарешение состоит в том, чтобы просто найти правильную запись в индексе (которая занимает O (log n) времени) и представить некоторое заданное количество документов (например, первые 10) из списка, указанного в индексе.
Нокак насчет запросов, которые возвращают документы, которые соответствуют, скажем, двум словам?Самая простая реализация была бы следующей:
- набор A, чтобы быть набором документов, которые имеют слово 1 (путем поиска в индексе).
- набор B, чтобы быть наборомдокументы, которые имеют слово 2 (то же самое).
- вычисляют пересечение A и B.
Теперь, для выполнения третьего шага, вероятно, потребуется O (n log n) времени.Для очень больших A и B, которые могут замедлить ответ на запрос.Но поисковые системы, такие как Google, всегда возвращают свой ответ в течение нескольких миллисекунд.Так что это не может быть полным ответом.
Одна очевидная оптимизация состоит в том, что, поскольку поисковая система, такая как Google, не возвращает все подходящие документы, нам не нужно вычислять полное пересечение.Мы можем начать с наименьшего набора (например, B) и найти достаточно записей, которые также принадлежат другому набору (например, A).
Но разве у нас не может быть следующего наихудшего случая?Если мы установили A как набор документов, соответствующих общему слову, а набор B - как набор документов, соответствующих другому общему слову, все же могут быть случаи, когда A ∩ B очень мало (то есть комбинация встречается редко).Это означает, что поисковая система должна линейно пройти через все элементы x член B, проверяя, являются ли они также элементами A, чтобы найти те немногие, которые соответствуют обоим условиям.
Линейный не быстрый.И вы можете найти более двух слов для поиска, так что использование параллелизма, безусловно, не является полным решением.Итак, как эти случаи оптимизированы?Используют ли крупные полнотекстовые поисковые системы какие-то составные индексы?Блум фильтры?Есть идеи?