Zadanie Domowe php mysql
Chcemy aby jedno zapytanie w pliku php do sql nawet za cenę powolnego działania obliczało nam top 1000 wyników w podanej poniżej hierarchii.
Chcemy również aby :
-wyniki były poukładane według trafności i ilości (najpierw te "tylko całe frazy" i +tylko +podane +frazy a potem częściowe frazy na zasadzie +tylko +fraz i +podane +frazy a potem całość z drugiego zapytania + na końcu QUERY EXPANSION aby zawsze mieć dużo wyników.)
-wyniki były podane w ilości max 1000 z przeszukaniem całej bazy
-wyszukiwanie nie jest dla trybu online, więc może trwać sporo byle było zoptymalizowane w miarę

Hierarchia
Test na frazie "sklep internetowy z promocjami" (do wszystkiego może być użyta tabela tmp w sql)
1) najpierw idą wyniki dla zapytania
SELECT id FROM `tabela` WHERE MATCH `tekst` AGAINST ( '+sklep +internetowy +z +promocjami' IN BOOLEAN MODE )
I tutaj już się pojawia problem z literą 'z' gdyż musi ją omijać, potem gdy skrypt pominie litery i znaki jedno i dwu znakowe dobrze jakby szły kombinacje typu '+sklep +internetowy' potem '+sklep +promocjami' potem '+internetowy +promocjami'
potem aby zapytanie szło mniej więcej tak :
SELECT id MATCH( tekst ) AGAINST ('sklep internetowy z promocjami' WITH QUERY EXPANSION) AS rank FROM tabela WHERE MATCH( tekst ) AGAINST ('sklep internetowy z promocjami' IN BOOLEAN MODE) > 0 HAVING tabela LIKE '%sklep internetowy z promocjami%' ORDER BY rank DESC
i aby z tych zapytań zrobić jedną listę numerów id (bez powtarzania) w ilości max 1000.
ktokolwiek wie
Odpowiedź : może być inne zapytanie ale generalnie aby ustawiało najpierw frazy "te w cudzysłowu" potem te +występujące +razem, potem te ze zwykłego match against ('nasza fraza') a potem te z systemu querty expantion (czyli dobierane z podwójnego wyszukiwania). Więc z połączenia 4 zapytań a każde (jeżeli to możliwe) z ilością występowania.
Czyli chcemy połączyć cztery wyszukiwania numerów ID w jedno z pogrupowanymi wynikami bez powtarzania ID
1)
SELECT id FROM `tabela` WHERE `tekst` LIKE '%nasza fraza%'
2)
SELECT id FROM `tabela` WHERE MATCH `tekst` AGAINST ('+nasza +fraza' IN BOOLEAN MODE )
3)
SELECT id FROM `tabela` WHERE MATCH `tekst` AGAINST ('nasza fraza')
4)
SELECT id FROM `tabela` WHERE MATCH `tekst` AGAINST ('nasza fraza' WITH QUERY EXPANSION )
I uwaga wszelkie match against z pominięciem dwu i jedno znakowych wyrazów liczb bo jest drugi problem że działa od 3 znaków. Fajnie jakby działanie numer 2 było wykonywane w kobminacjach dla więcej niż 2 słów (liczb). czyli dla trzech wyrazów jako : 1,2,3 - 1,2 - 1,3 - 2,3
No i oczywiście bez powtórzeń ID a najlepszym jak by zawsze tam szedł w zapytaniach ranking jakiś według trafności i eliminowane by były te same liczby z rankingu trafności (usunięcie duplikacji kontekstu)
Przykład
id tekst trafność
1787311 Malarstwo Aukcje sztuki Aukcje malarstwa Ciekawe a... 20.874841690063477
1787316 Malarstwo Aukcje sztuki Aukcje malarstwa Ciekawe a... 20.874841690063477
1787324 Malarstwo Aukcje sztuki Aukcje malarstwa Ciekawe a... 20.874841690063477
1942057 Malarstwo Aukcje sztuki Aukcje malarstwa Ciekawe a... 20.874841690063477
12197 AlleZOO pl Aukcje Zoologiczne Aukcje Internetowe A... 19.913816452026367
1812373 Aukcje internetowe Nowe aukcje Aukcja Komputery Au... 19.913816452026367
1805063 Komputery Aukcja Nowe aukcje Aukcje internetowe Au... 19.683027267456055
Te rekordy numer 2,3,4 oraz 6 powinny być usunięte, gdyż to duplikaty i chodź mają inne linki to duplikacja treści.