Большинство современных менеджеров баз данных с закрытым исходным кодом имеют некоторую возможность полнотекстовой индексации. Учитывая его популярность, я полагаю, что большинство из них также имеют предварительно написанные фильтры для HTML, поэтому при поиске чего-то вроде <p>
не будет 1000 посещений для каждой веб-страницы.
Если вы хотите сделать работу полностью самостоятельно, фильтрация HTML, вероятно, самая сложная часть. Оттуда инвертированный индекс требует большой обработки текста и дает большой результат, но в основном это довольно просто - вы просто сканируете все документы и создаете список слов и их местоположений (обычно после крайне распространенной фильтрации). слова типа «a», «an», «and» и т. д., которые не будут значимыми поисковыми терминами), а затем объедините их в один большой индекс.
Учитывая размер полного индекса, часто полезно добавить индекс второго уровня, который достаточно мал, чтобы вы могли быть уверены, что он легко поместится в реальную память (например, ограничьте его несколькими сотнями записей или около того). Действительно маленькая (но несколько неэффективная) версия просто идет по первым буквам слов, поэтому слова «А» начинаются с 0, «В» - с 12345, «С» - с 34567 и т. Д. Это не очень эффективно - вы получите гораздо больше слов, которые начинаются с «А», чем, например, с «Х». Более эффективно построить свой индекс, а затем выбрать несколько сотен (или что-то еще) слов, которые равномерно распределены по всему индексу. Затем используйте это в качестве индекса первого уровня. Теоретически, вы можете получить гораздо более сложную информацию, например, что-то вроде дерева B +, но это, как правило, излишне - из миллиона документов есть вероятность, что в итоге вы получите менее ста тысяч слов, которые используются достаточно часто. иметь большое значение для размера индекса. Даже в этом случае довольно много записей будут опечатками, а не реальными словами ...