【问题标题】:Complex URL handling conception复杂的 URL 处理概念
【发布时间】:2013-01-25 09:46:17
【问题描述】:

我目前正在处理一个复杂的 URL 处理概念问题。该应用程序有一个产品属性数据库表/集合,其中包含所有不同的产品类型(即类别、颜色、制造商、材料等)。

{_id:1,alias:"mercedes-benz",type:"brand"},
{_id:2,alias:"suv-cars",type:"category"},
{_id:3,alias:"cars",type:"category"},
{_‌​id:4,alias:"toyota",type:"manufacturer"},
{_id:5,alias:"red",type:"color"},
{_id:6,alias:"yellow",type:"color"},
{_id:7,alias:"bmw",type:"manufacturer"},
{_id:8,alias:"leather",type:"material"}
...

现在的任务是按照每个(!)可能的顺序处理以下样式的 URL 请求,以检索包含的产品属性。唯一允许的字符是破折号(已解决的 SEO 要求,某些属性也可以自己包含破折号 - 我认为也是一个重要的点 - 即类别“suv-cars”或制造商“mercedes-benz” "):

http:\\www.example.com\{category}-{color}-{manufacturer}-{material}
http:\\www.example.com\{color}-{manufacturer}
http:\\www.example.com\{color}-{category}-{material}-{manufacturer}
http:\\www.example.com\{category}-{color}-nonexistingproperty-{manufacturer}
http:\\www.example.com\{color}-{category}-{manufacturer}
http:\\www.example.com\{manufacturer}
http:\\www.example.com\{manufacturer}-{category}-{color}-{material}
http:\\www.example.com\{category}
http:\\www.example.com\{manufacturer}-nonexistingproperty-{category}-{color}-{material}
http:\\www.example.com\{color}-crap-{manufacturer}
...

...所以:每个顺序的属性都应该被允许!结果必须是有关每个 URL 请求所用属性的信息(顺便说一句,是的,重复的内容将通过重定向和预定义的模式来修复)。 “不存在的属性”/“废话”是可能的,应该被忽略。

更新:

想法 1: 我考虑这个问题的一种方法是用破折号分割查询字符串并按值分析它们,问题是:在两个或三个或更多单词组合处有些属性有太多不同的组合和变化,所以我认为大量的查询扼杀了这个想法..

想法 2: 另一种方法是使用所有不同的组合构建一个(在我看来)太大的 Alias/URL-Table,但我认为这只是一个丑陋的解决方法。大约有 15.000 个不同的属性,因此不同排序顺序中的别名计数正在扼杀这个想法。

想法 3: 轮到你了!感谢您的用心和时间。

【问题讨论】:

    标签: mongodb url alias fuzzy bigdata


    【解决方案1】:

    虽然您的问题有点宽泛,但以下是一些想法。除非您找到完全按照您想要的方式工作的免费或商业引擎,否则没有一个很棒的答案。

    我考虑您的问题的方式是将 URL 视为关键字列表。

    • 使用 Lucene 作为关键字/标签系统。 good 是您建议的搜索类型,包括短语、词干等。
    • 在选择的数据库中存储和索引数据,但将关键字拉入内存并建立所有关键字与项目的位索引。遍历关键字表产生加权结果。如果关键字的顺序很重要,您还需要通过结果集来根据词序进行权重。这些类型的搜索总是需要快速限制其结果集,以便快速返回结果。
    • 缓存来自工作匹配的疯狂结果,并优先考虑用户似乎在给定 URL 中点击最多的结果。
    • 在MongoDB中使用tag索引攻击数据库。您仍然需要合并和加权结果。非常密集,不太可能很好地利用数据库资源。
    • 阅读一些关于关键词搜索的学术论文。这是一个流行的话题。
    • 构建一个包含破折号的单词表,并在运行查询之前对其进行规范化/转换
    • 始终首先检查完全完全匹配

    【讨论】:

    • 感谢您提供有趣的方法!我完全同意这个问题没有开箱即用的解决方案:) 目前我们使用 MongoDB 作为数据库,使用 Elasticsearch 进行搜索……你能告诉我更多详细信息,你将如何构建 Lucene/ES索引或 MongoDB 集合主要以获得正确加权的结果?挑战在于为每个 URL 获得每种类型的产品属性的最佳单一结果,对吗?这意味着 MongoDB 中的聚合查询或 Elasticsearch 中的构面搜索,对吧?
    • 对于 MongoDB 中的权重,我认为最好的方法是对第一次通过可能候选的文档进行第二次遍历。然后你需要根据序列进行加权。 (同样,我不确定 MongoDB 是否适合这项工作)。对于 Lucene,只要对标记和字段进行正确索引,我希望它在单词顺序正确(完全匹配)而不是正确单词、不同顺序时返回合理的加权搜索响应。我对 ES 的经验为零。是的,这可能是一个方面搜索(来自对文档的快速扫描)。
    • 非常感谢您的快速回复!我认为搜索技术将是该场景的最佳选择,您在这一点上是对的.. 谢谢!所以我认为解决方案可能是具有不同类型和别名的产品属性 Lucene/Elasticsearch 索引。你知道如何查询 Lucene 并只获得每种类型一个最佳匹配项,即您获得最佳匹配制造商、最佳匹配类别、最佳匹配颜色等对于特定的查询 URL?如果您限制为 5 个结果,您可能只能获得 5 个最佳匹配颜色?
    • (此时我想在 StackOverflow 上提出一个新问题……这是个好问题!)
    • 我刚刚在这里提出了一个新问题:stackoverflow.com/questions/14523222/… - 感谢您的支持!
    【解决方案2】:

    如果您将所有属性值限制为唯一值,这可能是唯一可行的方法。因此,您制作了一组类别+颜色+制造商等。所有值都必须是唯一的。这将允许您找到该值所属的属性。 其数据结构应该相当简单:

    {_id:ValueOfTheProperty, Property:TypeOfProperty}
    

    以下是一些可能的示例:

    { _id: Red, Property: Color }
    { _id: Green, Property: Color }
    { _id: Boots, Property: Category }
    { _id: Shoes, Property: Category }
    ...
    

    这样,顺序无关紧要,您可以一次将它们转换为地图:

    { Color: Red, Category: Boots }
    

    不过,我预测这里的名称模棱两可会有一些问题。

    【讨论】:

    • 感谢您的回复弗拉基米尔! “您制作一组类别+颜色+制造商”到底是什么意思?如何拆分 URL 请求中的条款?如何处理这两个单词组合?如何处理不同的排序顺序?数据库产品属性表/集合如下所示:{_id:1,alias:"mercedes-benz",type:"brand"}, {_id:2,alias:"suv-cars",type:"category"},{_id:3,alias:"cars",type:"category"},{_id:4,alias:"toyota",type:"manufacturer"},{_id:5,alias:"red",type:"color"} 最后,我需要通过 URL 匹配产品属性的 id 和类型。
    • 只是用破折号分割。然后通过 id 查找值。我使用 _id 来存储值,以证明值在所有属性类型中必须是唯一的。而且你没有提到任何关于排序的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多