Soundex

17 views
Skip to first unread message

Ricardo Borges

unread,
Jul 24, 2016, 7:40:54 PM7/24/16
to nhibernate-br
Pessoal,

Alguém já implementou alguma busca fonética? Testei a função soundex não é muito precisa para o nosso português.


thanks

Juliano Oliveira

unread,
Jul 25, 2016, 10:19:14 AM7/25/16
to nhiber...@googlegroups.com
Ricardo,

Qual sua necessidade? Melhor do que alguém te auxiliar sobre uma feature específica é te ajudar com a melhor feature para atender a sua necessidade. Do que você está precisando?

Att,

Juliano Oliveira

--
Você recebeu essa mensagem porque está inscrito no grupo "NHibernate-Br" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para nhibernate-b...@googlegroups.com.
Para postar nesse grupo, envie um e-mail para nhiber...@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/nhibernate-br.
Para mais opções, acesse https://groups.google.com/d/optout.

Ricardo Borges

unread,
Jul 25, 2016, 7:41:51 PM7/25/16
to nhibernate-br
Juliano, verdade!

Eu já tenho uma base no SQL Server de nomes. Preciso fazer uma pesquisa pelo nome, mas considerando a fonética da palavra permitindo que o usuário não precise digitar a grafia exata do nome.

Exemplos:

Sofia, Sophia; 
Denise, Denize;
Eric, ErikErick


Desculpem, eu sei que não é uma dúvida direta do NHibernate.



Paulo Quicoli

unread,
Jul 25, 2016, 7:47:10 PM7/25/16
to nhiber...@googlegroups.com
Cara... eu resolvi isso da seguinte forma: via software.

Tenho em minha entidade uma propriedade "NomeFonetico" que armazena o código fonetico.
Esse codigo é gerado por uma classe minha (c#) que faz essa conversão... já uso há um bom tempo que uso ela e não tive problema ainda....

Se quiser te passo minha classe.


Ricardo Borges

unread,
Jul 25, 2016, 7:58:53 PM7/25/16
to nhibernate-br
Paulo, muito bom, você pode compartilhar? Resolve meu problema!


Paulo Quicoli

unread,
Jul 25, 2016, 8:38:42 PM7/25/16
to nhiber...@googlegroups.com

Juliano Oliveira

unread,
Jul 26, 2016, 9:11:25 AM7/26/16
to nhiber...@googlegroups.com
Ricardo,

Tu conheces o NHibernate Search, baseado no Lucene.NET?
Eu nunca trabalhei com busca fonética que existe nos servidores de bancos de dados, até para que eu não fique preso a um banco de dados específico. Para fazer uma pesquisa por palavras eu uso o NHibernate Search. Com um pouco de esforço você consegue até criar o recurso "Você quis dizer: xyz". Ou seja, o usuário busca por "espaso" e o você pode retornar uma pesquisa com "Você quis dizer: espaço".

Qualquer coisa fico a disposição.

Abraço,

Juliano Oliveira

Ricardo Borges

unread,
Jul 26, 2016, 7:25:50 PM7/26/16
to nhibernate-br

Amigo Juliano, eu já vi o Lucene funcionando num projeto, mas já peguei ele rodando, não meti a mão nele.

Bom saber que existe esse projeto NH Search, já ouvi falar brevemente.

Você indexa no Lucene o conteúdo da base?

Juliano Oliveira

unread,
Jul 27, 2016, 9:39:29 AM7/27/16
to nhiber...@googlegroups.com
Sim,

O core do NH Search são listeners que interceptam os comandos de persistência (INSERT, UPDATE, DELETE) e de acordo com os decorators que devem estar contidos no seu modelo, grava as informações nos indexes via Lucene. O NH Search também implementa um recurso onde você pode faz a pesquisa. Esta pesquisa retorna para os ID´s das entidades em que a pesquisa ao index encontrou relevância e assim ao fazer a consulta no banco das entidades ele faz a SELECT indicando diretamente o campo identity que é um index clusterizado no banco de dados (no caso de SQL Server), portanto, a consulta fica muito (mas muito mesmo) rápida.

Resumindo:

Você faz uma pesquisa (imagine um blog onde você quer pesquisar a entidade Post). Você quer pesquisar posts que tenham no conteúdo do post a palavra "nhibernate" (para o Lucene, um índice não-tokenizado) e que o autor tenha no nome a palavra "borges" (pesquisando um índice tokenizado):

search.CreateFullTextQuery<Post>("nhibernate Autor.Nome:borges").List<Post>()

Isso retornaria, por exemplo, que as entidades Post com o campo id igual a 10, 15, 31 e 46 são relevantes para a pesquisa. Logo, o NHibernate irá fazer a seginte consulta SQL retornando as entidades:

SELECT * FROM Posts WHERE PostId IN (10,15,31,46) <- Isso é muito rápido

Entendeu?

Se você tem uma base pronta e implementar o NH Search, você terá que "atualizar" o índice de alguma forma, por exemplo, fazendo um processo varrendo todas as entidades e fazendo um update qualquer em todas as entidades apenas para os interceptors receberem as entidades e atualizarem o índice (deve existir uma forma amis elegante de fazer isso mas eu não conheço, ainda...).

O NH Search é "plugado" ao Lucene.Net, no lucene você vai configurar ele para que ele entenda que o conteúdo indexado está em português. Isso é importante para que ele, ao indexar o conteúdo, ele irá "quebrar" as palavras antes de indexar. Com "quebrar", quero dizer que ele irá pegar as palavras que terminam com "S" (plural) e irá remover o "S", palavras que terminam com "ão" também são indexadas sem este sulfixo, o Lucene irá "limpar" as palavras para que a pesquisa seja mais precisa. O Lucente também remove "stop-words", palavras com "a", "o", "para", "em". Na hora de fazer a pesquisa ele também limpa o texto que você está tentando pesquisar.

Um conteúdo bastante exclarecedor sobre NHibernate Search:

Lembrando que o Lucene (do Java) é utilizada até hoje em grandes projetos, fazendo parte inclusive do core desses projetos. Exemplos:
Apache Solr 

Elasticsearch

Abraço,

Juliano Oliveira

Ricardo Borges

unread,
Jul 27, 2016, 12:38:34 PM7/27/16
to nhibernate-br
Juliano,

Muito legal, o Lucene sem dúvidas é fantástico... Mas, o meu problema por enquanto é apenas uma busca fonética. A velocidade da pesquisa ainda é bem aceitável, pela indexação do SQL Server. Quando precisar de mais escalabilidade, o Lucene vai estar na lista de opções!

Obrigado pela dica, realmente o NH Search já faz uma ponte excelente entre eles.


Reply all
Reply to author
Forward
0 new messages