[Lucene] Utilizar mais de um termo para pesquisa

11 respostas
reizin

Bom dia pessoal…

Seguinte, estou usando Lucene para indexar alguns documento do Word, utilizo 5 termos para identificar um documento.

String [ ] termo = new String [ ] { "leiTipo" , "leiNumero" , "leiAno" , "leiEmenta" };

Mais contents, que recebe além do conteúdo do documento, mais estes 4 termos acima. Formando assim um termo que contém o corpo do documento mais meus próprios termos.

Ao montar a Query, uso o termo contents para a pesquisa:

query = QueryParser.parse (
 					queryString ,
 					"contents" ,
 					analyzer );

Mas está acontecendo o seguinte
[list]Faço uma pesquisa contendo alguma frase que esta no documento. OK - Retorna os documentos que contém a frase que pesquisei[/list]
[list]Então quero restringir à apenas os documentos de 2006, que foi indexado no termo leiAno. Ele me retorna os documento do ano de 2006, mas também documentos que tem a string 2006 no seu corpo.[/list]

Como poderia montar minha query, passando para ela esses outros filtros, como citado acima, trazer documentos com uma frase específica e de determinado ano.

11 Respostas

J

Caro,

A sintaxe do Lucene é simples e no site você acha vários exemplos básicos dos quais se pode partir para algo mais elaborado. Para sua questão, monte uma queryString assim:

+leiAno:2006 +contents:“frase que você quer encontrar”

Isso vai funcionar.

Algumas observações:

  • Colocando o “+” antes de cada campo, torna cada campo obrigatório.
  • Quando você especifica explicitamente o nome do campo na queryString ele ignora o parâmetro “contents” que você passou como segundo parâmetro em QueryParser.parse (). Esse parâmetro serve como default quando você não especifica o campo.

Abs,

José Roberto

reizin

Valeu cara…
Funcionou blz…

F

Reizin, meu rei, beleza!!! Amigo, será que você pode me dar um help?

Rapaz, é o seguinte: estou usando o Lucene 2.0 e quero efetuar algumas pesquisas na minha base de índice, mas tô enrolado. Eu tenho algumas situações de pesquisa, que são as seguintes:

-> pesquisar por documentos que tenham as palavras [color=blue]COMMIT[/color] E [color=blue]ROLLBACK[/color] em seu conteúdo;
-> pesquisar por documentos que tenham a frase [color=blue]SQL SERVER 2005 É O NOVO BANCO DE DADOS DA MICROSOFT[/color] E [color=blue]COMMIT[/color] E [color=blue]ROLLBACK[/color].
-> pesquisar por documentos que tenham a frase [color=blue]SQL SERVER 2005 É O NOVO BANCO DE DADOS DA MICROSOFT[/color] E [color=blue]PERMITE TRANSAÇÕES[/color] E [color=blue]ROLLBACK[/color].

Será que você tem algum código aí que possa me auxiliar?

Desde já, agradeço.

J

Olá Fábio,

Primeiro você tem que saber o nome do campo do índice do Lucene em que você guardou o texto, ou melhor, o índice do texto. Supondo que o o campo se chame “texto”, ficaria algo assim:

-> texto:(+commit +rollback)
-> texto:(+“SQL SERVER 2005 É O NOVO…” +commit + rollback)
-> texto:(+“SQL SERVER 2005 É O NOVO…” +“permite transações” + rollback)

Deu pra entender? Eis algumas dicas:

1 - Quando você quer uma frase exata, coloque o frase entre aspas.

2 - O sinal de mais (+) na frente de cada termo é porque você deseja obrigatoriamente cada um deles.

3 - O campo “texto” que eu inventei neste exemplo poderia ser omitido se você, ao chamar o método QueryParser.parse, especificá-lo no segundo parâmetro.

Em

http://lucene.apache.org/java/docs/queryparsersyntax.html

tem as regras bem explicadas.

Abs,

José Roberto

F

Beleza, jrct!!! Entendido!

Vou ver agora.
Abraço e muito obrigado!!!

F

Caro José Roberto,

Usei as sintaxes que você indicou, mas não funcionou da forma que eu queria. Por exemplo, enviei a pesquisa:

-> (conteudo:+XML +“José Roberto”) OR (titulo:+XML +“José Roberto”)

Eu gostaria que o Lucene me retornasse documentos que tivessem OBRIGATORIAMENTE AMBOS OS TERMOS ([color=blue]XML e José Roberto[/color]) no seu conteúdo ou no seu título, mas ele me retorna documentos que possuem XML e/ou José Roberto. O que pode estar acontecendo? Será que estou indexando errado ou a consulta está errada? Estou usando o Lucene 2.0.

Desde já, agradeço.

F

José Roberto,

Para deixar mais claro a forma que estou indexando, segue abaixo um trecho do código:

doc.add(new Field(“co_pagina”, coPagina.toString(), Field.Store.YES, Field.Index.UN_TOKENIZED));

doc.add(new Field(“endereco”, url, Field.Store.YES, Field.Index.TOKENIZED));

doc.add(new Field(“titulo”, titulo, Field.Store.YES, Field.Index.TOKENIZED));

doc.add(new Field(“conteudo”, conteudo, Field.Store.YES, Field.Index.TOKENIZED));

Abraço.

J

Olá Fabio! Desculpe pela demora. Estive enrolado.

Cara, sua indexação parece estar correta. O que está errado é a sua query mesmo.

Desse jeito que vc escreveu:

(conteudo:+XML +“José Roberto”) OR (titulo:+XML +“José Roberto”)

irá acontecer exatamente o que vc descreveu. Para retornar o que vc quer é só mudar a query para isso:

conteudo:(+XML +“José Roberto”) OR titulo:(+XML +“José Roberto”)

Sacou porque?

Abs,

José Roberto

F

Zé,

Você já usou a biblioteca Highlighter para o Lucene? Rapaz, é o seguinte: eu tenho um texto indexado e, COM TODA CERTEZA, existem os termos, por exemplo, XML e José Roberto. No entanto, quando utilizo o método getBestFragments(tokenStream, MeuCampoDePesquisa, 3, “…”), ele não tá mostrando o techo onde aparece XML. Lembrando que José Roberto está no início do texto e XML no final Será algum bug dele?

Desde já, agradeço.

J

Olá Fabio,

desta vez não tenho como te ajudar pois nunca usei essa biblioteca pois nunca me interessou. Só posso lhe sugerir que consulte aquele tal de Google. :roll:

Abraços,

José Roberto

F

Ok, Zé.

Você já ajudou muito.
Muito obrigado e até a próxima!

Criado 5 de janeiro de 2007
Ultima resposta 28 de jan. de 2007
Respostas 11
Participantes 3