[Lucene] Utilizar mais de um termo para pesquisa

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.

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

Valeu cara…
Funcionou blz…

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.

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

Beleza, jrct!!! Entendido!

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

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.

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.

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

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.

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

Ok, Zé.

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