RSS

Proyecto Java web con Apache Solr y Postgresql … parte 2

05 Jun

Descargando e instalando solr ……………..

Descargar e instalar la plataforma de búsqueda Solr ….. https://lucene.apache.org/solr/index.html

En este ejemplo se instalará la versión de solr para Windows, elegimos el archivo:

apache-solr-3.6.0.zip de la página de descarga: http://apache.webxcreen.org/lucene/solr/3.6.0/

Instalando Apache Solr ….

Descomprimir el archivo, y entrar en el directorio $SOLR_HOME\example

Ahora, solr puede ejecutarse en cualquier contenedor de servlets java, en este ejemplo se utiliza una
instalación de Jetty que la distribución de solr tiene incluida.

Ejecutando el servidor Solr …

Para ejecutar el servidor es necesario poner el siguiente comando:

> java -jar start.jar

Al final de la ejecución debe aparecer el siguiente mensaje:

Esto indica que se levantó el servidor en el puerto 8983. Para ver el estado del servidor se consulta la página:
http://localhost:8983/solr/admin/

Se muestra de la siguiente manera:

Indexando datos de ejemplo ………..

En el directorio exampledocs contiene tipode de documento que solr puede recibir. Para agregar documentos
utilizamos una herramienta llamada post.jar de la siguiente manera:

…exampledocs> java -jar post.jar solr.xml monitor.xml

Una vez indexados los datos, se puede hacer una búsqueda en la página, por ejemplo “solr” en donde dice “Make a Query” para obtener el siguiente resultado:

Se puedes hacer diferentes búsquedas utilizando el Solr Query Synttax (http://wiki.apache.org/solr/SolrQuerySyntax).

Existen otras formas de indexar datos en solr:

  •     Importar registros desde una base de datos.
  •     Archivos CSV (valores separador por comas), por ejemplo, archivos exportados de MySQL o Excel.
  •     Documentos POST JSON.
  •     Documentos binarios como Word o Pdf con Solr Cell.
  •     Usando SolrJ para crear documentos por medio de programas y enviarlos a Solr.


Data Import Request Handler …………..

Existe una manera de indexar datos desde una base de datos. Primero se debe copiar el driver de postgreSQL al siguiente directorio $SOLR_HOME\example\lib. Ahora dentro del directorio example crear un directorio llamado “labFInal”. En este directorio tenemos la siguiente estructura:

labFinal\
        solr.xml
        Libros\
            conf\
                schema.xml
                data-config.xml
                solrconfig.xml

En el archivo solr.xml se definen las referencias a los core, en este caso solo será uno.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<solr persistent="true">
    <cores adminPath="/admin/cores">
        <core default="true" instanceDir="libros/" name="Libros"/>
    </cores>
</solr>

En el archivo solrconfig.xml del directorio config tenemos el siguiente código:

<?xml version="1.0" encoding="UTF-8" ?>
<!--
 Licensed to the Apache Software Foundation (ASF) under one or more
 contributor license agreements.  See the NOTICE file distributed with
 this work for additional information regarding copyright ownership.
 The ASF licenses this file to You under the Apache License, Version 2.0
 (the "License"); you may not use this file except in compliance with
 the License.  You may obtain a copy of the License at     http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
-->

<config>

  <luceneMatchVersion>LUCENE_36</luceneMatchVersion>

  <jmx />

  <abortOnConfigurationError>${solr.abortOnConfigurationError:true}</abortOnConfigurationError>

  <lib dir="..\..\..\dist\" regex="apache-solr-dataimporthandler-.*\.jar" />

  <indexDefaults>
    <useCompoundFile>false</useCompoundFile>

    <mergeFactor>10</mergeFactor>
    <ramBufferSizeMB>32</ramBufferSizeMB>
    <maxMergeDocs>2147483647</maxMergeDocs>
    <maxFieldLength>10000</maxFieldLength>
    <writeLockTimeout>1000</writeLockTimeout>
    <lockType>single</lockType>
  </indexDefaults>

  <mainIndex>
    <useCompoundFile>false</useCompoundFile>
    <ramBufferSizeMB>32</ramBufferSizeMB>
    <mergeFactor>10</mergeFactor>
    <maxMergeDocs>2147483647</maxMergeDocs>
    <maxFieldLength>10000</maxFieldLength>
    <unlockOnStartup>false</unlockOnStartup>
  </mainIndex>

  <updateHandler>
    <maxPendingDeletes>100000</maxPendingDeletes>
  </updateHandler>

  <query>
    <maxBooleanClauses>1024</maxBooleanClauses>
    <filterCache
     
      size="512"
      initialSize="512"
      autowarmCount="256"/>

    <queryResultCache
     
      size="512"
      initialSize="512"
      autowarmCount="256"/>

    <documentCache
     
      size="512"
      initialSize="512"
      autowarmCount="0"/>

    <enableLazyFieldLoading>true</enableLazyFieldLoading>

 
    <queryResultWindowSize>50</queryResultWindowSize>
   
    <queryResultMaxDocsCached>200</queryResultMaxDocsCached>

    <HashDocSet maxSize="3000" loadFactor="0.75"/>

    <listener event="newSearcher">
      <arr name="queries">
        <lst> <str name="q">solr</str> <str name="start">0</str> <str name="rows">10</str> </lst>
        <lst> <str name="q">rocks</str> <str name="start">0</str> <str name="rows">10</str> </lst>
        <lst><str name="q">static newSearcher warming query from solrconfig.xml</str></lst>
      </arr>
    </listener>

    <listener event="firstSearcher">
      <arr name="queries">
      </arr>
    </listener>

    <useColdSearcher>false</useColdSearcher>

    <maxWarmingSearchers>4</maxWarmingSearchers>
  </query>

<requestDispatcher handleSelect="true" >
    <requestParsers enableRemoteStreaming="false" multipartUploadLimitInKB="2048" />
    <httpCaching never304="true">
    </httpCaching>
  </requestDispatcher>
 
     
  <requestHandler name="standard" default="true">
    <!-- default values for query parameters -->
     <lst name="defaults">
       <str name="echoParams">explicit</str>
     </lst>
  </requestHandler>

  <requestHandler name="dismax" >
    <lst name="defaults">
     <str name="echoParams">explicit</str>
     <float name="tie">0.01</float>
     <str name="qf">
        text^0.5 features^1.0 name^1.2 sku^1.5 id^10.0 manu^1.1 cat^1.4
     </str>
     <str name="pf">
        text^0.2 features^1.1 name^1.5 manu^1.4 manu_exact^1.9
     </str>
     <str name="bf">
        ord(popularity)^0.5 recip(rord(price),1,1000,1000)^0.3
     </str>
     <str name="fl">
        id,name,price,score
     </str>
     <str name="mm">
        2&lt;-1 5&lt;-2 6&lt;90%
     </str>
     <int name="ps">100</int>
     <str name="q.alt">*:*</str>
     <str name="hl.fl">text features name</str>
     <str name="f.name.hl.fragsize">0</str>
     <str name="f.name.hl.alternateField">name</str>
     <str name="f.text.hl.fragmenter">regex</str> <!-- defined below -->
    </lst>
  </requestHandler>

  <requestHandler name="partitioned" >
    <lst name="defaults">
     <str name="echoParams">explicit</str>
     <str name="qf">text^0.5 features^1.0 name^1.2 sku^1.5 id^10.0</str>
     <str name="mm">2&lt;-1 5&lt;-2 6&lt;90%</str>
     <str name="bq">incubationdate_dt:[* TO NOW/DAY-1MONTH]^2.2</str>
    </lst>
    <lst name="appends">
      <str name="fq">inStock:true</str>
    </lst>
    <lst name="invariants">
      <str name="facet.field">cat</str>
      <str name="facet.field">manu_exact</str>
      <str name="facet.query">price:[* TO 500]</str>
      <str name="facet.query">price:[500 TO *]</str>
    </lst>
  </requestHandler>
 
  <requestHandler name="instock" >
    <!-- for legacy reasons, DisMaxRequestHandler will assume all init
         params are "defaults" if you don't explicitly specify any defaults.
      -->
     <str name="fq">
        inStock:true
     </str>
     <str name="qf">
        text^0.5 features^1.0 name^1.2 sku^1.5 id^10.0 manu^1.1 cat^1.4
     </str>
     <str name="mm">
        2&lt;-1 5&lt;-2 6&lt;90%
     </str>
  </requestHandler>

  <requestHandler name="spellchecker" startup="lazy">
    <!-- default values for query parameters -->
     <lst name="defaults">
       <int name="suggestionCount">1</int>
       <float name="accuracy">0.5</float>
     </lst>
    
     <str name="spellcheckerIndexDir">spell</str>
    
     <str name="termSourceField">word</str>
    
   </requestHandler>

   <requestHandler name="/mlt">
     <lst name="defaults">
       <str name="mlt.fl">manu,cat</str>
       <int name="mlt.mindf">1</int>
     </lst>
   </requestHandler>

   <requestHandler name="/dataimport">
    <lst name="defaults">
        <str name="config">data-config.xml</str>
    </lst>
  </requestHandler>
  
 
 
 
  <requestHandler name="/search">
    <lst name="defaults">
      <str name="echoParams">explicit</str>
    </lst>
  </requestHandler>
 
 
 
  <requestHandler name="/update" >
  </requestHandler>

  <requestHandler name="/analysis" >
  </requestHandler>

  <requestHandler name="/update/csv" startup="lazy" />

  <requestHandler name="/admin/" />
 
  <requestHandler name="/debug/dump" >
    <lst name="defaults">
     <str name="echoParams">explicit</str> <!-- for all params (including the default etc) use: 'all' -->
     <str name="echoHandler">true</str>
    </lst>
  </requestHandler>
 
  <highlighting>
   <fragmenter name="gap" default="true">
    <lst name="defaults">
     <int name="hl.fragsize">100</int>
    </lst>
   </fragmenter>

   <fragmenter name="regex">
    <lst name="defaults">
      <!-- slightly smaller fragsizes work better because of slop -->
      <int name="hl.fragsize">70</int>
      <!-- allow 50% slop on fragment sizes -->
      <float name="hl.regex.slop">0.5</float>
      <!-- a basic sentence pattern -->
      <str name="hl.regex.pattern">[-\w ,/\n\"']{20,200}</str>
    </lst>
   </fragmenter>
  
   <formatter name="html" default="true">
    <lst name="defaults">
     <str name="hl.simple.pre"><![CDATA[<em>]]></str>
     <str name="hl.simple.post"><![CDATA[</em>]]></str>
    </lst>
   </formatter>
  </highlighting>
 
 
  <queryResponseWriter name="xslt">
    <int name="xsltCacheLifetimeSeconds">5</int>
  </queryResponseWriter>
   
  <admin>
    <defaultQuery>*:*</defaultQuery> 
  </admin>

</config>

En el archivo data-config.xml se define la fuente de datos que se debe indexar. Se define el servidor de base de datos, el conector JDBC, el nombre de usuario y password. El código es el siguiente:

<dataConfig>
    <dataSource driver="org.postgresql.Driver"
                url="jdbc:postgresql://localhost:5432/BaseSeminario"
                user="postgres"
                password="postgres" />
    <document>
        <entity name="libro" query="select * from libro" >
            <field column="id" name="id" />
            <field column="titulo" name="titulo" />
            <field column="editorial" name="editorial" />
            <field column="volumen" name="volumen" />
            <field column="serie" name="serie" />
            <field column="edicion" name="edicion" />
            <field column="notas" name="notas" />
        </entity>
    </document>
</dataConfig>

El archivo schema.xml define los tipos de datos para cada valor de los campos de la tabla.

<?xml version="1.0" encoding="UTF-8" ?><schema name="libro" version="1.1">
 

  <types>
    <fieldType name="integer" omitNorms="true"/>
    <fieldType name="string" sortMissingLast="true" omitNorms="true"/>
    <fieldType name="text_ws" positionIncrementGap="100">
      <analyzer>
        <tokenizer/>
      </analyzer>
    </fieldType>
   
    <fieldType name="text" positionIncrementGap="100">
      <analyzer type="index">
        <tokenizer/>
        <filter/>
        <filter/>
      </analyzer>
    </fieldType>
 </types>

 <fields>
   <field name="id" type="integer" indexed="true" stored="true" required="true" />
   <field name="titulo" type="text_ws" indexed="true" stored="true" />
   <field name="editorial" type="text_ws" indexed="true" stored="true"/>
   <field name="volumen" type="text_ws" indexed="true" stored="false"/>
   <field name="serie" type="text_ws" indexed="true" stored="false"/>
   <field name="edicion" type="text_ws" indexed="true" stored="true"/>
   <field name="notas" type="text_ws" indexed="true" stored="true" />
   <field name="todos" type="text" indexed="true" stored="false" multiValued="true"/> -->  
 </fields>

 <uniqueKey>id</uniqueKey>
 <defaultSearchField>todos</defaultSearchField>

 <!-- SolrQueryParser configuration: defaultOperator="AND|OR"  -->
 <solrQueryParser defaultOperator="OR"/>

   <copyField source="id" dest="todos"/>
   <copyField source="titulo" dest="todos"/>
   <copyField source="editorial" dest="todos"/>
   <copyField source="volumen" dest="todos"/>
   <copyField source="serie" dest="todos"/>
   <copyField source="edicion" dest="todos"/>
   <copyField source="notas" dest="todos"/>
  
</schema>

para ejecutar el nuevo directorio con la configuración que se definió es necesario levantar Solr de la siguiente manera:

…example> java -Dsolr.solr.home=”labFinal” -jar start.jar

Se debe levantar el servidor y mostrar la siguiente página:

Indexando datos desde la base de datos ………………

Después de tener la definición de los archivo de configuración, es necesario utilizar un servlet que permite importar los datos desde la base e indexar el contenido según la configuración. Para hacer esto se debe escribir la siguiente dirección en el navegador:

http://localhost:8983/solr/Libros/dataimport?command=full-import

Para comprobar el proceso se puede consultar la página:

http://localhost:8983/solr/Libros/dataimport

Buscando datos en la interfaz de Solr …………………

En la página :  http://localhost:8983/solr/Libros/admin/ se pueden consultar los datos que se indexadon de la base de datos.

Buscar alguna palabra que este almacenada en la base, es importante decir que es cualquier valor que aparezca en cualquiera de los campos de la tabla.

Los resultados:

.

 
Deja un comentario

Publicado por en 5 junio, 2012 en Apache Solr, Código, Java, Postgresql

 

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

 
A %d blogueros les gusta esto: