Problemas com plugin searchable para indexar campos com números
14/06/2012 20:38
0
Olá, pessoal.

Alguém aqui que já tenha utilizado o plugin Searchable conseguiu indexar atributos numéricos? Quando faço uma busca em campos numéricos (um número de telefone, por exemplo), o método search retorna um erro.

Agradeço se alguém tiver alguma dica para contornar essa situação.

Abraços
Tags: searchable, números, index


0
Olá, Carlos.

Amigo, na boa, qual seria a motivação em indexar campos numéricos numa busca textual?

Até onde eu sei e já usei o Hibernate Search essa funcionalidade é basicamente para evitar os "likes" em campos TEXTO. Para campos números não consigo ver motivo pra usar busca textual.


0
Olá, Yoshiriro.

O campo não é numérico. Ele deve ser indexado como texto. Imagine uma agenda de telefones ou um banco de dados com informações de tráfegos de serviços telefônicos (uma conta de celular corporativo, com mais de 500 usuários, por exemplo...). Realmente seria um absurdo fazer uma consulta do campo de valor gasto. Mas seria interessante consultar uma determinada linha de telefone, do qual você não sabe o nome do usuário.

Por exemplo, imagine que o gerente de uma empresa receba sua conta de celular corporativo no valor de R$ 1.000.000,00. Só R$ 500.000,00 foram custos da linha (21)333-4444. Uma vez que tenho essa conta online processada no meu sistema, posso disponibilizar a consulta pelo número de telefone. Essa é minha necessidade.

Outro exemplo: Imagine que um determinado plano contratado da operadora TIM corresponde à 70% dos gastos de uma empresa. O nome do plano é "Plano corporativo fale à vontade 223". Vamos supor que o gerente queira consultar os valores desse plano e exibir seus custos em um Google Charts, por exemplo. Ele então quer digitar apenas "223", para não perder tempo. Esse é o problema que estou enfrentando. A busca funciona sem problemas com todos os campos marcados como indexados, exceto os que contém números. Se eu digitar qualquer número, dá erro.

Obrigado!
15/06/2012 00:12


1
Olá, Carlos.

Bem, só conclui que era numérico pela sua frase: "Alguém aqui que já tenha utilizado o plugin Searchable conseguiu indexar atributos numéricos?"

Agora, ao problema em questão: até onde sei esses mecanismos de indexação para busca textual fazem sua indexação pelas diferentes PALAVRAS nos campos.

Ora, o valor 3333-4444 é uma palavra só, pelo que enxergo e não 2. Assim, não sei se a indexação seria efetiva. Talvez se tentasse indexar de forma diferente de como está na base (no Hibernate Search isso é possível).
Ex: Na base: "(91)2333-4545". Indexado como "91 2333 4545".

Não se se pode fazer isso no Searchable Plugin porque nunca o usei. Qual o erro que dá pra você?

Abraços.


0
Opa!

Então, coloquei o número acima com parenteses e hífen apenas como ilustração. Na verdade, tenho um atributo String chamado "linha" e nele apenas números são persistidos, por exemplo: 2133334444. A busca neste caso retorna um erro. Mesmo o campo sendo um String, ao digitar números como parâmetros de uma busca, um erro é retornado. Já olhei a documentação e não encontrei nada sobre isso :-(

Obrigado!
15/06/2012 12:10


0
Então, amigo... se puder mandar o Stacktrace do erro ajuda muito.

Se não for pedir muito, ver a configuração também pode ser de grande ajuda.

Abraços.


0
Opa, Yoshiriro!

Segue o StackTrace:

Error 2012-06-18 10:29:04,340 [http-bio-7070-exec-1] ERROR lucene.LuceneUtils - Failed to create instance of Analyzer class [class org.apache.lucene.analysis.WhitespaceAnalyzer]: org.apache.lucene.queryParser.ParseException: Cannot parse '': Encountered "<EOF>" at line 1, column 0.
Was expecting one of:
<NOT> ...
"+" ...
"-" ...
"(" ...
"*" ...
<QUOTED> ...
<TERM> ...
<PREFIXTERM> ...
<WILDTERM> ...
"[" ...
"{" ...
<NUMBER> ...
<TERM> ...
"*" ...

Message: Cannot parse '': Encountered "<EOF>" at line 1, column 0.
Was expecting one of:
<NOT> ...
"+" ...
"-" ...
"(" ...
"*" ...
<QUOTED> ...
<TERM> ...
<PREFIXTERM> ...
<WILDTERM> ...
"[" ...
"{" ...
<NUMBER> ...
<TERM> ...
"*" ...
Line | Method
->> 175 | parse in org.apache.lucene.queryParser.QueryParser
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 190 | realTermsForQueryString in grails.plugin.searchable.internal.lucene.LuceneUtils
| 165 | realTermsForQueryString in ''
| 236 | toSuggestedQueryString in grails.plugin.searchable.internal.compass.search.DefaultSuggestQueryMethod$SuggestedQueryStringBuilder
| 135 | doInCompass . . . . . . in grails.plugin.searchable.internal.compass.search.DefaultSuggestQueryMethod$SuggestQueryCompassCallback
| 133 | execute in org.compass.core.CompassTemplate
| 57 | doInCompass . . . . . . in grails.plugin.searchable.internal.compass.support.AbstractSearchableMethod
| 86 | invoke in grails.plugin.searchable.internal.compass.search.DefaultSuggestQueryMethod
| 172 | addSuggestedQuery . . . in grails.plugin.searchable.internal.compass.search.DefaultSearchMethod$SearchCompassCallback
| 142 | doInCompass in ''
| 133 | execute . . . . . . . . in org.compass.core.CompassTemplate
| 57 | doInCompass in grails.plugin.searchable.internal.compass.support.AbstractSearchableMethod
| 66 | invoke . . . . . . . . in grails.plugin.searchable.internal.compass.search.DefaultSearchMethod
| 42 | doCall in grails.plugin.searchable.internal.compass.domain.DynamicDomainMethodUtils$_attachDynamicMethods_closure1
| 21 | doCall . . . . . . . . in relatorios.DetalhamentoController$_closure1
| 1110 | runWorker in java.util.concurrent.ThreadPoolExecutor
| 603 | run . . . . . . . . . . in java.util.concurrent.ThreadPoolExecutor$Worker
^ 722 | run in java.lang.Thread
| Error 2012-06-18 10:29:04,401 [http-bio-7070-exec-1] ERROR core.CompassTemplate - Failed to rollback transaction, ignoring
Message: Search engine transactionProcessor already rolled back while trying to perform an operation
Line | Method
->> 139 | verifyWithinTransaction in org.compass.core.lucene.engine.LuceneSearchEngine
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 171 | rollback in ''
| 118 | doRollback . . . . . . in org.compass.core.transaction.LocalTransaction
| 54 | rollback in org.compass.core.transaction.AbstractTransaction
| 139 | execute . . . . . . . . in org.compass.core.CompassTemplate
| 57 | doInCompass in grails.plugin.searchable.internal.compass.support.AbstractSearchableMethod
| 66 | invoke . . . . . . . . in grails.plugin.searchable.internal.compass.search.DefaultSearchMethod
| 42 | doCall in grails.plugin.searchable.internal.compass.domain.DynamicDomainMethodUtils$_attachDynamicMethods_closure1
| 21 | doCall . . . . . . . . in relatorios.DetalhamentoController$_closure1
| 1110 | runWorker in java.util.concurrent.ThreadPoolExecutor
| 603 | run . . . . . . . . . . in java.util.concurrent.ThreadPoolExecutor$Worker
^ 722 | run in java.lang.Thread


Método:

def busca = {

if(params.q){
try{
params.suggestQuery = true
flash.message = "Resultado da busca para: ${params.q}"
def resultsMap = ContaDetalhe.search(params.q, params)
render(view:'index', model:[contaDetalheInstanceList:resultsMap.results, contaDetalheInstanceTotal:ContaDetalhe.countHits(params.q), resultadoBusca: resultsMap])

}catch(e){
render(view:'index',
model:[contaDetalheInstanceList:[], contaDetalheInstanceTotal: 0])}
}else{
params.max = Math.min(params.max ? params.int('max') : 10, 50)
render(view:'index', model:[contaDetalheInstanceList: ContaDetalhe.list(params), contaDetalheInstanceTotal: ContaDetalhe.count()])
}
}


Obrigado!!
18/06/2012 13:39


1
Amigo, já me deparei com erros semelhantes usando o Hibernate Search, que, assim como esse plugin ai usa o Lucene "por baixo".

Parace-me que a query de consulta em "linaguagem lucene" foi mal montada. Já tentou cadastrar um numero telefonico como "jose silva" e depois pesquisar por "jose" ou "silva" pra ver se o erro persiste? Talvez o fato de armazenar números, mesmo que numa String, possa "confundir" o plugin (nesse caso, seria um bug do plugin).


0
Pois é... Os outros atributos da classe também estão mapeados e não retornam erro. Sempre retornam o resultado correto. Mas ao fazer consultas com números, recebo este erro.

Uma pena, porque ia ser uma mão na roda se estivesse funcionando. Se o mapeamento só funciona em determinados atributos, o plugin perde a utilidade para esse projeto :-(

De qualquer forma, muito obrigado pelas dicas!

Abraços.
18/06/2012 18:10



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto