2012-10-12 15 views
7

Mam aktualnie wyszukiwania, który wygląda tak:Jak mogę poprawić moje LIKE za pomocą wyszukiwania JOIN w mysql?

SELECT s.ID 
    FROM Shoe s 
     INNER JOIN Account a 
      ON s.UserID = a.ID 
     WHERE s.Publish='1' AND 
      (s.Brand LIKE '%$Search%' 
      OR s.Name LIKE '%$Search%' 
      OR s.PrimaryColor LIKE '%$Search%' 
      OR a.User LIKE '%$Search%') 
     ORDER BY s.ID DESC 
LIMIT $offset, $rowsPerPage" 

Działa to dobrze, gdy do wyszukiwania takich jak „Blue” czy „Nikes”, ale jeśli zrobić wyszukiwania, takie jak „Blue Nikes” nic zwraca. Czy powinienem używać FULLTEXT? Jak mogę to poprawić? Chcę móc przeszukiwać wszystkie kolumny, które mogą odnosić się do zmiennej wyszukiwania.

+1

Tak, należy użyć funkcji wyszukiwania pełnotekstowego MySQL lub zewnętrznego indeksu wyszukiwania. –

+4

Używanie symboli wieloznacznych po lewej stronie LIKE uniemożliwi użycie MySQL w indeksie. W zależności od twoich potrzeb możesz również spojrzeć na coś takiego jak solr. –

+0

@SeanBright Próbowałem użyć Match Against z Fulltext i otrzymałem zero wyników. Dalej szukam tego i natknąłem się na to - http://stackoverflow.com/questions/5925369/mysql-join-and-match-against-search-fail wydaje się, że nie zadziała z powodu słów "stop". Nie jestem zbyt zaawansowany w mysql, więc wybacz mi, jeśli jestem zgubiony. – SReca

Odpowiedz

1

więc po aprowizacji i testowania różnych rzeczy, wpadłem na to:

"FROM Shoe AS s 
    LEFT JOIN Accounts AS a ON s.UserID = a.ID 
    WHERE (MATCH (s.Brand, s.Name, s.PrimaryColor AGAINST('$Search' IN BOOLEAN MODE) 
     OR MATCH (a.User) AGAINST('$Search' IN BOOLEAN MODE)) 
      AND s.Publish='1' 
    ORDER BY s.ID DESC" 

ten Wygląda na to, że naprawiłem problem, o którym wspomniałem powyżej, mogę teraz przeprowadzić wyszukiwanie, takie jak "Blue Nike", i pojawią się wszystkie elementy związane z niebieskim paskiem nike &. Nie jestem pewien, czy jest to najbardziej efektywny sposób, ale działa.

0

Zamiast LIKE spróbuj użyć SOUNDEX lub obu.

Po drugie, może chcesz zoptymalizować zapytanie do utrzymania liter, na przykład:

(lower(s.Brand) LIKE '%" . strtolower($Search) . "%' 
OR lower(s.Name) LIKE '%" . strtolower($Search) . "%' 
OR lower(s.PrimaryColor) LIKE '%" . strtolower($Search) . "%' 
OR lower(a.User) LIKE '%" . strtolower($Search) . "%') 
+0

Więc na górze powinno być coś takiego: SELECT s.ID, SOUNDEX (s.Brand), SOUNDEX (s.Name), SOUNDEX (s.PrimaryColor), SOUNDEX (a.User) FROM Shoe s ... '? – SReca

+0

Coś w tym stylu: WYBIERZ * Z SZYBKIEGO ZAKUPU (s.Nazwa DŹWIĘKI JAK "Nike" LUB s. Nazwa LIKE "Nike%"); –

+0

Zaimplementowałem Twoją sugestię, ale nie poprawiłem wyników. Jeśli przeszukuję markę, mam wyniki, jeśli przeszukuję kolor, nic nie pokazuje. – SReca

Powiązane problemy