【问题标题】:How to do car search like autoscout24.de with / without SQL?如何使用/不使用 SQL 进行汽车搜索(如 autoscout24.de)?
【发布时间】:2012-03-02 21:06:44
【问题描述】:

我对 autoscout24.de 中搜索引擎的实现很感兴趣。这是一个您可以出售/购买汽车的平台。每个汽车广告都有可供搜索的属性:品牌、价格、公里数、颜色等(总共超过 50 种不同的属性)。

我对像这样工作的详细搜索特别感兴趣:每个可能的属性都显示在页面上。如果选择了该属性,则每个属性后面的括号中会显示与新搜索匹配的汽车数量。

示例:我将从空搜索条件开始。

物业品牌:

  • 宝马 (100.000)
  • 大众汽车 (200.000)
  • 福特 (150.000)
  • ...

属性颜色:

  • 黑色 (210.000)
  • 银 (50.000)
  • 白色 (100.000)
  • ...

其他属性以此类推。

我想知道:

  • 您将如何使用 SQL 实现这种搜索?
  • 您将如何使用内存数据结构来实现它?
  • 还应支持范围查询(价格从 X 到 Y 的所有汽车)

更新:

括号中的数字显示添加搜索条件后的结果数量。所以每次添加/删除属性时它都会改变......

所以一个简单的算法会像这样工作:

  • 找到所有符合当前搜索条件的汽车(例如制造福特)
  • 对于每个属性,请执行以下操作:查找与先前搜索条件(“福特”)和所选属性的搜索条件相匹配的所有汽车。将计数写在属性后面的括号中。

这个算法很幼稚,因为它会执行 1 + N 个查询 (N=#properties)。没有人愿意这样做;-)

【问题讨论】:

  • 您可以访问本网站的数据库吗?如果没有,您是否打算从网站上刮掉那 大量 的数据?他们提供 API 吗?这是一个假设性问题吗?
  • @elusive:我无权访问该网站的数据库。而且我不想抓取数据。我想建立一个类似的数据库,但数据不同(没有汽车)。

标签: sql database-design data-structures


【解决方案1】:

我相信这被称为“faceted search”。 Apache Solr 项目可能值得一看。

【讨论】:

    【解决方案2】:

    这是一个基本的代码

    • 为汽车的每个属性创建一个带有一个计数器的结果对象
    • 一一检查所有汽车,如果汽车与过滤器匹配,则为每个数字加一

    ...但它的爆炸速度很快!

    我认为他们在多台计算机上执行此操作,在它们之间共享数据。每台计算机计算 5% 的数据,并将结果发送到前端计算机,并将所有计数相加。

    有一些工具:寻找“map reduce”、“elastic search”、“strom”...

    【讨论】:

      【解决方案3】:

      有一个属性表:

      +属性

      • 身份证
      • 标题
      • 价值
      • 计数

      count 字段允许您“赚取”额外的查询,因此无需检查有多少汽车具有特定属性,您可以在添加新车时更新此字段。

      此表中的行示例:

      1 '颜色' '白色' 1000

      2 '彩色' '黑色' 122

      3 'km' '5000' 1233

      4 '公里' '30000' 54

      对于汽车表,为每个属性添加一个字段。

      +汽车

      • 身份证
      • 颜色
      • 公里

      color 和 km 字段将保存属性表中属性行的 ID。

      编辑:如果您不打算使用 mysql db ,您可以考虑使用 XML 文件来包含属性数据。但同样,您应该在添加/删除或更新汽车时更新其 count 值。

      <Properties>
       <Property>
        <Type>Color</Type>
        <Value>White</Value>
        <Count>1000</Count>
       </Property>
      </Properties>
      

      【讨论】:

      • 我添加了一个“更新”部分。查询非常动态。如果添加一个属性(AND 运算符),所有计数都会更改。您将如何有效地查询?
      • update 仅当您添加/更新/删除汽车时。将其与人们进入属性页面的次数进行比较,您将必须获取所有属性中的COUNT
      猜你喜欢
      • 2016-11-04
      • 2018-09-14
      • 1970-01-01
      • 2011-12-05
      • 1970-01-01
      • 2016-05-31
      • 2014-08-27
      • 2016-03-28
      • 1970-01-01
      相关资源
      最近更新 更多