我有一个非常大的对象数据库(读取一个键/值对数组,如标准C表示法中的[{}, {}, {}]
),我需要能够搜索该集合中任何键的任何值对并找到包含它的对象(我将使用模糊搜索或类似的字符串比较算法)。我能想到的一种方法是创建一个巨大的主对象,其中一个键引用了对象内部每个值的原始对象:
DB = [
{
"a": 45,
"b": "Hello World"
},
{
"a": 32,
"b": "Testing..."
}
]
// ... Generation Code ... //
search = {
45: {the 0th object},
"Hello World": {the 0th object},
32: {the 1st object},
"Testing...": {the 1st object}
}
这个解决方案至少可以将问题简化为大量的比较,但是有更好的方法吗?请注意,我没有正式的计算机科学培训,所以我可能会遗漏一些重要的细节,简化或证明这个问题不可能。
P.S。这是too broad吗?如果是这样,我很乐意将其删除
答案 0 :(得分:1)
您的组合索引更适合全文搜索,但不指示找到值的对象的属性。提供更多上下文的替代技术是为每个属性构建索引。
在准备和查找特定属性的搜索器(例如a == 32
)时,这应该更快,因为对于n个对象和p属性,二进制搜索(在插入和查找中使用)将需要log(np) )对单一属性索引上的组合索引和log(n)进行比较。
在任何一种情况下,您都需要注意多次出现的相同值。您可以将偏移数组存储为每个索引条目的值,而不是仅存储单个值。
例如:
search = {
"a": {
45: [0],
32: [1]
},
"b": {
"Hello World": [0],
"Testing...": [1]
}
}