查找与数据存储区的相似之处

时间:2016-07-03 17:05:50

标签: sql google-app-engine google-cloud-datastore

假设用户可以输入多个字符串,服务器对其进行处理并将其存储在数据存储区中。是否有可能查询相似数量(没有任何解决方法)?或者有一个更好的解决方案吗?

示例查询:获取id,其中值similair为" a,b,c"

返回:1,8,9,6,10等。

示例数据:

enter image description here

2 个答案:

答案 0 :(得分:0)

您应修复数据结构,以便每个ID和值都有一行。字符串操作函数在SQL中并不是特别好。

有了您的数据,您可以这样做:

select t.*,
       ((case when ',' || value || ',' like '%,a,%' then 1 else 0 end) +
        (case when ',' || value || ',' like '%,b,%' then 1 else 0 end) +
        (case when ',' || value || ',' like '%,c,%' then 1 else 0 end)
       ) as nummatches
from t
order by nummatches desc;

串联运算符因数据库而异;它可能是+&concat()

答案 1 :(得分:0)

您不能在数据存储上使用类似SQL的查询。数据存储使用有效但非常有限的索引。

但是,您可以在同一对象的单个索引中重复输入。

所以有一种方法可以做到这一点,如果你有一个像(a,b,c,d)这样的有限集,那就是 按排序顺序存储所有组合:

object 1: tags = ["a", "b", "c", "ab", "bc", "abc"]
object 2: tags = ["a", "c", "d", "ac", "cd", "acd"]

您还可以搜索前缀,即索引字符串的前N个字母。

另一种方法是查询包含“a”的所有对象,然后查询包含“b”等的所有对象,并在软件中进行交集。在你的例子中,这将是相当低效的。如果您只有少量相同的值并且仅请求键,则可以高效,然后在从数据存储区请求实际对象之前执行交集。

为支持高效查询的数据存储区设计模型可能具有挑战性,需要进行相当多的规划。如果您只使用小型数据集,则可以考虑使用CloudSQL解决方案。