2013-06-07 4 views
0

У меня много объектов. Каждому объекту соответствует несколько пар ключ-значение. Ключ - это произвольная строка (ключи могут быть разными для разных объектов, и нет полного списка возможных ключей), значение может быть числовым, строковым, datetime и т. Д.Найти подходящее хранилище и поисковая система

Мне нужно выполнить поиск по этой коллекции, используя сложный поиск запросы. В самой простой реализации пользователь должен иметь возможность указывать список интересных ключей и условие для значения каждого ключа, например.

key1: not present 
key2: present 
key3: == "value3" 
key4: < 42 
key5: contains "value5" 

Двигатель должен найти все объекты, которые удовлетворяют всем условиям (то есть условия имеют значение AND). В идеальной реализации пользователь может указать условие с использованием некоторого языка запросов, например.

key1 = "value1" AND (key2 < 3 OR key3 < 3) 

Я использую C++ с Qt в Windows (поддержка Linux не обязательно, но хорошая). Я не хочу использовать базы данных, требующие некоторой установки (особенно с правами администратора), я хочу, чтобы решение было переносимым.

Пожалуйста, предлагайте хороший способ реализовать это с нуля или использовать любую библиотеку или базу данных, которые удовлетворяют мои потребности.

Обновление: Вопрос о хранении больших объемов данных на диске и быстрый поиск по нему. Возможно, речь идет также о разборе и обработке поисковых запросов. Речь идет не о структурах данных, которые мне нужны для представления данных в памяти. Это достаточно просто.

ответ

1

Если они уникальны, используйте std::map или (C++ 11) std::unordered_map.

Если ключи не уникальны, используйте std::multimap или (C++ 11) std::unordered_multimap.

Последние имеют O (1) поиск и вставку, но требуют, чтобы вы предоставили качественный алгоритм хэширования (нелегко сделать) и, возможно, повторно отобразить карту по мере ее роста. & сжимается.

Поиск обеспечивается контейнерами.

Сериализация оставлена ​​в качестве упражнения для читателя.

+0

Имеется довольно много данных. Загрузка всего этого в память займет некоторое время. Однако поиск после этого будет быстрым. Как вы думаете, это лучший вариант? Существуют ли какие-либо технологии, обеспечивающие быстрый поиск без загрузки всех данных в память? –

+0

Уверен, что вы можете перейти на диск и пропустить при поиске ключей. Путь, выходящий за рамки вашего вопроса, извините. Посмотрите на «Искусство компьютерного программирования» Кнута. –

+0

Это не выходит за рамки моего вопроса, это то, что я пытался задать в моем вопросе. Простейшая реализация этого будет слишком медленной. Я ищу что-то, чтобы ускорить поиск. –

0
use Nested Maps like std::map<key1,std::map<key2,value>>.... 
+0

Почему вложенные? ... –

+0

Мои карты не вложены. –

Смежные вопросы