Está en la página 1de 11

UPC

Conocimiento en Lnea
Lucene: Tutorial
Version 0.2

Conocimiento en Lnea
Version: 0.2
Lucene: Tutorial Date: 06/03/2009
Conocimiento-en-Linea - Lucene: Tutorial
Revision Histrica
Date Version Description Author
06/03/2009 0.2 Creacin del documento. Inclue:
Introduccin! In"ormacin #eneral
o$eraciones %&sicas con el Inde'(riter
e Inde')earc*er.
I+&n ,lonso -ern&nde. Ca+ero
Con"idencial /0C! 2012 0a#e 2 o" 11
Conocimiento en Lnea
Version: 0.2
Lucene: Tutorial Date: 06/03/2009
Conocimiento-en-Linea - Lucene: Tutorial
ndice
1. Introduccin 2
1.1 0ro$sito 2
1.2 ,lcance 2
1.3 De"iniciones! ,crnimos! and ,%re+iaciones 2
1.2 3esumen 2
2. In"ormacin 4eneral 2
2.1 Vista de Lucene 2
2.2 Descar#a 5
2.3 Documentacin e In"ormacin 5
3. 6$eraciones con el Inde'(riter 6
3.1 Iniciali.ar el Inde'(riter 6
3.2 Clase ,nal.er 6
3.3 Document Class -ield Class 6
3.2 7scri%ir en el ndice 8
3.5 9orra un documento del ndice 8
2. 6$eraciones con el Inde')earc*er 8
2.1 Clase :uer0arser clase :uer 8
2.2 3eali.ar la %us;ueda con To$DocCollector <
2.3 3eali.ar la %us;ueda con =itCollector <
2.2 Dar "ormato a los resultados 9
5. 0arsers 10
Con"idencial /0C! 2012 0a#e 3 o" 11
Conocimiento en Lnea
Version: 0.2
Lucene: Tutorial Date: 06/03/2009
Conocimiento-en-Linea - Lucene: Tutorial
Lucene: Tutorial
1. ntroduccin
Lucene es un motor de %>s;ueda de alto rendimiento escrito en ?a+a es 6$en )ource. 7s escala%le lo#ra
su alto rendimiento mediante el uso de ndices. Tiene al#oritmos de %>s;ueda e"icientes. 7stos al#oritmos
$ermiten ran@ear los resultados A*aciendo $osi%le o%tener $rimero los meBores resultadosCD *acer $*rase
;ueries! Eildcard ;ueries! $ro'imit ;ueries! ran#e ;ueries m&sD %>s;uedas $or cam$osD ordenar $or
cual;uier cam$oD %>s;uedas a m>lti$les ndices uniFndolos.
1.1 Pro!sito
7l $ro$sito de este documento es documentar todos los conocimientos o%tenidos con Lucene durante el
desarrollo del 0roecto Conocimiento en Lnea.
1.2 "lcance
7l $resente documento tiene como alcance e'$licar solo las "uncionalidades utili.adas con Lucene $ara el
desarrollo del 0roecto Conocimiento en Lnea.
1.# $e%iniciones& "crnimos& and "'reviaciones
ndice: 7l ndice de una %ase de datos es una estructura de datos ;ue meBora la +elocidad de las
o$eraciones! $ermitiendo un r&$ido acceso a los re#istros de una ta%la. ,l aumentar dr&sticamente la
+elocidad de acceso! se suelen usar so%re a;uellos cam$os so%re los cuales se *a#an "recuentes %>s;uedas.
Campo o Field G Columna de una ta%la.
Query G Consulta.
1.( Resumen
0rimero se dar& a conocer una +ista #eneral de Lucene su ar;uitectura. Lue#o se e'$licara las o$eraciones
de inde'amiento %>s;ueda mediante el uso del Inde'(riter e Inde')earc*er. -inalmente! se e'$licara el
uso de los $arsers.
2. n%ormacin )eneral
2.1 Vista de Lucene
Hota: los $arsers no son $arte de Lucene. /no mismo de%e con+ertir los documentos a te'to.
Con"idencial /0C! 2012 0a#e 2 o" 11
Conocimiento en Lnea
Version: 0.2
Lucene: Tutorial Date: 06/03/2009
Conocimiento-en-Linea - Lucene: Tutorial
Vista l#ica del ndice
-luBo de una %>s;ueda
2.2 $escar*a
0uede descar#ar la >ltima +ersin de Lucene a;u: *tt$://EEE.a$ac*e.or#/dn/closer.c#i/lucene/Ba+a/
2.# $ocumentacin e n%ormacin
Documentacin: *tt$://lucene.a$ac*e.or#/Ba+a/2I2I0/#ettin#started.*tml
?a+aDocs: *tt$://lucene.a$ac*e.or#/Ba+a/2I2I0/a$i/inde'.*tml
(i@i: *tt$://Ei@i.a$ac*e.or#/lucene-Ba+a
Con"idencial /0C! 2012 0a#e 5 o" 11
Conocimiento en Lnea
Version: 0.2
Lucene: Tutorial Date: 06/03/2009
Conocimiento-en-Linea - Lucene: Tutorial
#. +!eraciones con el nde,-riter
#.1 niciali.ar el nde,-riter
7sta clase $ermite reali.ar todas las o$eraciones ;ue mani$ula el ndice. 0rimero se de%e crear un o%Beto de
esta clase $as&ndole como $ar&metro la ruta del ndice! el anali.ador A7'$licado en la seccin 3.2C a usar.
,nal.er anal.er G neE )$anis*,nal.erACD
)trin# inde'0at* G JC://lucene//inde'DirK
Inde'(riter Eriter G neE Inde'(riterAinde'0at*! anal.erCD
#.2 Clase "nal/.er
7sta clase sir+e como "iltro cuando se inde'a el te'to. 0or eBem$lo! en este $roecto se uso una clase
llamada )$anis*,nal.er ;ue e'tiende a ,nal.er usa "iltros $ara omitir $ala%ras ;ue no ;ueremos
inde'ar como JestasK! JcomoK! JirK! JaK! J%K JcK! etc. 7stas $ala%ras no sir+en $ara reali.ar una %>s;ueda.
,s mismo! e'isten otros "iltros ;ue se le $ueden aLadir como omitir caracteres es$eciales o con+ertir todo
a min>sculas. Lista de anal.ers: 9ra.ilian,nal.er! C*inese,nal.er! C?M,nal.er! C.ec*,nal.er!
Dutc*,nal.er! -renc*,nal.er! 4erman,nal.er! 4ree@,nal.er! MeEord,nal.er! 0attern,nal.er!
0er-ield,nal.er(ra$$er! :uer,uto)to$(ord,nal.er! 3ussian,nal.er! )*in#le,nal.er(ra$$er!
)im$le,nal.er! )noE%all,nal.er! )tandard,nal.er! )to$,nal.er! T*ai,nal.er
(*ites$ace,nal.er.
#.# $ocument Class / 0ield Class
0ara $oder inde'ar uno de%e tener o%Betos del ti$o Document. 7stos documentos est&n com$uestos de
cam$os llamados -ield.
7Bem$lo:
$ri+ate Document createDocumentA)trin# "ileHame! )trin# a%solute0at*! )trin# user!
)trin# date! )trin# re+ision! )trin# contentC N
Document doc G neE DocumentACD
doc.addAneE -ieldAOContenidoO! content! -ield.)tore.P7)!
-ield.Inde'.T6M7HIQ7DCCD
doc.addAneE -ieldAOHom%reO! "ileHame! -ield.)tore.P7)!
-ield.Inde'./HIT6M7HIQ7DCCD
doc.addAneE -ieldAO3utaO! a%solute0at*! -ield.)tore.P7)!
-ield.Inde'./HIT6M7HIQ7DCCD
doc.addAneE -ieldAO/suarioO! user! -ield.)tore.P7)!
-ield.Inde'./HIT6M7HIQ7DCCD
doc.addAneE -ieldAO-ec*aO! date! -ield.)tore.P7)!
-ield.Inde'./HIT6M7HIQ7DCCD
doc.addAneE -ieldAO3e+isionO! re+ision! -ield.)tore.P7)!
-ield.Inde'./HIT6M7HIQ7DCCD
return docD
R
7ste mFtodo crea un documento aLadiendo cam$os como Hom%re! 3uta! su contenido! el usuario! la "ec*a
Con"idencial /0C! 2012 0a#e 6 o" 11
Conocimiento en Lnea
Version: 0.2
Lucene: Tutorial Date: 06/03/2009
Conocimiento-en-Linea - Lucene: Tutorial
la re+isin a la ;ue $ertenece el documento. Los $ar&metros $ara crear un -ield son: 7l nom%re del
cam$o! el +alor del cam$o! un -ield.)tore ;ue $re#unta si se +a a ser almacenado el cam$o! "inalmente
-ield.Inde' ;ue $uede tener los si#uientes +alores:
,H,LPQ7D: 0asa $or el "iltro! el anal.er.
H6: no ser& inde'ado el contenido.
H6TI,H,LPQ7D: Ho $asa $or el "iltro! el anal.er.
#.( 1scri'ir en el ndice
7scri%ir en el ndice es sencillo. /na +e. ;ue se a creado el documento se llama al mFtodo
addDocumentASC
Document G createDocumentAJ-ile.t'tK! JC://lucene//dataDir//-ile.t'tK! JTe;uilaI9ur$K!
J06/03/2009K! J55K! J7ste es un arc*i+e de te'to de $rue%aKCD
Eriter.addDocumentAdocCD
Eriter.o$timi.eACD
Eriter.closeACD
)iem$re ;ue se termine de usar el Inder(riter se o$timi.a cierra.
#.2 3orra un documento del ndice
0ara %orral del ndice solo se necesita esta lnea de comando:
)trin# a%solute0at* G J/0roecto/lucene/arc*i+e.docK
Eriter.deleteDocumentsAneE TermAO3utaO! a%solute0at*CCD
7n este eBem$lo se %orra todos los documentos ;ue sean i#uales al a%solute0at* en el cam$o J3utaK
(. +!eraciones con el nde,4earc5er
7sta clase $ermite *acer todas las o$eraciones de consultas al ndice. 0ara construirlo se $asa como
$ar&metro la ruta en donde se encuentra el ndice.
Inde')earc*er searc*er G neE Inde')earc*erAJC://lucene//inde'DirKCD
(.1 Clase 6uer/Parser / clase 6uer/
7stas clases $ermiten construir una consulta. 7l si#uiente eBem$lo muestra como se *ace una consulta en
donde se desea %uscar la $ala%ra JI+anK en el cam$o JHom%reK.
)trin# "ield G JHom%reKD
)trin# )earc*-ield G JI+anKD
,nal.er anal.er G neE )$anis*,nal.erACD
:uer0arser $arser G neE :uer0arserA"ield! anal.erCD
:uer ;uer G $arser.$arseA)earc*-ieldCD
Con"idencial /0C! 2012 0a#e 8 o" 11
Conocimiento en Lnea
Version: 0.2
Lucene: Tutorial Date: 06/03/2009
Conocimiento-en-Linea - Lucene: Tutorial
(.2 Reali.ar la 'us7ueda con To!$ocCollector
7sta clase $ermite recolectar los documentos m&s rele+antes en el ndice se#>n la consulta. Ho es
recomenda%le $asar como $ar&metro un n>mero ele+ado de resultados! $or;ue $uede in"luir en el rendimiento.
Todo de$ende de la $otencial del ser+idor o la cantidad necesaria de resultados ;ue se necesite.
int ma'*its G 300D
To$DocCollector collector G neE To$DocCollectorAma'*itsCD
7Bem$lo com$leto:
$u%lic static )coreDocTU )earc*A)trin# )earc*-ield! )trin# "ieldC t*roEs 7'ce$tion N
)coreDocTU scoreDocs G nullD
Inde')earc*er searc*er G nullD
tr N
Con"i#)in#leton B$ G Con"i#)in#leton.#etInstanceACD
searc*er G neE Inde')earc*erAB$.#etInde'DirACCD
,nal.er anal.er G )$anis*,nal.er.#etInstanceACD
:uer0arser $arser G neE :uer0arserA"ield! anal.erCD
:uer ;uer G $arser.$arseA)earc*-ieldCD
To$DocCollector collector G neE To$DocCollectorAInte#er.$arseIntAB$.#etVa'=itsACCCD
searc*er.searc*A;uer! collectorCD
scoreDocs G collector.to$DocsAC.scoreDocsD
R catc* A7'ce$tion eC N
t*roE eD
R
return scoreDocsD
R
,;u se e'trae todos los $unteros ;ue *icieron matc* con la consulta. Con"i#)in#leton es una clase ;ue tiene
en memorial as $ro$iedades de la a$licacin.
(.# Reali.ar la 'us7ueda con HitCollector
7sta es una clase de %aBo ni+el. , di"erencia del To$DocCollector esta clase no de+uel+e los documentos
con un ni+el de rele+ancia $ero de+uel+e todos los documentos ;ue *icieron matc* con la consulta Asolo
sus $unterosC. )e recomienda usar esta clase si se ;uiere tener todos los resultados! $ero solo se recomienda
iterar so%re los resultados necesarios. Vas es$eci"ico! no llamar a )earc*er.docAintC or
Inde'3eader.documentAintC so%re cada documento.
"inal ListWInte#erX tem$=its G neE ,rraListWInte#erXACD
searc*er.searc*A;uer! neE =itCollectorAC N
Y6+erride
$u%lic +oid collectAint doc! "loat scoreC N
tem$=its.addAdocCD
R
RCD
Con"idencial /0C! 2012 0a#e < o" 11
Conocimiento en Lnea
Version: 0.2
Lucene: Tutorial Date: 06/03/2009
Conocimiento-en-Linea - Lucene: Tutorial
7Bem$lo com$leto:
$u%lic static 6%BectTU #etInde'AC t*roEs 7'ce$tion N
)trin# ran#eDate G OT20000101000000 T6 20900101000000UOD
Inde')earc*er searc*er G nullD
6%BectTU docsID G nullD
tr N
Con"i#)in#leton B$ G Con"i#)in#leton.#etInstanceACD
searc*er G neE Inde')earc*erAB$.#etInde'DirACCD
,nal.er anal.er G )$anis*,nal.er.#etInstanceACD
:uer0arser $arser G neE :uer0arserAO-ec*aO! anal.erCD
:uer ;uer G $arser.$arseAran#eDateCD
"inal ListWInte#erX tem$=its G neE ,rraListWInte#erXACD
searc*er.searc*A;uer! neE =itCollectorAC N
Y6+erride
$u%lic +oid collectAint doc! "loat scoreC N
tem$=its.addAdocCD
R
RCD
ListWInte#erX *its G neE ,rraListWInte#erXACD
"or Aint i G tem$=its.si.eAC - 1D i XG 0 D i--C N
*its.addAtem$=its.#etAiCCD
R
docsID G neE Inte#erTsearc*er.ma'DocACUD
docsID G *its.to,rraACD
R catc* A7'ce$tion eC N
t*roE eD
R
return docsIDD
R
7n este eBem$lo se ;uiere o%tener todos los documentos del ndice. Como arti"icio se %usca $or un ran#o de
"ec*a a%surdo el searc*er de+uel+e todos los documentos en orden.
(.( $ar %ormato a los resultados
7n los eBem$los anteriores solo se o%tu+o los IDs de los documentos o scoreDocs! $ero Z;ue se *ace lue#o
con ellos[ 7n este $roecto se necesito e'traer el contenido de los documentos m&s darle un "ormato
es$ecial al contenido de los arc*i+os. 0ara ello se muestra el si#uiente cdi#o:
Con"idencial /0C! 2012 0a#e 9 o" 11
Conocimiento en Lnea
Version: 0.2
Lucene: Tutorial Date: 06/03/2009
Conocimiento-en-Linea - Lucene: Tutorial
$ri+ate +oid -ill0a#eA6%BectTU *itsC t*roEs 7'ce$tion N
:uer0arser $arser G neE :uer0arserAOContenidoO! )$anis*,nal.er.#etInstanceACCD
:uer ;uer G $arser.$arseAsearc*-ieldCD
)im$le=TVL-ormatter lucene-ormatter G neE )im$le=TVL-ormatterA
OW%XWs$an classG\Olucene=it\OXO! OW/s$anXW/%XOCD
=i#*li#*ter *i#*li#*ter G neE =i#*li#*terAlucene-ormatter!
neE :uer)corerA;uerCCD
ListW=itX list G neE ,rraListW=itXACD
"or Aint i G 0D i W *its.len#t*D i]]C N
)coreDoc scoreDoc G A)coreDocC*itsTiUD
int docId G scoreDoc.docD
=it *it G neE =itACD
Inde')earc*er searc*er G neE
Inde')earc*erACon"i#)in#leton.#etInstanceAC.#etInde'DirACCD
Document doc G searc*er.docAdocIdCD
)trin# te't G doc.#etAOContenidoOCD
To@en)tream to@en)tream G To@en)ources.#et,nTo@en)treamA
searc*er.#etInde'3eaderAC! docId! OContenidoO!
)$anis*,nal.er.#etInstanceACCD
int ma'Hum-ra#ments G Inte#er.+alue6"ACon"i#)in#leton.#etInstanceAC
.#etVa'Hum-ra#mentsACCD
te't G *i#*li#*ter.#et9est-ra#mentsAto@en)tream! te't!
ma'Hum-ra#ments! O...OCD
*it.setContentAte'tCD
*it.set0at*ACon"i#)in#leton.#etInstanceAC.#et3e$ositor/3LAC ] doc.#etAO3utaOCCD
*it.setHameAdoc.#etAOHom%reOCCD
list.addA*itCD
R
*tt$)ession.set,ttri%uteAO*itsO! list.to,rraACCD
R
Lo im$ortante de este cdi#o es ;ue se usa la clase )im$le=TVL-ormatter! =i#*li#*ter To@en)tream
$ara $oder darle "ormato al resultado. 7n este $roecto se necesito mostrarse un "ra#mento del contenido
del documento ese "ra#mento necesita%a contener $e;ueos "ra#mentos del te'to Busto en donde esta%an
las $ala%ras ;ue se %uscaron. Con )im$le=TVL-ormatter se inserta el cdi#o =TVL ;ue se desee
alrededor de la $ala%ra con ;ue se %usco. -inalmente! el mFtodo *i#*li#*ter.#et9est-ra#mentsASC se
encar#a de "iltrar el te'to.
2. Parsers
/n $arser se encar#a de e'traer el contenido de un arc*i+o como 0D-! (ord! 00Ts! etc con+ertirlo a
te'to $uro. )i %ien es cierto ;ue los $arsers no +ienen dentro del $a;uete de lucene! se $ueden conse#uir
$arsers en otras li%reras.
, continuacin se muestra un eBem$lo de $arser usado en este $roecto:
Con"idencial /0C! 2012 0a#e 10 o" 11
Conocimiento en Lnea
Version: 0.2
Lucene: Tutorial Date: 06/03/2009
Conocimiento-en-Linea - Lucene: Tutorial
0D-:
$ac@a#e conocimientoenlinea.$arseD
im$ort Ba+a.io.-ileD
im$ort Ba+a.io.-ileIn$ut)treamD
im$ort Ba+a.io.)trin#(riterD
im$ort or#.$d"%o'.$dmodel.0DDocumentD
im$ort or#.$d"%o'.util.0D-Te't)tri$$erD
$u%lic class 0D- N
$u%lic static )trin# 0arseA-ile arc*i+oC t*roEs 7'ce$tion N
0DDocument $d"Document G nullD
)trin# contents G nullD
tr N
$d"Document G 0DDocument.loadAneE -ileIn$ut)treamAarc*i+oCCD
i" A$d"Document.is7ncr$tedACC N
$d"Document.decr$tAOOCD
R
)trin#(riter Eriter G neE )trin#(riterACD
0D-Te't)tri$$er stri$$er G neE 0D-Te't)tri$$erACD
stri$$er.EriteTe'tA$d"Document! EriterCD
contents G Eriter.#et9u""erAC.to)trin#ACD
R catc*A7'ce$tion eC N
t*roE neE 7'ce$tionACD
R "inall N
i" A$d"Document ^G nullC N
$d"Document.closeACD
R
R
return contentsD
R
R
Con"idencial /0C! 2012 0a#e 11 o" 11