Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Wyszukiwanie po imieniu i nazwisku, Wybór możliwych rozwiązań
markonix
post
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
Go to the top of the page
+Quote Post
alegorn
post
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
Go to the top of the page
+Quote Post
markonix
post
Post #3





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

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


LEVENSTEIN ogólnie bym sobie darował żeby nie komplikować sprawy. Ktoś zrobi literówkę to już niech się martwi.
Przy uzupełnianiu dodam podpowiedzi przyjmując, że wpisywany ciąg to nazwisko, a następnie dopiero imię.

Co do miejscowości -> Szukasz Jan Kowalski. W bazie masz ich trzech, ale dwaj mieszkają nad morzem, a drugi obok Ciebie i jest z Twojej szkoły. Wtedy jak myślisz o którego Ci chodziło? (IMG:style_emoticons/default/smile.gif) Oczywiście to tylko przykłady "punktowania". Słowo punktowanie wziąłem po prostu z aliasu "score", który zazwyczaj jest używany przy AGAINST.

http://stackoverflow.com/questions/6259647...-column#6305108
Tutaj znalazłem fajne rozwiązanie, wymaga jedynie nałożenia dwóch indeksów (przynajmniej w moim przypadku).
Te rozwiązanie (sumowanie ratingów) podsunęło mi też od razu pomysł na dodanie punktów za jakieś tam cechy (za pomocą CASE).
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: 15.09.2025 - 18:39