【发布时间】:2017-04-11 08:31:15
【问题描述】:
我在 postgresql 中有一个表,其中包含一些汽车 +1000000 条记录:
+----+--------+------+---------+-----------+-------------+------------+------------+
| id | price | year | mileage | fuel_type | body_type | brand | model |
+----+--------+------+---------+-----------+-------------+------------+------------+
| 1 | 4894 | 2011 | 121842 | "Benzin" | "Sedan" | "Toyota" | "Yaris" |
| 2 | 4989 | 2012 | 33901 | "Benzin" | "Hatchback" | "Renault" | "Twingo" |
| 3 | 4990 | 2013 | 55105 | "Benzin" | "Hatchback" | "Renault" | "Twingo" |
| 3 | 5290 | 2013 | 20967 | "Benzin" | "Hatchback" | "Renault" | "Twingo" |
| 5 | 5594 | 2008 | 121281 | "Benzin" | "Hatchback" | "Mercedes" | "A170" |
| 6 | 4690 | 2012 | 71303 | "Benzin" | "Hatchback" | "Renault" | "Twingo" |
| 7 | 5290 | 2013 | 58300 | "Benzin" | "Hatchback" | "Renault" | "Twingo" |
| 8 | 5890 | 2013 | 35732 | "Benzin" | "Hatchback" | "Renault" | "Twingo" |
| 9 | 5990 | 2013 | 38777 | "Benzin" | "Hatchback" | "Renault" | "Twingo" |
| 10 | 6180 | 2013 | 69491 | "Benzin" | "Hatchback" | "VW" | "up!" |
| 11 | 6490 | 2012 | 72900 | "Benzin" | "Sedan" | "Renault" | "Clio III" |
| 12 | 6790 | 2012 | 49541 | "Benzin" | "Hatchback" | "Renault" | "Clio III" |
| 13 | 6790 | 2012 | 46377 | "Benzin" | "Hatchback" | "Renault" | "Clio III" |
| 14 | 6790 | 2012 | 45200 | "Benzin" | "Hatchback" | "Renault" | "Clio III" |
| 15 | 6894 | 2007 | 108840 | "Benzin" | "Sedan" | "VW" | "Golf V" |
| 16 | 6990 | 2009 | 54200 | "Benzin" | "Sedan" | "Renault" | "Mégane" |
| 17 | 6990 | 2012 | 40652 | "Benzin" | "Hatchback" | "Renault" | "Clio III" |
| 18 | 6990 | 2012 | 38080 | "Benzin" | "Sedan" | "Renault" | "Clio III" |
| 19 | 7290 | 2012 | 28600 | "Benzin" | "Hatchback" | "Renault" | "Clio III" |
| 20 | 7290 | 2013 | 52800 | "Benzin" | "Hatchback" | "Renault" | "Twingo" |
+----+--------+------+---------+-----------+-------------+------------+------------+
我想创建一个推荐引擎,它可以根据一些不同的标准返回 20 个最“相似”的匹配项,例如当用户搜索:brand = 'Renault' AND price < 60000 AND year > 2010 时,我想在搜索结果之外显示其他一些更松散的结果,与其他汽车相似,但不一定完全符合所有搜索条件。
我曾尝试在 ruby 中编写一些基于规则的代码,类似于:
- 如果您搜索“雷诺 Clio”,那么“雷诺 Twingo”也很接近
- 如果您的最高价格为 8000,请按最接近的价格订购
- 等。等
基于这段代码,我生成了一个带有 where 和 order by 子句的 SQL 查询。
但问题是,事情变得非常庞大,因为我有 20 个不同的列,我想根据初始标准选择性地考虑这些列。此外,我希望建议是向后兼容的,因为我不想只做一个简单的过滤 (WHERE) 查询,以防万一最终返回零匹配。相反,我希望它做一些类似于使用文本相似性算法时的事情,您可以将一个短语与所有短语进行比较,并获得所有短语的比较分数,然后您可以对其进行排序。
我对如何实现这一点感到非常困惑,在一种方法中,这不是定义 1000 条规则和 if/then 语句来生成 SQL 查询。有没有我可以使用的其他技术,或者除了 postgresql 之外的其他技术?
【问题讨论】:
-
恐怕这在 StackOverflow 问题中解决起来太难(而且不清楚)。 SQL 通常擅长进行精确匹配,但搜索“类似”特定汽车型号的内容远远超出了它的核心功能。我必须实现一个(比较)简单的“近似”名称匹配,并且最终在触发器中生成了一个特殊用途的索引,以便能够获得有点可预测的查询结果(和速度)。恐怕您将不得不从小处着手并从那里成长。
标签: ruby postgresql recommendation-engine