Suggest Box / autocomplete

16 respostas
caiodorn

Alguém conhece uma solução parecida com a busca do Google, open source, feita com AJAX?

Encontrei milhares de suggest boxes, mas eu preciso que a ordem das palavras não interfira :?: no resultado.

Por exemplo:

Input -> africa south
Suggestion -> south africa

Nos exemplos que encontrei, só retornaria uma sugestão se o usuário tivesse digitado “south”, “africa”, ou “south africa”.

Se alguém tiver uma luz…

Abraço.

16 Respostas

victorcosta

o jQueryUI tem um componente desses com suporte a carregar via ajax

http://jqueryui.com

Hebert_Coelho

Se você estiver utilizando JSF aqui tem um exemplo: Aplicação Web Completa Tomcat JSF Primefaces JPA Hibernate.

caiodorn

victorcosta:
o jQueryUI tem um componente desses com suporte a carregar via ajax

http://jqueryui.com

Pois é, o problema é que o componente deles esbarra no problema citado por mim quando abri o tópico, infelizmente. Senão, seria perfeito.

caiodorn

jakefrog:
Se você estiver utilizando JSF aqui tem um exemplo: Aplicação Web Completa Tomcat JSF Primefaces JPA Hibernate.

JSF not allowed :confused:

victorcosta

caiodorn:
victorcosta:
o jQueryUI tem um componente desses com suporte a carregar via ajax

http://jqueryui.com

Pois é, o problema é que o componente deles esbarra no problema citado por mim quando abri o tópico, infelizmente. Senão, seria perfeito.

Nunca usei o autocomplete do jQuery via Ajax, mas creio que ele vá exibir os resultados que forem retornados do seu servidor, ele não vai obrigar que esteja na ordem a menos que você obrigue isso na sua query

No caso o que você precisaria era de um full text search ao invés de usar LIKE na query, por exemplo, no MySQL seria WHERE MATCH(nome) AGAINST (’+south +africa’ IN BOOLEAN MODE) no caso de obrigar as 2 palavras estarem presentes. Vê como é no seu banco e se preciso teria que usar software separado tipo o Lucene

caiodorn

Se eu pesquisasse por “africa south”, o teu exemplo retornaria as sugestões? Eu preciso que a sugestão seja dada ao usuário independemente da ordem das palavras. Sou novato em programação (como talvez tenha percebido), se tu me disser que é possível modificar o algoritmo de modo a atender meu requisito eu darei uma olhada mais a fundo nisso.

Abraço.

caiodorn

Não estou certo que o resultado é mero resultado de uma query, mas vou ver. Vlw.

victorcosta

Quando você diz feito via AJAX você quis dizer que é obrigatório que ele vá no servidor buscar os resultados? Tipo porque tem 1 milhão de registros e seria inviável passar eles todos para o autocomplete. É porque o significado de AJAX é isso, fazer requisição assíncrona pro servidor, mas não sei se você quis dizer isso ou se passando tudo de uma vez e fazendo a filtragem no browser tá OK pra você, talvez consigo desenrolar dessa última forma também

caiodorn

É o seguinte: o resultado de algo do tipo SELECT * FROM é armazenado em buffer em um servidor. Novas consultas são realizadas pelo servidor a cada nova inserção no BD. Os clientes consultarão do buffer, sem SQL envolvido - a parte de banco é com o server. Eu preciso que esse campo de busca me dê sugestões a partir de uma ou mais keywords, não importando a ordem das palavras digitadas pelo usuário. Se eu digitar “Porto Alegre” ou “alegre porto”, a sugestão deverá ser idêntica.

Hebert_Coelho

caiodorn:
É o seguinte: o resultado de algo do tipo SELECT * FROM é armazenado em buffer em um servidor. Novas consultas são realizadas pelo servidor a cada nova inserção no BD. Os clientes consultarão do buffer, sem SQL envolvido - a parte de banco é com o server. Eu preciso que esse campo de busca me dê sugestões a partir de uma ou mais keywords, não importando a ordem das palavras digitadas pelo usuário. Se eu digitar “Porto Alegre” ou “alegre porto”, a sugestão deverá ser idêntica.
No método que o JQuery chamar, você não poderia implementar essa lógica em java não?

victorcosta
Fiz um teste aqui, com o autocomplete totalmente no browser e seguindo o comportamento que você quer. O que ele exibe depende puramente do que a query retorna (no meu caso, do código Javascript). Segue o exemplo:
<!DOCTYPE html>
<html>
	<head>
		<title>AutoComplete</title>
		<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" />
		<link media="screen" rel="stylesheet" type="text/css" href="jquery-ui-1.8.21.custom.css"/>
		<script type="text/javascript" src="jquery-1.7.2.min.js"></script>
		<script type="text/javascript" src="jquery-ui-1.8.21.custom.min.js"></script>
	</head>
	
	<body>
		<input type="text" id="search" name="search"/>
		
		<script type="text/javascript">	
			var cidades = ['Porto Alegre', 'Porto Velho', 'Recife', 'São Paulo', 'Rio de Janeiro'];
			
			$(document).ready(function() {
				$('#search').autocomplete({ delay: 0, source: function(request, response) {
					var tokens = $.trim(request.term).split(/\s+/);
					
					response($.grep(cidades, function(cidade) {
						var match = true;
						$.each(tokens, function(i, token) {
							if (!cidade.match(new RegExp('.*' + token + '.*', 'i'))) match = false;
						});
						return match;
					}));
				}});
			});
		</script>
	</body>
</html>
caiodorn

Obrigado pela prestatividade, não esperava por isso. Resolveu em parte o problema… vou tentar modificar.

Digamos que eu digite “Alegre Porto São”, vê o que acontece heheh.

Abraço.

victorcosta

Eu fiz com que fosse obrigatório ter todas as palavras. Não tem nenhuma cidade que tem as três palavras “Alegre Porto São” por isso aparece nenhum

O código pra aceitar contanto que qualquer palavra exista é esse

var match = false; $.each(tokens, function(i, token) { if (cidade.match(new RegExp('.*' + token + '.*', 'i'))) match = true; }); return match;

P

O que vc precisa é busca fonética, apenas isso !

caiodorn

Exatamente! Muito obrigado, cara… agora a gente se descabela pra casar essa função com nossa fonte de dados hehe

Abraço.

caiodorn

Pois é, um colega já passou por aqui e falou isso hehe como estou iniciando, não me diz muita coisa.

Mas o código do Victor quebrou o galho.

Criado 2 de julho de 2012
Ultima resposta 2 de jul. de 2012
Respostas 16
Participantes 4