草庐IT

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

coder 2023-06-12 原文

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

    有关PHP, MySQL, 高效的标签驱动搜索算法的更多相关文章

    1. ruby - 在院子里用@param 标签警告 - 2

      我试图使用yard记录一些Ruby代码,尽管我所做的正是所描述的here或here#@param[Integer]thenumberoftrials(>=0)#@param[Float]successprobabilityineachtrialdefinitialize(n,p)#initialize...end虽然我仍然得到这个奇怪的错误@paramtaghasunknownparametername:the@paramtaghasunknownparametername:success然后生成的html看起来很奇怪。我称yard为:$yarddoc-mmarkdown我做错了什么?

    2. ruby-on-rails - Nokogiri:使用 XPath 搜索 <div> - 2

      我使用Nokogiri(Rubygem)css搜索寻找某些在我的html里面。看起来Nokogiri的css搜索不喜欢正则表达式。我想切换到Nokogiri的xpath搜索,因为这似乎支持搜索字符串中的正则表达式。如何在xpath搜索中实现下面提到的(伪)css搜索?require'rubygems'require'nokogiri'value=Nokogiri::HTML.parse(ABBlaCD3"HTML_END#my_blockisgivenmy_bl="1"#my_eqcorrespondstothisregexmy_eq="\/[0-9]+\/"#FIXMEThefoll

    3. css - 用 watir 检查标签类? - 2

      我有一个div,它根据表单是否正确提交而改变。我想知道是否可以检查类的特定元素?开始元素看起来像这样。如果输入不正确,添加错误类。 最佳答案 试试这个:browser.div(:id=>"myerrortest").class_name更多信息:http://watir.github.com/watir-webdriver/doc/Watir/HTMLElement.html#class_name-instance_method另一种选择是只查看具有您期望的类的div是否存在browser.div((:id=>"myerrortes

    4. ruby-on-rails - 如何在 Ruby on Rails 中实现由 JSF 2.0 (Primefaces) 驱动的 UI 魔法 - 2

      按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。问题1)我想知道ruby​​onrails是否有功能类似于primefaces的gem。我问的原因是如果您使用primefaces(http://www.primefaces.org/showcase-labs/ui/home.jsf),开发人员无需担心javascript或jquery的东西。据我所知,JSF是一个规范,基于规范的各种可用实现,prim

    5. 区块链之加解密算法&数字证书 - 2

      目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非

    6. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

      本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

    7. 使用canal同步MySQL数据到ES - 2

      文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

    8. python - 是否可以使用 Ruby 或 Python 禁用 anchor /引用来发出有效的 YAML? - 2

      是否可以在PyYAML或Ruby的Psych引擎中禁用创建anchor和引用(并有效地显式列出冗余数据)?也许我在网上搜索时遗漏了一些东西,但在Psych中似乎没有太多可用的选项,而且我也无法确定PyYAML是否允许这样做.基本原理是我必须序列化一些数据并将其以可读的形式传递给一个不是真正的技术同事进行手动验证。有些数据是多余的,但我需要以最明确的方式列出它们以提高可读性(anchor和引用是提高效率的好概念,但不是人类可读性)。Ruby和Python是我选择的工具,但如果有其他一些相当简单的方法来“展开”YAML文档,它可能就可以了。 最佳答案

    9. ruby - 如何搜索有用的 ruby - 2

      寻找有用的ruby的好网站是什么? 最佳答案 AgileWebDevelopment列出插件(虽然不是ruby​​gems,我不确定为什么),并允许人们对它们进行评级。RubyToolbox按类别列出gem并比较它们的受欢迎程度。Rubygems有一个搜索框。StackOverflow对最有用的rails插件和ruby​​gems有疑问。 关于ruby-如何搜索有用的ruby,我们在StackOverflow上找到一个类似的问题: https://stacko

    10. ruby-on-rails - 在 Rails 中更高效地查找或创建多条记录 - 2

      我有一个应用需要发送用户事件邀请。当用户邀请friend(用户)参加事件时,如果尚不存在将用户连接到该事件的新记录,则会创建该记录。我的模型由用户、事件和events_user组成。classEventdefinvite(user_id,*args)user_id.eachdo|u|e=EventsUser.find_or_create_by_event_id_and_user_id(self.id,u)e.save!endendend用法Event.first.invite([1,2,3])我不认为以上是完成我的任务的最有效方法。我设想了一种方法,例如Model.find_or_cr

    随机推荐