Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Szukanie w bazie danych, Wyświetlanie wg. ilości słowa kluczowego
Plikownik
post 19.01.2006, 22:16:38
Post #1





Grupa: Zarejestrowani
Postów: 83
Pomógł: 0
Dołączył: 19.01.2006

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


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


--------------------
Windows XP | Telewizja, Radio
Go to the top of the page
+Quote Post
konys
post 19.01.2006, 23:33:13
Post #2





Grupa: Zarejestrowani
Postów: 100
Pomógł: 7
Dołączył: 5.11.2005

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


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. ?>


Ten post edytował konys 19.01.2006, 23:34:25
Go to the top of the page
+Quote Post
DzikiLis
post 20.01.2006, 11:03:25
Post #3





Grupa: Zarejestrowani
Postów: 36
Pomógł: 0
Dołączył: 16.12.2005
Skąd: Warszawa, Kabaty

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


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

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

 



RSS Wersja Lo-Fi Aktualny czas: 19.07.2025 - 07:40