0

我目前正在努力解决一个复杂的 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:轮到你了!感谢您的思想和时间。

4

2 回答 2

0

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

{_id:ValueOfTheProperty, Property:TypeOfProperty}

以下是一些可能的示例:

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

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

{ Color: Red, Category: Boots }

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

于 2013-01-25T10:27:43.697 回答
0

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

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

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