Suggest Box / autocomplete

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.

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

http://jqueryui.com

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

[quote=victorcosta]o jQueryUI tem um componente desses com suporte a carregar via ajax

http://jqueryui.com[/quote]

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

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

[/quote]

JSF not allowed :confused:

[quote=caiodorn][quote=victorcosta]o jQueryUI tem um componente desses com suporte a carregar via ajax

http://jqueryui.com[/quote]

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

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

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.

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

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

É 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.

[quote=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.[/quote]No método que o JQuery chamar, você não poderia implementar essa lógica em java não?

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:

[code]

AutoComplete
<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>
[/code]

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.

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;

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

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

Abraço.

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.