我遇到以下问题。如何优化数据库搜索
我有一个数据库,例如, 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个组合。
这是“删除”搜索条件和搜索我需要优化的所有可能的组合。有谁知道这是什么最好的算法,或者任何人都可以提供伪代码?
我不知道这一点,因为我试图想到的每个场景,我仍然必须搜索每个可能的搜索条件组合,同时减慢项目返回给客户的速度。
编辑:我想过给每个项目标签的重量,但问题是,标签的性质是这样的,没有标签比任何其他标签承载更多的重量。所有标签都具有相同的权重。
数据库可以被查询的速度和结果被重新调整是我最大的目标。
向我们展示查询和表格结构(带索引) –
您可以为要搜索的每个部分提供权重。就像'电影名称'比'流派'更重要。所以如果你找不到'Name + Genre'的任何东西,请放下流派。现在,这是标识符的丢弃...对于实际的查询......只是查询用户给出的每个可能的参数。如果您没有任何匹配项,请执行相同的查询,但删除最弱的参数。依然没有?删除另一个参数并再次查询相同的查询。这种情况下,你只需要查询n次,其中n =参数的数量。最后哪个并不是很糟糕。 – Viridis
(在你的例子中:最坏的情况= 4个查询)。最好的情况下,第一个查询立即返回'想要'的项目数组。 (你可能想使用之前验证或验证...取决于你在做什么) – Viridis