![]() |
relevantnost mysql full text searcha
Pravim sistem za pretragu koju radi full-text search po vise polja, i naleteo sam na sledeci problem:
Pretraga se vrsi po poljima keywords, title i description (postoji jedan full text index za ta polja). Recimo da imam 2 rekorda: Kôd:
ID TITLE DESCRIPTION Kôd:
SELECT id, MATCH (keywords, title, description) AGAINST ('neki naslov') AS rel_kw_title Da li imate neku ideju kako ovo izbeci? Jedino sto 100% pomaze je da se stave navodnici oko svega, ali onda mi "Pera Peric" nece pronaci "Peric Pera" sto mi je takodje potrebno, tako da mi to nije dobro resenje. |
Smislio sam delimicno resenje da za svaki $query, upit formiram kao "$query" $query, npr:
MATCH (keywords, title, description) AGAINST ('"neki naslov" neki naslov') sto resava deo problema. Palo mi je napamet i da radim to isto za razne kombinacije reci tipa: '"neki naslov" "naslov neki" naslov neki' ali cim imam vise od 2 reci to postaje besmisleno komplikovan upit.. Jel ima neko inteligentnije resenje za ovo? Mozda neki externi alat za full text search? |
Postoji Lucene, vredi pogledati. Probao sam dot.net port Lucene.NET, doduše samo za internu upotrebu...
|
Ima i Spinx
http://www.sphinxsearch.com/ |
Zend ima php port.
|
cuo sam za lucene, spinx, solr, xapian, ali nikad nisam probao nista od toga, jel pomazu oni kod ovog tipa problema, da se nadju kvalitetniji rezultati ?
Meni performanse nisu toliki problem jer imam 100.000 recorda, mysql radi super sa time, bitna mi je samo sto bolja relevantnost... |
Da li se isto ponasa kad imas veci broj redova u tabeli? FULLTEXT je poznat po boljci da se ne snalazi bas najbolje kad ima mali broj redova u tabeli...
|
|
Search ranking i sort podesavanja imas i u Sphinxu, doduse, verovatno bi morao dosta da se igras sa tim.
|
@srdjevic: ima oko 100.000 recorda, nije mi problem u 50% granici, nego u nacinu na koji se racuna relevantnost, izgleda se match fraze, odnosno proximity nadjenih reci ne boduje nista posebno, sem ako se bas insistira na odredjenoj fori pomocu boolean operatora... ima i to neke logike, ali tesko cu ja to da objasnim klijentu...:)
|
A da probas sa svakim poljem posebno pa ukupni score?
Kôd:
SELECT id, (MATCH (keywords) AGAINST ('neki naslov') + MATCH (description) AGAINST ('neki naslov') + MATCH (description) AGAINST ('neki naslov')) AS score |
Jedno vreme je moglo i ovako
Kôd:
SELECT id, MATCH (keywords, title, title, description) AGAINST ('neki naslov') AS |
na kraju sam napravio varijantu koja napravi razne varijacije fraze:
"A B C" A B C "A B" A B C "B A" A B C "B C" A B C "C B" A B C A gledajuci sta ljudi kucaju pokazalo se da nema potrebe varirati vise od 2 pojma, jer osim imena ljudi, korisnici obicno otkucaju frazu u pravom redosledu. |
Opet me izludjuje fulltext, pa da ne otvaram novu temu:
Kako da ga nateram da mi vrati samo rezultat koji sadrzi sve zadate reci? Deluje kao osnovna stvar, ali je neko tu glup, ili ja ili mysql... Ako stavim AGAINST('+jedan +dva +tri' IN BOOLEAN MODE) dobicu rekorde koji sadrze sve 3 reci, ali i one koji sadrze samo jednu ili dve. Kako to izbeci? Druga stvar: Ako stavim AGAINST('"neka fraza" +neka +fraza' IN BOOLEAN MODE) dobijam da recordi sa tacnom frazom imaju potpuno isti skor kao recordi koji samo sadrze te 2 reci razdvojene? Zar ne bi trebalo da ako matchuje tacnu frazu ima relevance score 3, jer su se matchovale i tacna fraza i pojedine reci? |
Vreme je GMT +2. Trenutno vreme je 23:50. |
Powered by vBulletin® Verzija 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Copyright © DevProTalk. All Rights Reserved.