我目前正在建立一个网上商店。本店允许用户通过category
筛选商品,以及几个可选的附加过滤器,例如 brand
, color
, 等等。
目前,各种属性存储在不同的地方,但我想切换到基于标签的系统。理想情况下,我的数据库应该存储带有以下数据的标签:
product_id
tag_url_alias
(独特)tag_type
(唯一)(类别、产品品牌、产品颜色等)tag_value
(非唯一)第一个目标
我要搜索
product_id
与任何地方相关联的 's 1-5 个特定标签之间 .这些标签是从一个 SEO 友好的 url 中提取的。所以我将为每个标签检索一个唯一的字符串( tag_url_alias
),但我不知道 tag_type
.搜索将是 路口 ,所以我的搜索应该返回
product_id
的匹配 全部 提供的 tags
.第二个目标
除了显示与当前过滤器匹配的产品外,我还想显示用户可能提供的其他类别和过滤器的产品计数。
例如,我当前搜索的是与标签匹配的产品:
Shoe + Black + Adidas
现在,商店的访客可能正在查看最终产品,并想知道其他品牌必须提供哪些黑色鞋子。因此,他们可能会转到“品牌”过滤器,并选择任何其他列出的品牌。假设他们有 2 个不同的选项(实际上,这可能会有更多),导致以下搜索:
Shoe + Black + Nike > 103 results
Shoe + Black + K-swiss > 0 results
在这种情况下,如果他们在过滤器中看到品牌“K-swiss”列为可用选择,则他们的搜索将返回 0 个结果。
这对用户来说显然是相当令人失望的......我更愿意知道将“品牌”从“adidas”切换到“k-swiss”将得到 0 个结果,只需从过滤器中删除整个选项。
类别、颜色等也是如此。
实际上,这意味着单个页面 View 不仅会返回我的主要目标中描述的过滤产品列表,而且可能会返回数百个相似但不同的列表。每个过滤器值都有一个,可以替换另一个过滤器值,或添加到现有过滤器值。
容量
我怀疑我的数据库最终将包含:
between 250 and 1.000 unique tags
它将包含:
between 10.000 and 100.000 unique products
当前的想法
我做了一些谷歌搜索,发现了以下文章:http://www.pui.ch/phred/archives/2005/06/tagsystems-performance-tests.html
从那篇文章来看,运行数百个查询来实现第二个目标,将是一条非常缓慢的路线。 “有毒”示例可能适合我的需求,对于我的第一个目标来说可能是可以接受的,但对于第二个目标来说它会慢得令人无法接受。
我想我可能会运行匹配 1
tag
的单个查询与其关联 product_id
的,缓存这些查询,然后计算结果的交集。但是,我是否在 MySQL 中计算这些交集?还是在 PHP 中?如果我使用 MySQL,是否有一种特殊的方式可以缓存这些单独的查询,或者是否提供了我需要的所有正确索引?我想甚至可以缓存其中两个
tag
之间的交集也是很有可能的。/product_id
套。交叉点的数量将受到以下事实的限制:tag_type
可以只有一个特定的值,但我不确定如何有效地管理这种类型的缓存。同样,我不知道我是否应该在 MySQL 或 PHP 中执行此操作。如果我在 MySQL 中执行此操作,那么存储和组合此类缓存结果的最佳方法是什么?
最佳答案
使用 sphinx search engine可以为你创造这个魔法。它非常快,甚至可以处理文字形式,这对 SEO 请求很有用。
就sphinx而言,制作一个文档-“产品”,按标签索引,选择合适的查询排名(例如,MATCH_ALL_WORDS)并使用不同的标签组合运行批处理请求以获得最佳结果。
不要忘记使用像 memcahed 或任何其他缓存器。
关于PHP, MySQL, 高效的标签驱动搜索算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12897817/