Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Boa tarde pessoal,
Estou com um misterio aqui para realizar as buscas como nas imagens abaixo
/applications/core/interface/imageproxy/imageproxy.php?img=http://dc584.4shared.com/img/yUfAnaNt/s7/0.9188762602093135/ofac20.jpg&key=1703c79af2b62f90da683a2dac2bbfdbdf14825bcd450a0efb3356564499970b" alt="ofac20.jpg" />
/applications/core/interface/imageproxy/imageproxy.php?img=http://dc304.4shared.com/img/3T-gCos3/s7/0.5893628747619357/ofac30.jpg&key=f4def5b90cfc6f22baeac2830d489e464ba9614cc36f22bbf8b63045812a6560" alt="ofac30.jpg" />
Ela pesquisa o nome e voce coloca o rank que voce quer... por exemplo na primeira imagen ele tem o rank 20 entao ele buscou os nomes LADEN e cada registro encontrado ele ainda coloca o rank deste registro...
até pensei em usar o like para isso mas não daria muito certo pq... teria que ser pré definido os "ranks" tipo:
rank 25 = like %nome%
rank 50 = like nome%
rank 100 = nome.
Alguem tem alguma ideia de como fazer isso ?
Eu estou usando o PHP para fazer as pesquisas.
não entendi a dúvida..
a query acima, é mais ou menos assim:
WHERE nome LIKE '%$LADEN%' AND rank >= 20
A ideia é fazer a busca de acordo com o peso....
igual neste link aqui http://www.instantofac.com/search.php
Eu preciso pesquisar um nome na tabela, e dependendo do peso ou rank dela, essa pesquisa e mais ampla ou nao....
se você pesquisar por laden com o rank 20 ele encontra mais registros do que o 30 ou 40 .... entende...
e como se voce aumenta-se o rank mais relevancia ele vai ter com nome .....
se você usar um rank de 100 ele tem que buscar um registro igual ao indicado...
entendeu ?
>
explique melhor qual a condição que pretende criar para as consultas.
>
não entendi a dúvida..
a query acima, é mais ou menos assim:
WHERE nome LIKE '%$LADEN%' AND rank >= 20
Na realidade nao existe um campo RANK na tabela.... o rank e nivel de igualdade do campo da tabela com a pesquisa....
Você pode criar funções no MySQL para criar esse "rank" para você.
Um algoritmo conhecido para obter o resultado é a Distância Levenshtein.
No site que você mostra como exemplo ele usa o algoritmo Fuzzy, que tem uma idéia um pouco diferente.
Neste link há a solução completa, usando Levenshtein.
http://stackoverflow.com/questions/5322917/how-to-compute-similarity-between-two-strings-in-mysql
>
Você pode criar funções no MySQL para criar esse "rank" para você.
Um algoritmo conhecido para obter o resultado é a Distância Levenshtein.
No site que você mostra como exemplo ele usa o algoritmo Fuzzy, que tem uma idéia um pouco diferente.
Neste link há a solução completa, usando Levenshtein.
http://stackoverflow.com/questions/5322917/how-to-compute-similarity-between-two-strings-in-mysql
Legal, acho para o que estao pedindo vai ser usado o Fuzzy mesmo, pois trata-se da mesma coisa que este site que coloquei o link faz...
OFAC
Muito Obrigado!
Você fez alguma leitura sobre os algoritmos sugeridos?
>
Você fez alguma leitura sobre os algoritmos sugeridos?
Sim hehe estou lendo ate agora rsrs
>
Sim hehe estou lendo ate agora rsrs
até usei aquela funcao que você indicou, mas o select demora um monte...
SELECT name, levenshtein_ratio(name, 'laden') AS relevancia from ofac_sdn
>
Sim hehe estou lendo ate agora rsrs
até usei aquela funcao que você indicou, mas o select demora um monte...
SELECT name, levenshtein_ratio(name, 'laden') AS relevancia from ofac_sdn
Bom acho que consegui achar a solução :
fiz o sql:
SELECT SDN_id, SDN_name, (levenshtein_ratio(SDN_name, "aden")) AS score
FROM ( SELECT SDN_id, SDN_name FROM ofac_sdn
WHERE sdn_name LIKE "%aden%") AS likeMatches
order by score DESC limit 20
as funcoes mysql são:
CREATE FUNCTION levenshtein( s1 text, s2 text) RETURNS int(11)
DETERMINISTIC
BEGIN
DECLARE s1_len, s2_len, i, j, c, c_temp, cost INT;
DECLARE s1_char CHAR;
DECLARE cv0, cv1 text;
SET s1_len = CHAR_LENGTH(s1), s2_len = CHAR_LENGTH(s2), cv1 = 0x00, j = 1, i = 1, c = 0;
IF s1 = s2 THEN
RETURN 0;
ELSEIF s1_len = 0 THEN
RETURN s2_len;
ELSEIF s2_len = 0 THEN
RETURN s1_len;
ELSE
WHILE j <= s2_len DO
SET cv1 = CONCAT(cv1, UNHEX(HEX(j))), j = j + 1;
END WHILE;
WHILE i <= s1_len DO
SET s1_char = SUBSTRING(s1, i, 1), c = i, cv0 = UNHEX(HEX(i)), j = 1;
WHILE j <= s2_len DO
SET c = c + 1;
IF s1_char = SUBSTRING(s2, j, 1) THEN
SET cost = 0; ELSE SET cost = 1;
END IF;
SET c_temp = CONV(HEX(SUBSTRING(cv1, j, 1)), 16, 10) + cost;
IF c > c_temp THEN SET c = c_temp; END IF;
SET c_temp = CONV(HEX(SUBSTRING(cv1, j+1, 1)), 16, 10) + 1;
IF c > c_temp THEN
SET c = c_temp;
END IF;
SET cv0 = CONCAT(cv0, UNHEX(HEX(c))), j = j + 1;
END WHILE;
SET cv1 = cv0, i = i + 1;
END WHILE;
END IF;
RETURN c;
END
//and for getting it as XX% use this function
CREATE FUNCTION levenshtein_ratio( s1 text, s2 text ) RETURNS int(11)
DETERMINISTIC
BEGIN
DECLARE s1_len, s2_len, max_len INT;
SET s1_len = LENGTH(s1), s2_len = LENGTH(s2);
IF s1_len > s2_len THEN
SET max_len = s1_len;
ELSE
SET max_len = s2_len;
END IF;
RETURN ROUND((1 - LEVENSHTEIN(s1, s2) / max_len) * 100);
END
explique melhor qual a condição que pretende criar para as consultas.