Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL]Wyszukiwarka z szukaniem znak po znaku
Forum PHP.pl > Forum > Przedszkole
northwest
Witam serdecznie,
Mam problem z wyszukiwarką...

Chcę zrobić wyszukiwarkę która szuka zamiennie słowa (przykładowo wpisując "auto myjnia" i "myjnia auto" ma zwracać takie same wyniki) oraz
w momencie gdy ktoś użyje (lub nie użyje) polskich znaków przykładowo "łożysko" oraz "lożysko" - żeby wyświetlała wyniki z obu fraz...

kombinuję z takim kodem:

  1. $fraza = $_GET['szybkoszukaj'];
  2. $subquery = null;
  3.  
  4. if ($fraza != "") {
  5. //$subquery .= " name like '%".$fraza."%' and ";
  6. $zwrot = explode(' ', $fraza);
  7. $pet = str_replace("l", "ł", $zwrot[0]);
  8.  
  9. $subquery .= " and (nazwa LIKE '%$zwrot[0]%' or bf_id LIKE '%$zwrot[0]%' or bf_id LIKE '%$pet%') ";
  10. $i = 0;
  11. foreach ($zwrot as $z) {
  12. if ($i > 0) {
  13. $pet = str_replace("l", "ł", $fraza);
  14. $subquery = $subquery . " and (nazwa LIKE '%$z%' or bf_id LIKE '%$z%' or bf_id LIKE '%$pet%')";
  15. }
  16. $i++;
  17. }
  18.  
  19. //$subquery=$subquery." or name LIKE '%$pet%' ";
  20. $subquery .= $subquery . ' ';
  21. }



ale nie bardzo chce działać sad.gif
Macie może pomysł co mam źle w tym kodzie?


Z góry dziękuje za pomoc,
Northwest
jaslanin
1. Nie powinno się używać do takich celów like, bo bardzo szybko przestanie się to skalować. Lepiej używać Sphinx albo zaimplementować własną wyszukiwarkę pełną tekstową np. tak jak w phpbb3

2. czy zamiast or bf_id nie powinna być nazwa

3. używasz zmiennej $pet jednak nie masz jej zdefiniowanej (definicja jest zaakomentowana)
northwest
1. dlaczego nie? prostej wyszukiwarce nie podoła like?

2. bf_id = numer seryjny

3. fakt, przeoczyłem wklejająć na forum - poprawiłem smile.gif
erix
1: to, że ona jest prosta wg Ciebie, to nie znaczy, że wyciśnie siódme poty w przypadku, gdy tych danych przybędzie, obciążenie wzrośnie.
b4rt3kk
Jeśli w bazie masz łożysko (czy to strona o ginekologii?), a chcesz żeby wyszukało także wpisanie w wyszukiwarce lozysko, to newralgiczne znaki zastąp znakiem podkreślenia i dopiero szukaj, to prostsze niż się bawić w zamiany. Czyli szukana fraza: _o_ysko. Poza tym gdzie jest główna część zapytania? Bo tu tylko się od AND zaczyna.
northwest
a moglbym prosic o informacje jak to ma wygladac? danych mam ok 500mb
bostaf
Cytat(b4rt3kk @ 11.10.2012, 12:47:38 ) *
Jeśli w bazie masz łożysko (czy to strona o ginekologii?)

biggrin.gif dobre dobre smile.gif

Cytat(b4rt3kk @ 11.10.2012, 12:47:38 ) *
Jeśli w bazie masz łożysko (czy to strona o ginekologii?), a chcesz żeby wyszukało także wpisanie w wyszukiwarce lozysko, to newralgiczne znaki zastąp znakiem podkreślenia i dopiero szukaj, to prostsze niż się bawić w zamiany. Czyli szukana fraza: _o_ysko. Poza tym gdzie jest główna część zapytania? Bo tu tylko się od AND zaczyna.

Do wzorca _o_ysko pasują także nożysko, kołysko, morysko (nie jestem taki mądry, tu znalazłem).

  1. Zamiast
    1. LIKE '%abc%' AND LIKE '%bcd%' AND LIKE '%cde%'
    spróbuj z
    1. LIKE REGEXP 'abc|bcd|cde'
  2. Co może pomóc na diakrytyki, to wywołanie
    1. SET NAMES utf8 COLLATE utf8_general_ci
    przed wykonaniem zapytania. Bo to kodowanie (nie miałem czasu mocniej testować, ale na pewno się pobawię) powinno ignorować znaki diakrytyczne.
northwest
łożysko może być także w rowerze, samochodzie itp wink.gif

całe zapytanie wygląda tak: SELECT * FROM produkty WHERE enable = '1' AND (nazwa LIKE '%chłodnica%' or bf_id LIKE '%chłodnica%') AND (nazwa LIKE '%chlodnica%' or bf_id LIKE '%chlodnica%') AND (nazwa LIKE '%chłodnica%' or bf_id LIKE '%chłodnica%') AND (nazwa LIKE '%chlodnica%' or bf_id LIKE '%chlodnica%') ORDER by nazwa ASC

(przykładowo)

dokładnie , jak ktoś wpisze "łożysko" - chce szukać jako "łożysko" i "lożysko"... smile.gif

Kodowanie strony mam w UTF8, kodowanie bazy w: utf8_unicode_ci

czyli zapytanie ma wyglądać następująco:
LIKE REGEXP 'łożysko|lożysko|'


questionmark.gif

coś takiego:

  1. SELECT * FROM `produkty` WHERE nazwa LIKE REGEXP 'chłodnica|chlodnica|'
questionmark.gifsmile.gif
erix
I tak będzie jeździć po bazie.

Jeśli chcesz tak szczegółowo wyszukiwać, to stwórz lepiej jakiś słownik wyrazów i odpowiednio go połącz. Proponowałbym tu Sphinx, etc.

PS. Po co się tak pitolić z polskimi znakami, skoro można transliterować na łacińskie odpowiedniki i wtedy może baza zajmie 2x więcej, ale będzie zasuwać z wyszukiwaniem.
northwest
tzn. baza już działa, nie mogę jej zmienić sad.gif

chciałbym zrobić to najbardziej optymalnie na tym co jest ....
north
kombinuje z takim fulltext searchem:
SELECT * FROM produkty WHERE enable = '1' and MATCH(nazwa) AGAINST (' "fiat chłodnica" ')


i skrypt mi wyrzuca wszystkie frazy które mają frazę w nazwie "fiat" lub "chłodnica" - da się ustawić to tak, żeby zwracało tylko takie rekordy które mają obie frazy jednocześnie?
slawek3422
a na moje oko to zapytanie, które napisałeś nie zadziała ... dlaczego ?
  1. SELECT * FROM produkty WHERE enable = '1' AND (nazwa LIKE '%chłodnica%' OR bf_id LIKE '%chłodnica%') AND (nazwa LIKE '%chlodnica%' OR bf_id LIKE '%chlodnica%') AND (nazwa LIKE '%chłodnica%' OR bf_id LIKE '%chłodnica%') AND (nazwa LIKE '%chlodnica%' OR bf_id LIKE '%chlodnica%') ORDER BY nazwa ASC


w powyższym zapytaniu szukasz informacji o produktach które mają nazwę lub ID "chłodnica" i "chlodnica' jednocześnie, poza tym masz bez sensu powtórzone dwa razy te same AND'y

wywal ostatnie dwa AND'y i zamiast AND pomiędzy pozostałymi AND'ami daj OR i powinno ruszyć

pisane w pracy na szybko więc nie gwarantuję 100% działania tongue.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.