Rub*_*ken 11 php mysql tags performance search
我现在正在建立一个网上商店.这家商店允许用户过滤由产品category,和几个可选的,额外的过滤器,例如brand,color等等.
目前,各种属性存储在不同的地方,但我想切换到基于标签的系统.理想情况下,我的数据库应该使用以下数据存储标记:
product_id tag_url_alias (独特)tag_type (独特的)(category,product_brand,product_color等)tag_value (不是唯一的)我想搜索product_id与1-5个特定标签之间的任何地方相关联的.标签是从SEO友好的网址中提取的.所以我将为tag_url_alias每个标签检索一个唯一的字符串(),但我不知道tag_type.搜索将是一个交集,所以我的搜索应该返回product_id匹配所有提供的tags.
除了显示与当前过滤器匹配的产品外,我还想显示用户可能提供的其他类别和过滤器的产品数量.
例如,我当前的搜索是针对与标签匹配的产品:
Shoe + Black + Adidas
Run Code Online (Sandbox Code Playgroud)
现在,商店的参观者可能会看到最终产品,并想知道其他品牌提供哪些黑鞋.因此,他们可能会去"品牌"过滤器,并选择任何其他列出的品牌.让我们说他们有两种不同的选择(实际上,这可能会有更多),导致以下搜索:
Shoe + Black + Nike > 103 results
Shoe + Black + K-swiss > 0 results
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如果他们在其过滤器中看到品牌"K-swiss"被列为可用选择,他们的搜索将返回0结果.
对于用户而言,这显然是相当令人失望的...我非常宁愿知道将"品牌"从"adidas"切换到"k-swiss"将会得到0结果,并且只需从过滤器中删除整个选项.
类别,颜色等也是如此.
在实践中,这意味着单个页面视图不仅会返回我的主要目标中描述的过滤产品列表,还可能返回数百个类似但不同的列表.每个过滤器值可以替换另一个过滤器值,或者添加到现有过滤器值.
我怀疑我的数据库最终会包含:
250到1.000个唯一标签
它将包含:
10.000至100.000个独特产品
我做了一些谷歌搜索,发现了以下文章:http://www.pui.ch/phred/archives/2005/06/tagsystems-performance-tests.html
从该文章来看,运行数百个查询来实现第二个目标,将是一条非常缓慢的路线."toxy"示例可能适用于我的需要,它可能是我的第一个目标可以接受的,但对于第二个目标来说这将是无法接受的.
我想我可能会运行tag与其关联product_id的1匹配的单个查询,缓存这些查询,然后计算结果的交叉点.但是,我在MySQL中计算这些交叉点吗?还是用PHP?如果我使用MySQL,是否有一种特殊的方法我应该缓存这些单独的查询,或者提供我需要的所有正确的索引?
我想也很可能甚至可以缓存其中两个tag/ product_id集之间的交叉点.交叉点的数量将受到a tag_type只能有一个特定值的事实的限制,但我不确定如何有效地管理这种类型的缓存.同样,我不知道我是否应该在MySQL或PHP中这样做.如果我在MySQL中这样做,那么存储和组合这种类型的缓存结果的最佳方法是什么?
小智 3
使用sphinx 搜索引擎可以为您带来这种魔力。它的速度非常快,甚至可以处理单词形式,这对 SEO 请求很有用。
就sphinx而言,制作一个文档 - “产品”,按标签索引,为查询选择适当的排序器(例如,MATCH_ALL_WORDS)并使用不同的标签组合运行批量请求以获得最佳结果。不要忘记使用 memcahed 或任何其他缓存器。