2012-10-15 12 views
11

Jestem kuriozalny budując sklep internetowy. Ten sklep pozwala użytkownikom filtrować produkty category, a kilka opcjonalne, dodatkowe filtry takie jak brand, color itpPHP, MySQL, efektywny algorytm wyszukiwania oparty na tagach.

Obecnie różne właściwości są przechowywane w różnych miejscach, ale chciałbym, aby przełączyć się na system oparty na tagach. Idealnie, moja baza danych powinna przechowywać tagi z następującymi danymi:

  • product_id
  • tag_url_alias (unikalne)
  • tag_type (unikalny) (kategoria, product_brand, product_color, etc.)
  • tag_value (nie wyjątkowa)

Pierwszy cel

Chcę wyszukać product_id, które są powiązane z dowolnym miejscem między 1-5 znacznikami specjalnymi. Tagi są pobierane z przyjaznego SEO adresu URL. Będę więc pobierać unikalne ciągi znaków (tag_url_alias) dla każdego tagu, ale nie będę znać tag_type. Wyszukiwanie będzie skrzyżowanie, więc moje poszukiwania powinny powrócić do „S product_id które odpowiadają wszystkie dostarczonego tags.

Drugi cel

Oprócz wyświetlania produktów, które odpowiadają aktualnej filtr, chciałbym również, aby wyświetlić produktów odliczanie do innych kategorii i filtrów, które mogą dostarczać użytkownikowi.

Na przykład, mój obecny wyszukiwania jest dla produktów pasujących tagi:

Shoe + Black + Adidas 

Teraz użytkownik sklepu może być patrząc na otrzymanych produktów i zastanawiam się który czarne buty inne marki mają do zaoferowania. Mogą więc przejść do filtra "marki" i wybrać dowolną z pozostałych wymienionych marek. Powiedzmy, że mają 2 różne opcje (w praktyce będzie to prawdopodobnie mają o wiele więcej), w wyniku następujących wyszukiwań:

Shoe + Black + Nike > 103 results 
Shoe + Black + K-swiss > 0 results 

w tym przypadku, jeśli widzą markę „K-Swiss” na liście dostępnych wybierz w swoim filtrze, ich wyszukiwanie zwróci 0 wyników.

To oczywiście raczej rozczarowuje użytkownika ... Wolę wiedzieć, że zmiana "marki" z "adidas" na "k-swiss" spowoduje wyświetlenie 0 wyników, a po prostu usunięcie całej opcji z filtra .

samo odnosi się do kategorii, kolorów itp

W praktyce oznaczałoby to pojedynczy widok strony nie tylko powrót do listy produktów przefiltrowaną opisanej w moim głównym celem, ale potencjalnie setki podobnych jeszcze różnych listach. Jedna dla każdej wartości filtru, która może zastąpić inną wartość filtru lub być dodana do istniejących wartości filtru.

Pojemność

Podejrzewam moja baza danych będzie zawierać ewentualnie:

między 250 a 1.000 unikalne znaczniki

I będzie zawierać:

pomiędzy 10.000 a 100.000 wyjątkowe produkty

Aktualne Pomysły

Zrobiłem kilka wyszukiwania Google i znalazłem następujący artykuł: http://www.pui.ch/phred/archives/2005/06/tagsystems-performance-tests.html

Sądząc po tym artykule, bieganie setki zapytań do osiągnięcia 2nd cel, będzie boleśnie powolne trasy. Przykład "toxy" może działać dla moich potrzeb i może być do przyjęcia dla mojego pierwszego celu, ale byłby niedopuszczalnie powolny dla drugiego celu.

Myślałem, że mogę uruchomić pojedyncze zapytania pasujące do 1 tag do skojarzonych z nimi product_id, buforować te zapytania, a następnie obliczyć skrzyżowania wyników. Ale czy mogę obliczyć te przecięcia w MySQL? lub w PHP? Jeśli używam MySQL, czy istnieje szczególny sposób, w jaki powinienem buforować te indywidualne zapytania lub czy dostarczam właściwe indeksy, których potrzebuję?

Wyobrażam sobie, że możliwe jest nawet, że może nawet buforować skrzyżowania między dwoma z tych zestawów tag/product_id. Ilość skrzyżowań byłaby ograniczona przez fakt, że tag_type może mieć tylko jedną konkretną wartość, ale nie jestem pewien, jak skutecznie zarządzać tego typu buforowaniem. Ponownie, nie wiem, czy powinienem to zrobić w MySQL lub w PHP. A jeśli zrobię to w MySQL, jaki byłby najlepszy sposób przechowywania i łączenia tego typu wyników w pamięci podręcznej?

+1

to jest teza: D – dynamic

+1

Cóż, to jest to, co nazywam pytaniem! Gratulacje, proszę pana. – Weacked

+0

Dziękujemy! Założę się, że odpowiedzi dostarczą mnóstwa nowej wiedzy! –

Odpowiedz

2

Korzystanie sphinx search engine może uczynić tę magię dla Ciebie. Jest BARDZO szybki, a nawet może obsługiwać formułki, co może być przydatne w przypadku żądań SEO.

Jeśli chodzi o sfinksa, zrób dokument - "produkt", indeksuj według znaczników, wybierz odpowiedni ranking dla zapytania (np. MATCH_ALL_WORDS) i uruchom zlecenie zbiorcze z różnymi kombinacjami znaczników, aby uzyskać najlepsze wyniki. Nie zapomnij użyć cache'ów, takich jak memcahed lub innych.

+0

W porządku, to brzmi bardzo interesująco. Zastanawiam się, czy ich obsługa SQL zawiera coś takiego jak zapytanie @ eX0du5 zasugerowane ... Wtedy mógłbym użyć zarówno wyspecjalizowanej wysoce wydajnej wyszukiwarki, jak i kilku bardzo inteligentnych zapytań, a nie tylko prostych. –

+0

Sphinx obsługuje tryb składni zapytań typu mysql, zwany SphinxQL, ale wolę używać połączeń natywnych –

2

Nie przetestowałem tego jeszcze, ale powinno być możliwe, aby jedno zapytanie spełniało drugi cel, a nie wyzwalać kilkaset pytań ... Poniższe zapytanie ilustruje, jak to powinno działać w ogóle. Ideą jest połączenie trzech różnych żądań naraz i grupowanie według dedykowanej wartości i zebranie tylko tych, które mają jakiekolwiek wyniki.

SELECT t1.product_id, count(*) FROM tagtable t1, tagtable t2, tagtable t3 WHERE 
t1.product_id = t2.product_id AND 
t2.product_id = t3.product_id AND 
t1.tag_type='yourcategoryforShoe' AND t1.tag_value='Shoe' AND 
t2.tag_type='product_color' AND t2.tag_value='Black' AND 
t3.tag_type='brand' 
GROUP BY t3.tag_value 
HAVING count(*) > 0 
+0

Brzmi bardzo mądrze! Będę musiał przeprowadzić testy wydajności na tym ... –