TwojePC.pl © 2001 - 2024
|
|
A R C H I W A L N A W I A D O M O Ś Ć |
|
|
|
[php+mysql] Skomplikowane wyszukiwanie , kubazzz 13/02/10 20:27 Zna ktoś jakiś dobry tutorial, wprowadzenie do rozbudowanych wyszukiwań?
Mam tabelę firm z kilkoma kolumnami:
nazwa, miasto, opis, kategoria
Chciałbym zrobić przeszukiwanie na podstawie wszystkich kolumn, ale z pomocą jednego stringa.
Czyli np ktoś wpisuje:
kraków kwiaciarnia podgórze
kraków - to słowo będzie w kolumnie 'miasto'
kwiaciarnia - w kolumnie 'opis', albo 'nazwa', albo 'kategoria'
podgórze - w kolumnie 'opis', albo 'nazwa'
Można zrobić coś takiego:
$keywords = str_replace(" ", "," , "kraków kwiaciarnia podgórze");
i potem
query=("SELECT * FROM table WHERE nazwa IN ($keywords) miasto IN ($keywords) OR opis IN ($keywords) OR kategoria IN ($keywords) ORDER BY id DESC")
Tylko w sumie jest do dupy bo w większości nie znajdzie wyników bez idealnego dopasowania.
Przydałoby się wildcards, czyli LIKE, ale nie wiem jak to połączyć.
Czy jedyny sposób to zrobienie pętli i
foreach($keywords as $word)
{
//doklejanie do query zapytania dla każdego słowa w stylu
OR (nazwa LIKE '%$word%' OR miasto LIKE '%$word%' OR opis LIKE '%$word%' OR kategoria LIKE '%$word%')
}
Będzie coś z tego?
Bo jeszcze mam inny pomysł - zrobić dodatkowe pole w tabeli, pole "full text", utworzone z tych po których będzie search robiony i wtedy uprości się to może bo nie trzeba będzie w tylu kolumnach szukać.
Ma to sens?
Niestety to wszystko jest rozumowanie laika, nie wiem jak powinno być prawidłowo.
A już nawet nie marzę o jakimś wartościowaniu tych wyników i wyświetlaniu najpierw najbardziej dopasowanych....SM-S908 - hmm , Adamusss 13/02/10 21:19
moze wyszukiwanie pelno tekstowe? :)
i wtedy cos typu
SELECT id, text, MATCH (text) AGAINST ('word1 word2 word3')
AS score FROM table1
WHERE MATCH (text) AGAINST ('+word1 +word2 +word3' in boolean mode) order by score desc;- wiedziałem, że musi być coś takiego , kubazzz 13/02/10 21:58
:)
dzięki, zagłębię się w to.SM-S908 - ale są z tym problemy jednak , kubazzz 13/02/10 22:30
po pierwsze działa dopiero na czteroliterowych słowach, po drugie nie zwraca wszystkich wyników z danym słowem.
Miałem w testowej bazie 3 pozycje o nazwach
Hello
Hello
Hello5
[jedna nazwa zdublowana, ale to dwa różne wpisy]
i zwróciło tylko pierwsze Hello.SM-S908 - trochę już wiem, ale potrzebuję uzupełnienia , kubazzz 13/02/10 22:52
po pierwsze - Hello jest śmieciowym słowem i w ogóle jest wywalane, wtedy mi znalazł tamten wynik po innym słowie, źle przepisałem tutaj przykład.
po drugie - jeśli słowo jest w 50% lub więcej wierszy to też jest wywalane z indeksu
po trzecie - 3 literowe i mniej są wywalane
w sumie to niespecjalnie mi pasują te ograniczenia, bo łatwo jest doprowadzić do sytuacji, kiedy ktoś wpisując oczywiste [i popularne] słowo kluczowe, nie dostanie w ogóle wyników.SM-S908 - jak na hostingu zmienić ustawienia silnika mysql? , kubazzz 13/02/10 23:00
parametr (Server System Variable) ft_min_word_len zmienia minimalną długość do wyszukiwania, ale nie mam pojęcia jak się do tego dobrać.SM-S908 - dobra , kubazzz 13/02/10 23:06
spamuje tylko wątek,
już znalazłem my.ini
[mysqld]
ft_min_word_len = 2
a potem REPAIR TABLE table
i działa.SM-S908
- to, co próbujesz uzyskać nie da Ci jednej ważnej rzeczy: rangi odpowiedzi , bwana 13/02/10 21:22
czyli oceny pod względem najlepszego dopasowania.
Na szybko
select * from tab
order by Levenshtein ( tab.nazwa||' '||tab.miasto||' '||tab.opis||' '||tab.kategoria, form.string)
Wiersze na szczycie wyniku są najbardziej podobne do zapytania (najbardziej relewantne w rozumieniu literalnym)
Jak dodać do bazy MySQL funkcję obliczającą podobieństwo edycyjne tekstów (miarę Levenshteina), znajdziesz tu na przykład:
http://codejanitor.com/...a-mysql-stored-function/
Założenie - string z formularza webowego (form.string) podawany jest do zapytania w kolejności nazwa, miasto, opis, kategoria.
Funkcja Levenshtein(a, b) podaje, w ilu krokach edycyjnych (dodaniach znaku, zastąpieniach znaku, usunięciach znaku) ciąg a da się przekształcić w ciąg b. Im mniejszy wynik, tym większe podobieństwo ciągów a i b. Wynik 0 oznacza, że oba ciągi są identyczne.
Wady - duża złożoność obliczeniowa funkcji oraz to, że funkcję trzeba wykonać dla całej populacji danych (bo jej wynik jest w istocie kryterium wyszukiwania).
W samym PHP jest ta funkcja (tj. levenshtein()) zaimplementowana, ale filtrowanie dużego wyniku (select * from tabela) na poziomie PHP może zabić wydajność - w szczególności gdy baza i serwer www są na różnych maszynach, ale też w przypadku ogólnym.
Może ktoś wymyśli coś ładniejszego/wydajniejszego, więc potraktuj moje wypociny jako ew. ostatnią deskę surfingową."you don't need your smile when I cut
your throat" - pisałem nie widząc pierwszej odpowiedzi , bwana 13/02/10 21:23
wygląda znacznie sensowniej, niż moja:-D"you don't need your smile when I cut
your throat" - no na pewno prostsze w zastosowaniu , kubazzz 13/02/10 22:01
jest to co podał Adamuss, a ja szczerze mówiąc zapomniałem że jest coś takiego jak full-text search, chociaż pamiętałem że jest taki indeks w phpmyadmin.
Ale jak wspomniałem, nie jestem Małyszem baz danych;)SM-S908 - zdecydowanie prostsze , bwana 13/02/10 22:30
a full-text na "swojej" bazie czyli na Oracle w życiu nie zastosowałem"you don't need your smile when I cut
your throat" - full text i , Wedrowiec 13/02/10 22:35
siakiś sfinks (jak to się pisze to nie wiem) ponoć pod względem wydajności wymiata."Widziałem podręczniki
Gdzie jest czarno na białym
Że jesteście po**bani" - no może i wymiata, zresztą to nieduża baza będzie, ale , kubazzz 13/02/10 22:36
jak widać powyżej, nie do końca mi to rozwiązuje problem.SM-S908 - jeśli tak, to może jednak wypróbuj mój "pomysł" , bwana 14/02/10 11:01
Levenshtein() daje jeden bonus w stosunku do MATCH()-a:
'Krakow' vs 'Kraków' ('Kraków' vs 'Krakowie', 'Krakowa' itd) daje duże podobieństwo, a w Full-Text zerowe, o ile pamiętam. Jeśli baza jest 'mała' to wydajność aż tak nie zaboli."you don't need your smile when I cut
your throat" - czego bym nie próbował to i tak mam problem z grzebaniem w silniku MySQL na hostingu , kubazzz 14/02/10 13:38
bo nie mam swojego serwera, ale tylko hosting współdzielony i nie bardzo widzę możliwość dołożenia lub zmiany czegokolwiek...SM-S908
- wymiata, wymiata , bwana 14/02/10 10:53
ale przez bardzo długo użytkownicy Sphinxa mieli lekkiego pietra, bo wiele wskazywało na to, że padnie i nie wstanie. Niedawno wstał."you don't need your smile when I cut
your throat"
- św. , Arlathan 14/02/10 11:18
mysql, wyszukiwanie-
I Rock. Fact. - a na czym polega kodowanie adresu IP, np przy komentarzach , kubazzz 14/02/10 13:35
kiedyś się z czymś takim spotkałem i ktoś mi polecał to wprowadzić, jako formę zabezpieczenia, ale teraz coś nie mogę znaleźć informacji.
Bo z tego co pamiętam to zamieniało adres IP na jakieś literki, ale nie wiem na jakiej zasadzie bo chyba to było po to, żeby nie ujawniać oryginalnych ip.SM-S908 - .:. , Shneider 14/02/10 14:58
bardziej efekt psychologiczny.
kazdy ma swiadomosc ze IP gdzies jest odnotowane..:: Live at Trance Energy ::. - hmmmmm , kubazzz 14/02/10 15:05
Ja notuje IP w swoich stronkach, ale nie pokazuje tego nigdzie.
Zastanawia mnie technicznie na jakiej zasadzie działa to kodowanie, bo jeśli to nie jest nic wyszukanego, to równie dobrze można IP w formie 83.27.2.234 pokazywać.
A efekt psychologiczny jest, ogranicza to spamerów i ludzi którzy sami ze sobą dyskutują.SM-S908 - .:. , Shneider 14/02/10 15:21
tylko ze ktos moglby tego nie zrozumiec.
ostatnio bylem na policji bo jakis proboszcz poczul sie urazony wypowiedzia na forum, bylo tam ip mojej sieci. wiec pewnie by pominac bledna interpretacje wymyslili sobie krzaczki robaczki kropeczki i kwiatuszki ;-).:: Live at Trance Energy ::.
|
|
|
|
|
All rights reserved ® Copyright and Design 2001-2024, TwojePC.PL |
|
|
|
|