Как эффективно хранить индексы документов - PullRequest
2 голосов
/ 08 января 2012

Я работаю над системой семантического поиска, которая хранит огромное количество данных.Данные на самом деле являются документами и их индексами.Основные проблемы заключаются в том, как индексировать документ с помощью онтологий и как их хранить.

Мой вопрос касается второй проблемы.Сначала я реализовал хранение в RDBMS.Работает очень медленно.Я рассматриваю возможность использования базы данных NoSQL для этой цели, но у меня есть некоторые сомнения.

Обратите внимание, что простой поиск текста с использованием Lucene - это не то, что мне нужно в текущем поле.

Позвольте мне упростить структуру магазина.Обратите внимание, что хранятся только инвертированные индексы.В RDBMS у нас есть таблицы:
1) Word - слова из некоторого словаря
2) Document - документ с метаданными и его содержимым
3) Hit - совпадения слова в документе (все совпадения, разделенные '|')

Чтобы получить результат, система анализирует слова в запросе и рассчитывает релевантность документа на основе информации о слове.Я пропустил некоторые моменты о семантическом анализе, это пока не важно.

Что вы думаете об этой структуре хранения слов?

{
"word": "some_word",
...
"некоторые другие метаданные из словаря"
...
"совпадения": [
"doc1": ["hit_info1", "hit_info2" ...]
"doc2": ["hit_info1", "hit_info2" ...]
]
}

Заранее спасибо!

1 Ответ

1 голос
/ 08 января 2012

Прежде всего, СУБД является хорошим выбором для высокоструктурированных данных. Основная проблема производительности с RDBMS - обработка транзакций. Вы пытаетесь управлять отношением n: m между словами и документами. Это не может быть сделано в файловой системе. Используйте сервер SQL и следуйте следующим советам, тогда он должен быть достаточно быстрым.

Прежде всего, вы должны рассмотреть среду ORM (объектно-реляционное отображение), которая поддерживает "обобщенное пакетирование". Для C # и .NET я могу порекомендовать «DataObjects.NET». Это экономит вам массу работы, оптимизируя клиент-серверные циклы.

Сделайте вашу транзакцию максимально крупной. Если у вас есть документ с 1000 словами, обработайте его за одну транзакцию. Возможно, вы сможете обработать несколько документов за одну транзакцию.

Форма ваших вкладышей в две партии: (Пакет представляет собой группу команд SQL, отправленных в один мир на сервер)

  1. Запрос всех пропущенных слов для вашего документа
  2. Вставьте документ, пропущенные слова и отношения в один раунд.

Абсолютно важно сделать это в партии. Если вы выполняете отдельные заявления, вы запутаетесь в поездках клиент / сервер.

У меня есть похожие данные для обработки, и для большой партии (100000 слов) это делается примерно за 0,2-0,5 секунды.

P.S. И попробуйте отключить сброс на диск в конце транзакции на вашем SQL-сервере.

...