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