Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL]Wyszukiwarka z szukaniem znak po znaku
northwest
post
Post #1





Grupa: Zarejestrowani
Postów: 788
Pomógł: 1
Dołączył: 17.09.2004

Ostrzeżenie: (10%)
X----


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ć (IMG:style_emoticons/default/sad.gif)
Macie może pomysł co mam źle w tym kodzie?


Z góry dziękuje za pomoc,
Northwest

Ten post edytował northwest 11.10.2012, 11:15:28
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 11)
jaslanin
post
Post #2





Grupa: Zarejestrowani
Postów: 511
Pomógł: 143
Dołączył: 13.03.2010
Skąd: Jasło

Ostrzeżenie: (0%)
-----


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)
Go to the top of the page
+Quote Post
northwest
post
Post #3





Grupa: Zarejestrowani
Postów: 788
Pomógł: 1
Dołączył: 17.09.2004

Ostrzeżenie: (10%)
X----


1. dlaczego nie? prostej wyszukiwarce nie podoła like?

2. bf_id = numer seryjny

3. fakt, przeoczyłem wklejająć na forum - poprawiłem (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
erix
post
Post #4





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




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.
Go to the top of the page
+Quote Post
b4rt3kk
post
Post #5





Grupa: Zarejestrowani
Postów: 1 933
Pomógł: 460
Dołączył: 2.04.2010
Skąd: Lublin

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
northwest
post
Post #6





Grupa: Zarejestrowani
Postów: 788
Pomógł: 1
Dołączył: 17.09.2004

Ostrzeżenie: (10%)
X----


a moglbym prosic o informacje jak to ma wygladac? danych mam ok 500mb
Go to the top of the page
+Quote Post
bostaf
post
Post #7





Grupa: Zarejestrowani
Postów: 374
Pomógł: 79
Dołączył: 6.04.2010
Skąd: Ostrów Wielkopolski

Ostrzeżenie: (0%)
-----


Cytat(b4rt3kk @ 11.10.2012, 12:47:38 ) *
Jeśli w bazie masz łożysko (czy to strona o ginekologii?)

(IMG:style_emoticons/default/biggrin.gif) dobre dobre (IMG:style_emoticons/default/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.
Go to the top of the page
+Quote Post
northwest
post
Post #8





Grupa: Zarejestrowani
Postów: 788
Pomógł: 1
Dołączył: 17.09.2004

Ostrzeżenie: (10%)
X----


łożysko może być także w rowerze, samochodzie itp (IMG:style_emoticons/default/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"... (IMG:style_emoticons/default/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|'


(IMG:style_emoticons/default/questionmark.gif)

coś takiego:

  1. SELECT * FROM `produkty` WHERE nazwa LIKE REGEXP 'chłodnica|chlodnica|'
(IMG:style_emoticons/default/questionmark.gif) (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
erix
post
Post #9





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




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.
Go to the top of the page
+Quote Post
northwest
post
Post #10





Grupa: Zarejestrowani
Postów: 788
Pomógł: 1
Dołączył: 17.09.2004

Ostrzeżenie: (10%)
X----


tzn. baza już działa, nie mogę jej zmienić (IMG:style_emoticons/default/sad.gif)

chciałbym zrobić to najbardziej optymalnie na tym co jest ....
Go to the top of the page
+Quote Post
-north-
post
Post #11





Goście







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?
Go to the top of the page
+Quote Post
slawek3422
post
Post #12





Grupa: Zarejestrowani
Postów: 142
Pomógł: 7
Dołączył: 3.08.2007
Skąd: śląsk

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/tongue.gif)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 14:24