Каков наилучший способ построения инвертированного индекса? - PullRequest
0 голосов
/ 16 марта 2010

Я создаю небольшую систему веб-поиска для поиска около 1 миллиона веб-страниц, и я хочу знать, каков наилучший способ построения инвертированного индекса? используя СУБД или что ...? с разных точек зрения, таких как стоимость хранения, производительность, скорость индексации и запросов? и я не хочу использовать какой-либо проект с открытым исходным кодом, для этого я хочу сделать свой собственный!

Ответы [ 4 ]

3 голосов
/ 16 марта 2010

Большинство современных менеджеров баз данных с закрытым исходным кодом имеют некоторую возможность полнотекстовой индексации. Учитывая его популярность, я полагаю, что большинство из них также имеют предварительно написанные фильтры для HTML, поэтому при поиске чего-то вроде <p> не будет 1000 посещений для каждой веб-страницы.

Если вы хотите сделать работу полностью самостоятельно, фильтрация HTML, вероятно, самая сложная часть. Оттуда инвертированный индекс требует большой обработки текста и дает большой результат, но в основном это довольно просто - вы просто сканируете все документы и создаете список слов и их местоположений (обычно после крайне распространенной фильтрации). слова типа «a», «an», «and» и т. д., которые не будут значимыми поисковыми терминами), а затем объедините их в один большой индекс.

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

1 голос
/ 20 января 2011

Я думаю, что в этой книге есть ваш ответ, если вы все еще ищете его.

http://nlp.stanford.edu/IR-book/information-retrieval-book.html

1 голос
/ 16 марта 2010

Возможно, вы захотите уточнить, почему вы не хотите использовать инструменты F / OSS, такие как Lucene или Sphinx.

0 голосов
/ 17 сентября 2010

Вы можете начать с Hadoop. Он эффективно распределит ваши индексы по кластеру. Вы можете использовать любой язык для этого. Java и Python рекомендуются. Используя Hadoop / MapReduce, вы можете легко проиндексировать свои веб-страницы. Но они должны быть кэшированы / сохранены на диске, и вам потребуется парсер / токенизатор для извлечения текста в первую очередь. В сети есть несколько свободно доступных парсеров. Вы можете начать отсюда, если вы хотите сделать это вручную. Если у вас есть индекс, то его сохранение - еще одна задача.

...