![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 2 707 Pomógł: 290 Dołączył: 16.12.2008 Skąd: Śląsk Ostrzeżenie: (0%) ![]() ![]() |
Myślę, że to dość powtarzający się problem i pewnie ma ktoś już jakieś doświadczenie.
Chodzi o wyszukiwarkę. Pomińmy może rozwiązania wymagające instalacji oprogramowania na serwerze czyli co MySQL daje w standardzie. Prosto z mostu - co najlepiej użyć? Mamy dwie kolumny imię i nazwisko. - CONCAT + LIKE %% - AGAINST - AGAINST BOOLEAN - LEVENSTEIN ? Pierwsze ok, w miarę działa ale nie posortuje wg trafności. Z resztą nie mam doświadczenia dlatego pisze ten temat. Czy w AGAINST (BOOLEAN) można dać większy priorytet dla danej kolumny np. nazwiska? Np. Jeżeli ktoś się nazywa Jan Adam to chciałbym aby po wpisaniu "Adam" wyszukiwał najpierw osoby o nazwisku Adam, potem dopiero poszukał Adamów. Ogólnie nazwisko powinno mieć większy priorytet. Potem fajnie by było dodawać dodatkowe punkty za dodatkowe wartości np. jeżeli wyszukana osoba jest z tej samej miejscowości. Czy tu da radę to zrobić na poziomie zapytania czy już wyniki uzupełniać w PHP? Ten post edytował markonix 5.12.2012, 17:42:53 |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 341 Pomógł: 40 Dołączył: 23.06.2009 Ostrzeżenie: (0%) ![]() ![]() |
LEVENSTEIN jest do sprawdzenia odleglosci ciagow znakow, czyli jak nie znajdziesz takiego jak szukasz - to mozesz podpowiedziec/zalozyc ze chodzi prawdopodobnie o :..
jesli po dwu kolumnach i tylko wyszukiwarka - to nie bawilbym sie w AGAINST, tylko w zwykly index. nie bardzo wiem jaki masz pomysl na to, tzn czego konkretnie szukasz, prawdopodobnie dopytujesz sie o jakis 'suggest'. to nie dokonca to samo co wyszukiwarka. jesli chcesz podpowiadac mozliwe wyniki, to najlepiej bedzie jak zalozysz index i szukal po like 'ciag%', i tutaj opcjonalnie LEVENSTEIN, jesli nei znajdziesz niczego. jesli dasz tylko prawostronnie '%' to nadal bedziesz mogl korzystac z indexow. jesli (choc nie wiem po co) musisz miec '%ciag%' to against match, ale radzilbym na silniku 5.6 tam mozna juz na innodb to wykorzystac. jesli nie masz mozliwosci na 5.6 - to zastanawialbym sie nad rozwiazaniami typu np sphinx. rozwiazania like '%ciag%' czy rlike 'ciag' nie maja mozliwosci korzystania z indeksow, wiec skanowanie jest po calej tabeli, czego za wszelka cene unikamy. dodatkowo, jesli mozesz wykorzystac ciagi lewostronnie zamkniete, i tabela nie jest ogromnych rozmiarow, to sugerowalbym silnik memory (choc musisz znac wady tego!) silnik memory, like 'ciag%' + indexy, bedzie najwydajniejsze. jesli tabela jest ogromna, zamiast memory, dajesz innodb z partycjonowaniem tabeli, oczywiscie wg indexu, dziala wydajniej o rząd wielkosci, od jednej wielkiej tabeli. hmmm, to na tyle, jesli chodzi o baze danych.. j. edit: nie doczytalem koncowki Twojego posta. zostawiam jednak bo kilka ciekawych uwag powinno dac sie tam odszukac. jesli masz dwie kolumny, to musisz zadac dwa różne zapytania i zlaczyc po UNION, wpierw przeszukujac pole NAZWISKO. sposob w jaki przeszukiwac po kolumnie - opisalem powyzej. o co Ci chodzi z miejscowosciami - to juz nie zalapalem. Ten post edytował alegorn 5.12.2012, 19:06:01 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 16.10.2025 - 05:30 |