2014-10-09 44 views
1

我想让用户保存像{product_type : glasses, price_lt : 100, brand: gucci}这样的搜索或像{brand : gucci, color: black}这样的搜索。如何构建SQL查询以查找新产品的所有已保存搜索?

当一件新产品像99美元的黑色Gucci眼镜一样上市时,我希望能够找到任何匹配的保存搜索并通知这些用户。我将用户搜索存储在数据库称为作用域的字段中,并且它是JSON字符串,因为它可能有很多过滤器。

问题我可以形成一个SQL查询,它会查找保存的搜索吗?示例我将通过查询大部分产品信息,并尝试查找scopes字段中的每个条件均符合的任何记录。我的问题是,该产品有15个属性,保存的搜索只有4个过滤器,我不能在15个属性上执行AND,因为范围只关心其中的4个。

其次,如果这是一个可怕的方式来做到这一点,那么将所有的过滤器放在单独的字段中,然后只要在brand = 'gucci' OR brand = NULL的地方写一个查询,这样如果保存的搜索不关心某个品牌过滤它仍然是一个潜在的匹配?

对不起,只是试图找出最高性能的方式。目前,我只是拿出搜索并在内存中循环搜索,但我知道,在数据库和数千种产品中有成千上万次保存搜索时,这种搜索不会扩展。思考?建议?

+0

是你的JSON过滤器排序?像aplhabetically左右。那里只有一个空白还是可以不同? – msrd0 2014-10-09 16:11:05

+0

是的。这是可能的。如果没有别的,您可以将搜索查询的字面值sql存储为文本,检索该文本并将其重新作为查询执行。 – 2014-10-09 16:11:58

+0

的JSON是没有排序,但是当我们创建一个user.'scopes =新的保存的搜索可能是“{‘品牌’:‘古奇’,‘price_lt’:100,‘色’:‘灰色’}”'那是目前如何看起来 – 2014-10-09 16:14:50

回答

0

简答:很难让它100%正确。

与其试图让算法适用于所有情况,如果实时性很重要,您可能会从减少搜索空间的过滤方法中获得显着益处。例如,如果您的品牌是Gucci,则可以将搜索范围缩小为拥有“品牌:gucci”或没有“品牌”的搜索。如果你将这个应用到一两个关键字段,你可能会发现你用蛮力检查了99%的搜索结果,这意味着你在1%的时间内完成了工作。实验会告诉哪些字段值得过滤。

但是,你的蛮力法是最简单的方法,并且考虑到它只对每个产品运行一次(永远),只要性能不是太差,性能就不那么重要。实时运行的要求似乎没有根据 - 它可以以批处理模式运行,因为恕我直言,用户在他们感兴趣的新产品即时获得的“需求”变得可用时,实际上并不需要。

事情可以做,以加快速度:

  • 分发处理到多个服务器/进程运行在平行
  • 运行搜索查询反对把在只读模式和/数据库的副本或锁定在独占模式下,所有相关表格,以减少数据库锁定开销,也把你的生产服务器
  • 使每个搜索运行速度更快消除负载通过增加AND PRODUCT_ID = x到重建的搜索
  • 批次的所有新产品并运行每个搜索只是一次检查所有的新产品在一气呵成(在这种情况下添加AND PRODUCT_ID IN (x, y, z, ...)到查询)

如果它让你感觉更好,我最近在一个非常大的销售网站和他们的工作使用暴力方法。它为他们工作 - 它也可以为你工作。

+0

谢谢。像Glasses这样的产品就是一个例子。在我的真实世界中,实时应用对于竞争来说是一个巨大的优势,因为实际应用这些工作几个小时才能发挥所有的作用。我可能最终会蛮横逼迫它。 Apprecaite关于加速的想法 – 2014-10-09 21:57:52

+0

好的我已经重新思考并编辑了我的答案。 – Bohemian 2014-10-09 22:13:28