PHP, MySQL, 高效的标签驱动搜索算法

标签 php mysql performance search tags

我目前正在建立一个网上商店。本店允许用户通过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/

    相关文章:

    mysql - 所选列会影响 MySQL 结果中的行顺序吗?

    mysql - 作业帮助(唯一约束)

    performance - x86 "cmp"指令的奇怪行为

    php - 选择准备好的语句

    php - 根据日期时间字段提取条目并按月和年组织

    mysql - 用于逗号分隔值的 REGEX mysql

    javascript - 有没有办法判断哪部分JS代码最耗电?

    javascript - 如何通过post方法将数据从ajax传递到laravel 5.2 Controller

    PHP 用主题字符串中的模式替换正则表达式

    c# - 使用 BinaryReader 读取大文件(>1 GB)时,最佳缓冲区大小是多少?