如何优化数据库搜索

时间:2013-12-18 11:43:09

标签: php sql database performance

我有以下问题。

我有一个数据库,例如1000件物品。每个项目可以包含任意数量的与之关联的标识标记。出于问题的目的,项目和标签纯粹是假设的。例如,假设其中一个项目是DVD,那么该项目的标签将是: DVD,The Lone Ranger,western,action,family

另一张DVD标有: DVD,The Magnificent 7,西部,动作

现在,我网站上有人在搜索框中搜索以下关键字,然后点击搜索: 西方,行动,家庭,PG13

两张DVD都至少匹配2个搜索词,而且没有一个匹配PG13。此外,第一张DVD的匹配最接近搜索字词。

搜索已开始,对于所有1000种商品,我必须搜索每个商品标签,以查看它们是否符合搜索条件。

所以对于第一张DVD,它匹配4个标签中的3个,而对于第二张DVD,它匹配4个标签中的2个。

我的问题是,如何优化此搜索?对于每个项目,查询会查看每个项目标记,然后将其与搜索项匹配。如果找不到与所有搜索字词匹配的项目,则必须“删除”其中一个搜索字词,并查看是否有任何项目与4个搜索字词的任意3种组合相匹配。

然后它会删除另一个搜索字词并搜索4个搜索字词中的2个,尝试匹配4个搜索字词的任意2个组合。

搜索术语的“下降”和搜索我需要优化的所有可能组合。有谁知道最好的算法是什么,或者任何人都可以为此提供伪代码?

我不知道这个因为我试图想到的每个场景我仍然必须搜索每个可能的搜索项组合,这会降低项目返回给客户的速度。

编辑:我已经考虑过为每个项目标签赋予一个权重,但问题是标签的性质使得没有标签比任何其他标签承载更多的重量。所有标签都具有相同的权重/重要性

可以查询数据库并重新调整结果的速度是我最大的目标。

1 个答案:

答案 0 :(得分:0)

作为一种方法,我将通过总结每个术语返回的计数来探索使用左连接作为搜索项与组。然后你会有类似的东西:

Title, Term, Count

作为结果集。将其放入一个Pivot查询,以搜索术语的值为基础,获取:

Title, Term1, Term1Count, Term2, Term2Count,.....

然后,您可以将其包装在查询中,以消除所有* Counts为零的查询,并以您想要的任何方式对其进行排序。 这不是建议作为解决方案,而是作为探索的途径。