Я знаю, что инвертированное индексирование - хороший способ индексирования слов, но то, что я смущен, - это то, как поисковые системы фактически хранят их? Например, если слово «google» появляется в документе - 2, 4, 6, 8 с разными частотами, где их следует хранить? Может ли таблица базы данных со отношением «один-ко-многим» сделать любую полезную для их хранения?Хранение инвертированного индекса
ответ
Это справедливая ставка, согласно которой у каждой из основных поисковых систем есть своя технология обработки инвертированных индексов. Это также умеренно хорошая ставка, что они не основаны на стандартной технологии реляционных баз данных.
В конкретном случае Google разумно предположить, что используемая технология основана на технологии BigTable, описанной в 2006 году Фэй Чангом и др. В Bigtable: A Distributed Storage System for Structured Data. Существует мало сомнений в том, что система развилась с тех пор.
Очень маловероятно, что для этой цели используются полнофункциональные SQL-подобные базы данных. Во-первых, он называется инвертированным индексом , потому что это всего лишь индекс. Каждая запись является только ссылкой. Поскольку нереляционные базы данных и хранилища ключевых значений появились в качестве любимой темы в отношении веб-технологий.
- У вас только есть один способ доступа к данным (по слову запроса). Вот почему он называется индексом.
- Каждая запись представляет собой список/массив/вектор ссылок на документы, поэтому каждый элемент этого списка очень мал. Единственной другой информацией, кроме хранения идентификатора документа, было бы хранить оценку tf-idf для каждого элемента.
Как использовать:
Если у вас есть одно слово запроса («Google»), то вы смотрите в инвертированного индекса, в котором задокументированы это слово поворачивает вверх (2,4,6,8 в вашем примере). Если у вас есть оценки tf-idf, вы можете отсортировать результаты, чтобы сначала сообщить о наилучшем совпадающем документе. Затем вы просматриваете документы, на которые ссылаются идентификаторы документов 2,4,6,8, и сообщают об их URL-адресе, а также фрагменте и т. Д. URL-адрес, фрагменты и т. Д., Вероятно, лучше всего хранить в другой таблице или хранилище ключей.
Если у вас несколько слов запроса («google» и «altavista»), вы просматриваете II для обоих слов запроса и получаете два списка идентификаторов документов (2,4,6,8 и 3,7, 8,11,19). Вы берете перекресток обоих списков, который в этом случае равен (8), который является списком документов, в котором происходят оба слова запроса.
Традиционно инвертированный индекс записывается непосредственно в файл и хранится на диске где-то. Если вы хотите выполнить логическое поисковое запрос (либо файл содержит все слова в запросе, либо нет), сообщения могут выглядеть так, что они хранятся смежно в файле.
Term_ID_1: Frequency_N: Doc_ID_1, Doc_ID_2, Doc_ID_N.Term_ID_2: Frequency_N: Doc_ID_1, Doc_ID_2, Doc_ID_N.Term_ID_N: Frequency_N: Doc_ID_1, Doc_ID_2, Doc_ID_N
Термин идентификатор идентификатор термина, частота количество документов, на которые указывает этот термин (другими словами, как долго находится список проводок), а id документа - это документ, содержащий этот термин.
Наряду с индексом вам нужно знать, где все находится в файле, поэтому сопоставления также должны храниться где-то в другом файле. Например, с учетом term_id, карта должна вернуть позицию файла, содержащую этот индекс, и затем можно искать эту позицию. Поскольку frequency_id записывается в сообщениях, вы знаете, сколько doc_ids должно читать из файла.Кроме того, должны быть сопоставления из идентификаторов с фактическим именем term/doc.
Если у вас есть небольшой прецедент, вы можете извлечь это с помощью SQL, используя blobs для списка проводок и самостоятельно обрабатывая пересечение при запросе.
Другая стратегия для очень небольшого варианта использования заключается в использовании матрицы терминов документов.
Возможное решение
Одним из возможных решений было бы использовать позиционную индекс. Это в основном инвертированный индекс, но мы увеличиваем его, добавляя дополнительную информацию. Вы можете узнать больше об этом на Stanford NLP.
Пример
сказать слово "Привет" появился в Документах 1 и 3, в положениях (3,5,6,200) и (9,10) соответственно.
- Basic Перевернутый Index (обратите внимание, что нет никакого способа, чтобы найти freqs слова, ни там позиции)
"hello" => [1,3]
- Позиционная Index (заметьте, мы не только freqs для каждой документации, но мы точно знаем, где именно этот термин появился в документе)
"hello" => [1:<3,5,6,200> , 3:<9,10>]
Heads Up
Будет ли ваш индекс займет намного больше размера сейчас? Вы делаете ставку!
Вот почему это хорошая идея сжать индекс. Существует несколько вариантов сжатия списка проводок с использованием кодировки пробелов и еще больше параметров для сжатия словаря, используя общие алгоритмы сжатия строк.
Связанные чтения
- 1. Хранение инвертированного индекса
- 2. Эффективность инвертированного индекса Python
- 3. Ошибка программы инвертированного индекса Hadoop
- 4. хэш индекс против инвертированного индекса
- 5. Помощь с построением инвертированного индекса
- 6. best NoSQL для инвертированного индекса
- 7. Форвардный индекс против инвертированного индекса Почему?
- 8. Каков наилучший способ построения инвертированного индекса?
- 9. Как поисковые системы объединяют результаты инвертированного индекса?
- 10. Какова лучшая структура данных для создания инвертированного индекса в Java?
- 11. Delphi - Какая структура позволяет сохранить тип инвертированного индекса?
- 12. Как искать фразовые запросы в структуре инвертированного индекса?
- 13. Получение инвертированного индекса для индексированных документов в Elasticsearch
- 14. Что именно выглядит структура данных инвертированного индекса в SOLR
- 15. ElasticSearch: создание нового инвертированного индекса после каждого обновления
- 16. Эффективное хранение внешнего индекса строк
- 17. запрос на индекс инвертированного файла
- 18. Расчет радиуса инвертированного круга
- 19. Хранение индекса Lucene в Cassandra DB
- 20. Против «инвертированного выделения» с усами
- 21. Как оптимизировать «текстовый поиск» для инвертированного индекса и реляционной базы данных?
- 22. Как заказать по ключу (по алфавиту) в defaultdict (список) для инвертированного индекса
- 23. Не удалось добавить к карте деревьев, которая находится внутри другой карты (для создания инвертированного индекса)
- 24. Необходим формат файла для инвертированного индексирования
- 25. Попытка обратного/инвертированного отображения цифровой пирамиды
- 26. Нарисуйте функцию «инвертированного V» с помощью ggplot2
- 27. Инвертировать результат цвета int инвертированного деления
- 28. сравнение списков и хранение значений индекса, если списки совпадают
- 29. Способы создания огромного перевернутого индекса
- 30. Поле индекса и пустота
Это немного слишком расплывчата, чтобы ответить. Это действительно сводилось к тому, чтобы хранить его как нечто вроде JSON или создавать таблицы и ссылаться на внешний ключ. Хранение его в виде таблицы означает таблицу для каждого слова, которое вы хотите индексировать. Внешний ключ позволяет нормализовать и упростить модификацию одной записи. – Carter