Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: wyszukiwanie wazone
Forum PHP.pl > Forum > Bazy danych > MySQL
di@blo
Chce zrobic prosta wyszukiwarke ktora by wyszukiwala z 2 pol

  1. SELECT tytul, tresc FROM tabela WHERE tytul=$zapytanie OR tresc=$zapytanie;


ale chodzi o to zeby uporzadkowal wyniki tak aby te rekordy ktore w tytule maja lowo kluczowe byly 2 razy bardziej brane pod uwage Ewentualnie jesli to mozliwe braly pod uwage ilosc wystapien slowa kluczowego

Jak by ktos rzucil przykladem bylbym wdzieczny i jak by ktos podal godnego polecenia linka do kursu opisujacego to zagadnienie to byloby super

tak przy okazji pytanie czy zwroci mi cokolwiek zapytanie z warunkiem
  1. ..... WHERE warunek1=$costam1 AND warunek2=$costam2 AND warunek3=$costam3

jesli ktoras ze zmiennych $costam bedzie pusta?
MWL
Możesz dac podem ORDER BY `nazwakolumny` ASC, np.

  1. SELECT tytul, tresc FROM tabela WHERE tytul=$zapytanie OR tresc=$zapytanie; ORDER BY `tytul` ASC


Dodatkowo radze ci żeby wyszukiwało po części w tytule czyli

  1. SELECT tytul, tresc FROM tabela WHERE tytul=%$zapytanie% OR tresc=%$zapytanie%; ORDER BY `tytul` ASC
di@blo
dzieki chociaz nie do konca takiej odpowiedzi oczekiwalem bo sprawdza sie to wprzypadku 2 pol w warunku a co jak bedzie np 5 i kazdy bedzie mial inna wage?

Podalem tu najprostsze przyklady zeby zobrazowac w rzeczywistosci zapytanie juz nie bedzie tak banalne to samo sie tyczy wyszukiwania po czesci w tytule Dalem to tylko jako przyklad nie rozpisywalem sie z szczegolami
Sedziwoj
A ja bym polecił poszukać o wyszukiwaniu pełno tekstowym i rankingowaniu (w PostgreSQL jest tsearch2)
Jak już czy jest coś w tytule, to nie
  1. ORDER BY `tytul`

a raczej
  1. ORDER BY (`tytul` = $zapytanie) * 2 DESC

Gdzie 2 to waga, potem + itd. czyli trafienie razy wara
nevt
zakładając, że mamy w tabeli klucz podstawowy id, można zbudować coś w rodzaju:
  1. SELECT *, SUM(waga) AS wynik FROM
  2. (SELECT *, 2 AS waga FROM tabela WHERE pole_1 = 'wartosc_1'
  3. UNION ALL
  4. SELECT *, 1 AS waga FROM tabela WHERE pole_2 = 'wartosc_2'
  5. ) AS tmp GROUP BY id ORDER BY wynik DESC;

ten szablon możesz sobie rozbudowywać o kolejne warunki (dodając kolejne UNION ALL SELECT ...). możesz go swobodnie dopasowywać stosując przeróżne kombinacje WHERE ...
dodatkowy bonus - jeżeli dany rekord pasuje jednocześnie do kilku warunków, to jego wynik jest sumą wag ze wszystkich warunków. czyli na twoim przykładzie - jeśli spełniony jest warunek dla tematu - wynik=2, jeżeli dla treści - wynik=1, jeżeli dla tematu i treści jednoczesnie - wynik=3 - i ten rekord znajdzie się najwyżej ...
powodzenia.
Sedziwoj
@nevt
Nie dałeś nic więcej ode mnie w możliwościach do tego u Ciebie jest dwa razy przeglądana tabela i do tego wyniki jeszcze raz (oczywiście coś baza zoptymalizuje, ale mimo wszystko), Każdy warunek dodatkowy daje kolejne przejście tablicy.
Do tego korzystasz z specyficznego działania MySQL'a.
nevt
przyjacielu sedziwoj ...
Cytat
A ja bym polecił poszukać o wyszukiwaniu pełno tekstowym i rankingowaniu (w PostgreSQL jest tsearch2)
....
Do tego korzystasz z specyficznego działania MySQL'a

kolega di@blo umieścił temat w dziale MySQL a nie PostgreSQL ... poza tym nigdzie nie napisał, ze che używać full text search na polach typu text ... pozwólmy zainteresowanemu wypowiedzieć się samodzielnie, która sugestia jest bliższa rozwiązania jego problemów ... poza tym
Cytat
Nie dałeś nic więcej ode mnie w możliwościach do tego
a co ty dałeś ? korektę do ORDER BY ... naprawdę rozbawiłeś mnie smile.gif
Sedziwoj
Cytat(nevt @ 16.04.2008, 22:28:04 ) *
przyjacielu sedziwoj ...

Na pewno nie przyjacielu, na takie miano trzeba zasłużyć.
Cytat
kolega di@blo umieścił temat w dziale MySQL a nie PostgreSQL ... poza tym nigdzie nie napisał, ze che używać full text search na polach typu text ...

To była tylko sugestia, taka wstępna, nic nie miała do dalszej wypowiedzi, ani jej nie rozwijałem, po prostu napomknąłem o innych rozwiązaniach.
Cytat
a co ty dałeś ? korektę do ORDER BY ... naprawdę rozbawiłeś mnie smile.gif


I ta korekta robi to co Twoje wspaniałe rozwiązanie, robi to szybciej, więc nie jestem pewien z czego to rozbawianie. Bo chyba nie zwróciłeś nawet uwago co ta korekta robi, a robi sporo.
Więc radzę przetestować to co napisałem z różnymi mnożnikami i sumą trafności innych warunków, niż nabijać się z czegoś czego nawet nie zrozumiałeś.

P.S.
Zobaczyłem literówkę, bo miało być waga, ale nie będę zmieniać aby nie poszły domysły o manipulacji.
Ogólnie to wgląda tak, dopowiadam jakby ktoś nie zrozumiał
  1. ORDER BY (<nazwa kolumny> = <wartość>) * waga1 + (<nazwa kolumny2> LIKE <wartość2>) * waga2... itd.

Ponieważ porównanie daje 0 lub 1 mamy dwie wartości, możemy użyć ilości wystąpień słowa wtedy mamy też brane pod uwagę ilość wystąpień, możliwości jest sporo, ważne w tym jest to żeby właśnie użyć ORDER BY nie na wartościach bezpośrednio, a na pewnie przetworzonych.
nevt
słuchaj koleś (tak lepiej ?) - przestań tu sobie nabijać posty. nie wnosisz nic nowego do tematu. uważasz, że zjadłeś wszystkie rozumy - twoja sprawa. ja kiedy przedstawiłem swoją propozycję nie wciskałem kitu, że jest lepsza od twojej. to sobie oceni autor wątku samodzielnie. masz do mnie jakieś osobiste urazy? to pisz na PW - za następny bezsensowny post w tym temacie poleci warn. dobranoc.
Sedziwoj
Cytat(nevt @ 16.04.2008, 23:08:38 ) *
słuchaj koleś (tak lepiej ?) - przestań tu sobie nabijać posty. nie wnosisz nic nowego do tematu. uważasz, że zjadłeś wszystkie rozumy - twoja sprawa. ja kiedy przedstawiłem swoją propozycję nie wciskałem kitu, że jest lepsza od twojej. to sobie oceni autor wątku samodzielnie. masz do mnie jakieś osobiste urazy? to pisz na PW - za następny bezsensowny post w tym temacie poleci warn. dobranoc.


To niech leci warn, ale to Twój ostatni post był nie na temat, więc Tobie też powinien polecieć.
Do tego ja podałem dlaczego moje rozwiązanie jest lepsze, tak się zaczyna zazwyczaj dyskusję na temat co jest lepsze, tak normalnie się dzieje, ale nie potrafiłeś uzasadnić dlaczego Twoje jest lepsze, do tego zacząłeś się mnie czepiać, więc nie wiem kto tu sobie posty nabija.

Zwracam uwagę że z rankingowaniem są pewne problemy, sam poszukiwałem niby dla niedużej puli danych 200MB, 100tys. rekordów i już był problem, bo wymaga odpowiedniego serwera, samo wyszukanie to były milisekundy, ale budowa rankingu i sortowanie trwało do 25s... (w zależności od ilości trafień).

Jakby były jakieś pytania co do mojego rozwiązania to chętnie odpisze, w miarę mojej wiedzy.

EDIT: zjedzone slowo
di@blo
Po pierwsze to post jest by pomagac a ne klocic sie kto ma lepsze rozwiazanie
Po drugie w gre wchodzi tylko mysql
Po trzecie z tego co wiem to w mysql jest cos takiego jak zapytanie wazone czy cos w tym stylu
Po czwarte oprocz gotowych rozwiazan przydalby sie jakis link do kursu czy cos w tym stylu

Jestem w dobrej sytuacji bo moge wybierac tongue.gif Ale nie wiem czy w 100% dziala tak jak chce
Chodzi mi to ze mam np 3 pola pierwsze pole ma wage 3 drugie wage 2 a trzecie wage 1 i ma sortowac tak ze np: rekord ktory w polu 2 ma np 2 slowa kluczowe bedzie wyzej niz rekord ktory bedzie mial lowo kluczowe w polu pierwszym itp Rozwiazania uwzgledniaja ilosc wystapien slowa kluczowego w jednym polu?
nevt
Cytat
Po trzecie z tego co wiem to w mysql jest cos takiego jak zapytanie wazone czy cos w tym stylu

to podziel się z nami tą wiedzą - sam się chętnie nauczę czegoś nowego ...
Cytat
nadal nik mi ni odpowiedzial na pytanie czy zwroci mi cokolwiek zapytanie z warunkiem ...

a ty sam przez dwa dni nie znalazłeś czasu i sposobu żeby sobie wklepać to zapytanie do bazy i zobaczyć co się stanie ?
di@blo
Chetnie bym sie podzieli ale jak bym wiedzial to bym nie pytal o to
Kilka razy cos tam czytalem niestety nie interesowalo mnie to bo nie bylo mi wtedy potrzebne

a co 2 czesci to jak uporam sie z innymi rzeczami to sam sobie sprawdze ale chyba szybciej komus odpowiedziec w kilku slowach co mu zajmie max 1 min niz testowac rozwazanie
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.