2017-11-26 2 views
1

Ich habe ein Problem, das ich nicht sicher bin, wie man sich nähert.Erstellen Sie einen Algorithmus "Produkte, die Sie interessieren könnten" in SQL?

Ich habe eine einfache Datenbank, wo ich Produkte, Benutzer und Käufe von Produkten von Benutzern speichern. Jedes Produkt hat einen Namen, eine Kategorie und einen Preis.

Mein Ziel ist folgendes: Ich möchte eine Liste von 5 Elementen anzeigen, die als "Sie könnten daran interessiert sein" an den Benutzer. Das Hauptproblem ist, dass ich nicht nur LIKE% suchen möchte ..% für den Namen, aber ich möchte auch die Arten der Produkte berücksichtigen, die der Benutzer normalerweise kauft, die Preisspanne, in der er normalerweise kauft, und den Produkten Priorität gibt, die gekauft werden.

Ist solch ein Algorithmus realistisch? Ich kann mir einige Metriken vorstellen, wie das Gruppieren aller Kategorien in semantisch "ähnliche" Buckets und das Berechnen der Entfernung davon, aber ich bin mir nicht sicher, wie ich sie klassifizieren sollte, wenn es mehrere Kriterien gibt.

Vielleicht sollte ich jedem Kriterium einen Wichtigkeitsfaktor geben und das Ergebnis eine Multiplikation der Entfernung sein * der Faktor?

+0

Sind Sie auf einem bestimmten DBMS arbeiten? – Blag

+0

Es ist eigentlich für ein Frühjahr Daten + JPA-Projekt, aber das ist ein Durcheinander, also nehmen wir an, es ist MySql/MariaDB – dac1n

+0

Dies ist ein klassisches Data Science Typ Problem. – Paparazzi

Antwort

1

Sie können 2 zusätzliche Felder für jedes Produkt in Ihrer Datenbank erstellen. Im ersten Feld mit dem Namen Type könnte man zum Beispiel "RC" sagen und im zweiten Feld mit dem Namen "RC, Radio, Elektronik, Remote, Model". Dann kann man später in der Abfrage in SQL sagen, dass es ausgewählt werden soll Produkte, die zwischen Typ und ähnlichem passen. Dies stellt ein System bereit, das nicht nur auf den Produktnamen angewiesen ist, da dies täuschen kann. Es würde immer noch den LIKE-Befehl verwenden, aber es wäre viel genauer, da es von Ihnen vordefiniert ist, was andere Produkte zu diesem ähnlich sind.

Abhängig von der Größe Ihrer Datenbank glaube ich, dass dies die einfachste Option ist.

1

ich dies auf MySql für einige gewichtete Suche wurde unter Verwendung:

SELECT *, 
    IF(
     `libelle` LIKE :startSearch, 30, 
     IF(`libelle` LIKE :fullSearch, 20, 0) 
    ) 
    + IF(
     `description` LIKE :startSearch, 10, 
     IF(`description` LIKE :fullSearch, 5, 0) 
    ) 
    + IF(
     `keyword` LIKE :fullSearch, 1, 0 
    ) 
    AS `weight` 
FROM `t` 
WHERE (
    -- at least 1 match 
    `libelle` LIKE :fullSearch 
    OR `description` LIKE :fullSearch 
    OR `keyword` LIKE :fullSearch 
) 
ORDER BY 
     `weight` DESC 

/* 
'fullSearch'=>'%'.str_replace(' ', '_', trim($search)).'%', 
'startSearch'=>str_replace(' ', '_', trim($search)).'%', 
*/ 
Verwandte Themen