0

Je crée un site de commerce électronique qui nécessite un outil de recherche à facettes afin que les clients puissent affiner la recherche de produits par catégories et classifications dans le même style que ebuyer.com et Newegg.com (Voir les menus à gauche) . J'ai tout d'abord plongé directement dans la conception d'une base de données qui ressemblait à une structure EAV (je ne savais pas ce que c'était à l'époque), cela semblait idéal pour créer des catégories illimitées, des sous-catégories et d'autres classifications de produits (couleur, taille, destinataire) que les clients pourraient utiliser pour trouver des produits spécifiques. Cependant, lorsque j'ai commencé à essayer de créer des requêtes SQL en utilisant les conditions AND, j'ai réalisé que les requêtes simples normales devenaient beaucoup plus longues et complexes à écrire. Après avoir passé quelques heures à lire divers articles sur SO et des articles sur Google, je me suis rendu compte du cauchemar qui se présenterait si je continuais avec cette méthode.Structure de base de données pour une recherche à facettes

Question

Comment ont des sites tels que ebuyer.com et Newegg.com conçu leur recherche par facettes? Est-ce que j'ai manqué une méthode alternative ou est-ce qu'ils ont simplement pris une longueur d'avance avec une structure EAV? Je cherche à éviter les solutions d'entreprise comme Lucene/Solr.

Répondre

1

Eh bien, pourquoi appelez-vous Lucene/Solr entreprise sage solution ... semble répondre parfaitement à vos besoins à mon avis.

2

Je ne sais pas comment ils le font, mais vous pouvez y parvenir en faisant:

CREATE TABLE product_facets (
    product_id INTEGER NOT NULL, 
    facet VARCHAR(100) NOT NULL, 
    facet_value varchar(255) NOT NULL, 
    PRIMARY KEY (product_id,facet,facet_value), 
    KEY (facet,facet_value) 
); 

INSERT INTO product_facets VALUES (1, 'COLOR', 'Red'); 
INSERT INTO product_facets VALUES (1, 'PRICE_RANGE', 'Less than 200'); 

INSERT INTO product_facets VALUES (2, 'COLOR', 'Green'); 
INSERT INTO product_facets VALUES (2, 'PRICE_RANGE', 'From $200 to $500'); 

INSERT INTO product_facets VALUES (2, 'COLOR', 'Blue'); 
INSERT INTO product_facets VALUES (3, 'PRICE_RANGE', 'More than $1000'); 

SELECT facet, facet_value, count(*) 
FROM product_facets f 
INNER JOIN products p ON p.product_id = f.product_id 
GROUP BY facet, facet_value; 

facette ne doit pas être VARCHAR. Cela peut être un INTEGER simple car votre application sait ce que cela signifie.

0

Je pense que vous mélangez différents concepts (ce qui peut à son tour rendre plus difficile la recherche d'une solution).

La recherche facettée signifie fondamentalement en filtrant par une qualité spécifique du "produit". Cette qualité ou propriété peut être une catégorie dans laquelle elle se trouve, ou peut-être quelque chose d'autre.

Vous pourriez avoir une recherche par facettes des utilisateurs où vous filtrez par leur âge, par exemple

[ User ] 
| name char | 
| age int | 

Comment régler Solr (ou Sphinx) pour obtenir le résultat final peut varier, mais il n'a pas d'influence dans votre modèle de données.

Je commencerais par conceptualiser/modéliser ce que vous essayez de représenter/stocker dans la base de données. Comment vous l'affichez ou recherchez-le plus tard.

Sans plus de détails, votre question sur la façon dont les autres sites designed their faceted search est trop large, et en même temps très simple: vous avez juste besoin de générer les différentes facettes en fonction des différentes propriétés des produits; mais vous semblez vouloir aussi savoir comment ils ont modélisé leur base de données pour stocker l'information.

Questions connexes