2013-12-18 84 views
0

我遇到以下问题。如何优化数据库搜索

我有一个数据库,例如, 1000个项目。每个项目可以有任何数量的与之相关的识别标签。出于问题的目的,该项目和标签纯粹是假设的。例如,说一个项目是DVD,那么该项目的标签将是: DVD,独行侠,西部,行动,家庭

另一个DVD被标记为: DVD,The Magnificent 7,西部,动作

现在我的网站上搜索在搜索框中键入以下关键词,用户点击搜索: 西部,动作,家庭,PG13

两个DVD的比赛中至少2个搜索词,而且没有一个与PG13相匹配。第一张DVD的比赛也是最接近搜索条件的。

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

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

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

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

这是“删除”搜索条件和搜索我需要优化的所有可能的组合。有谁知道这是什么最好的算法,或者任何人都可以提供伪代码?

我不知道这一点,因为我试图想到的每个场景,我仍然必须搜索每个可能的搜索条件组合,同时减慢项目返回给客户的速度。

编辑:我想过给每个项目标签的重量,但问题是,标签的性质是这样的,没有标签比任何其他标签承载更多的重量。所有标签都具有相同的权重。

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

+0

向我们展示查询和表格结构(带索引) –

+0

您可以为要搜索的每个部分提供权重。就像'电影名称'比'流派'更重要。所以如果你找不到'Name + Genre'的任何东西,请放下流派。现在,这是标识符的丢弃...对于实际的查询......只是查询用户给出的每个可能的参数。如果您没有任何匹配项,请执行相同的查询,但删除最弱的参数。依然没有?删除另一个参数并再次查询相同的查询。这种情况下,你只需要查询n次,其中n =参数的数量。最后哪个并不是很糟糕。 – Viridis

+0

(在你的例子中:最坏的情况= 4个查询)。最好的情况下,第一个查询立即返回'想要'的项目数组。 (你可能想使用之前验证或验证...取决于你在做什么) – Viridis

回答

0

作为一种方法,我将通过总结每个术语返回的计数来探索对群组中的搜索项使用左连接。你会有这样的:

Title, Term, Count 

作为结果集。将这个插入搜索项的值数据透视查询旋转获得:

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

然后,您可以换行了一个查询,消除那些所有的*计数为零,并以任何方式排序,你要。 这不是建议作为解决方案,而是作为探索的途径。