Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Szukanie w bazie danych
Forum PHP.pl > Forum > PHP
Plikownik
Witam

Mam pytanie. Piszę prostą wyszukiwarkę, która przeszukuje wyniki w bazie danych. Napisałem taki skrypt:
  1. <?php
  2. $query = mysql_query("SELECT * FROM baza WHERE title like '%$szukam%'");
  3. while($dane = mysql_fetch_array($query)) {
  4. $dane2 = $dane['title'];
  5. $dane2 = strtolower($dane2);
  6. $wyniki = substr_count($dane2,"$szukam");
  7. print("Strona ".$dane2."zawiera ".$wyniki." słów kluczowych<br>");
  8. }
  9. ?>

przyjmując, że zmienna $szukam to słowo, którego szukam. Wyświetla ona mniej więcej takie coś:

Strona Gry, programy zawiera 1 słów kluczowych
Strona Programy i gry zawiera 1 słów kluczowych
Strona Darmowe programy i nowe programy zawiera 2 słów kluczowych

Problem tkwi w tym, że nie wiem jak mam zrobić, żeby wyniki były posortowane według liczby słów kluczowych od tych z największą ilością do tych z najmniejszą ilością. sadsmiley02.gif
konys
Wrzuć wynik SQL do tablicy i ją posortuj

  1. <?php
  2. $query = mysql_query("SELECT title FROM baza WHERE title like '%$szukam%'");
  3. while($dane = mysql_fetch_array($query)) {
  4. $dane2 = $dane['title'];
  5. $dane2 = strtolower($dane2);
  6. $wyniki = substr_count($dane2,"$szukam");
  7. $arr[$wyniki] = $dane2;
  8. }
  9.  if( krsort($arr) )
  10. foreach( $arr as $wynik => $strona )
  11.  echo("Strona ".$strona." zawiera ".$wynik." słów kluczowych<br>");
  12. ?>
DzikiLis
Cytat(Plikownik @ 2006-01-19 21:16:38)
Problem tkwi w tym, że nie wiem jak mam zrobić, żeby wyniki były posortowane według liczby słów kluczowych od tych z największą ilością do tych z najmniejszą ilością.  sadsmiley02.gif

IMHO ilość wystąpień słowa jest mało interesująca. Chyba, że jest to jakaś specjalna wyszukiwarka. Najlepiej zastosuj funkcje wbudowane w bazę danych do ustalania które wyniki powinny być wyświetlane jako pierwsze.

Proponuję wzbogacenie wyszukiwarki o następujące mechanizmy:
1) Filtruj zapytania pod kątem dziwnych znaków.

2) Minimum 3 litery, maksimum 5-6 wyrazów (reszta ignorowana).

3) Rozdzielaj słowa w zapytaniu. W obecnej wersji po wpisaniu np. 'marek jurek' wyszukiwarka znajdzie tylko marszałka sejmu, nie pokaże natomiast innych stron z tymi słowami. A chyba nie tego oczekuje użytkownik.

4) Kolejność wyszukiwania:
- strony, które zawierają wszystkie słowa koło siebie
- strony, które zawierają wszystkie słowa, ale oddalone od siebie
- strony, które zawierają część słów kluczowych (im mniej tym gorzej)

Słowa, czyli po obu stronach nie ma innych literek i cyferek, tylko spacje, taby, kropki, myślniki, itp.

5) Jeśli pierwsze wyszukiwanie nie przyniosło rezultatów, szukaj części słów, czyli właśnie '%fraza%', potem kombinacje '%słowo_1%' AND '%słowo_2%' [...] a na koniec '%słowo_1%' OR '%słowo_2%' OR [...]. Dzięki temu znajdziesz zakaMAREK, koszMAREK, itp. Moim zdaniem lepiej pokazać, że wyszukiwarka się stara niż wywalić 'znaleziono 0 pasujących stron'.

Punkt czwarty i piąty można zrealizować jednym zapytaniem, stosując UNION i zapytania w odpowiedniej kolejności (eliminujące duplikaty). Konstrukcja zapytania może być czasochłonna, dlatego proponuję je cache'ować w zmiennej sesji.
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.