は、私は、PostgreSQLのテーブル含むいくつかの車百万レコードを持っている:postgresqlでマルチカラム推奨エンジンを作成するには?
+----+--------+------+---------+-----------+-------------+------------+------------+
| 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
の検索を実行すると、検索結果の外に、他の車との類似度は低いが、すべての検索条件に一致するとは限りません。あなたは「ルノークリオ」で検索する場合は
- たちは、その後'Renault Twingo'が近い一致すぎ
- 場合は次のとおりです。のような何かをする
私はルビーでは、いくつかのルールベースのコードを作成しようとしています、どこで、順序句によるとあなたは、このコードに基づいて、などなどその
- に最も近いものを順
を8000の最大価格を持って、私は、SQLクエリを生成します。
しかし問題は、私が20の異なる列を任意に考慮したい、最初の基準に基づいているためです。また、私は単純なフィルタリング(WHERE
)クエリを実行したくないという意味で、推奨が下位互換性があることを望んでいます。代わりに、テキスト類似性アルゴリズムを使用するときと似たようなことをしたい。そこでは、あるフレーズをすべてと比較し、それらのすべての比較スコアを取得して並べ替えることができる。
私はこれを実装する方法について非常に困惑しています。これは、1000のルールとif/thenステートメントをSQLクエリを生成するために定義していないアプローチです。私が使うことができる他のテクニック、あるいはpostgresql以外の技術がありますか?
これはStackOverflowの問題を解決するにはあまりにも難しい(と不明)と思います。 SQLは通常、完全一致を行うのが得意ですが、特定の車種のようなものを検索することは、その核となる機能を超えています。私は(比較的)シンプルな "おおよその"名前の一致を実装しなければなりませんでした。*多少予測可能なクエリ結果(および速度)を持つことができるようにするために、特殊目的インデックスを作成しました。私はあなたが小さいから始まり、そこから成長しなければならないのではないかと心配しています。 – Patru