【问题标题】:Find appropriate data storage and search engine找到合适的数据存储和搜索引擎
【发布时间】:2013-06-10 21:15:37
【问题描述】:

我有很多东西。每个对象都与许多键值对相关联。 Key是任意字符串(不同对象的key可能不同,没有可能的key的完整列表),value可以是数字、字符串、日期时间等。

我需要使用复杂的搜索查询来搜索这个集合。在最简单的实现中,用户必须能够指定感兴趣的键列表和每个键的值的条件,例如

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

引擎必须找到满足所有条件的所有对象(即条件是与)。在完美的实现中,用户可以使用某种查询语言来指定条件,例如

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

我在 Windows 上使用 C++ 和 Qt(Linux 支持不是必需的,但很好)。我不想使用需要一些安装(尤其是具有管理员权限)的数据库,我希望解决方案是可移植的。

请提出一种从头开始实现此功能的好方法,或者使用任何满足我需求的库或数据库。

更新:问题是关于在磁盘上存储大量数据并快速搜索。也许它也与解析和处理搜索查询有关。这与我需要用来表示内存中数据的数据结构无关。很简单。

【问题讨论】:

    标签: c++ qt search nosql key-value


    【解决方案1】:

    如果它们的键是唯一的,请使用 std::map 或 (C++11) std::unordered_map

    如果键不唯一,请使用 std::multimap 或 (C++11) std::unordered_multimap

    后者有 O(1) 的搜索和插入,但要求您提供高质量的散列算法(不容易制作)并可能在地图增长和缩小时重新散列。

    搜索由容器提供。

    序列化留给读者作为练习。

    【讨论】:

    • 数据相当多。将所有内容加载到内存中需要一些时间。然而,这之后的查找会很快。你认为这是最好的选择吗?是否有任何技术可以提供快速查找而无需将所有数据加载到内存中?
    • 当然你可以去磁盘搜索密钥时跳过。抱歉,超出了您的问题范围。查看 Knuth 的“计算机编程艺术”。
    • 这并不超出我的问题范围,这是我试图在我的问题中提出的问题。最简单的实现会太慢。我正在寻找加快搜索速度的方法。
    【解决方案2】:
    use Nested Maps like std::map<key1,std::map<key2,value>>....
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-13
      • 2021-11-24
      • 2017-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多