Saltar al contenido

Etiqueta: bd

Como indexar múltiples índices de Solr

Esta fue una tarea que me tocó realizar en mi trabajo, debido a la poca documentación existente (me parece incompleta o no explican bien) y lo que me costó, decidí realizar una breve guía de como instalar solr y configurar varios índices; con el fin de ayudar a otras personas con el mismo problema o no tienen posibilidad de documentarse en inglés.

Para quienes no conocen Solr, es un motor de búsqueda de código abierto escrito en Java para tener un mayor rendimiento en las búsquedas o consultas muy grandes, es recomendable usarlo al momento de tener consultas a base de datos con mucho tiempo para obtener resultados y que estos sean constantes, por nombrar un caso.

Como está hecho en Java y corre sobre plataforma web, es necesario tener instalado y configurado Tomcat en el servidor. En esta guía se asume eso, si no saben, pueden buscar tutoriales en Internet para ver como hacerlo para su Sistema Operativo. Además, para este ejemplo se va a realizar un indice de una consulta a un servidor SQL Server para traer los datos y crear un índice con ello.

Instalación de Solr

  1. Primero vamos a https://lucene.apache.org/solr/ y descargamos la versión zip y la descomprimen en una carpeta temporal.
  2. Dentro de la carpeta comprimida, entren a la carpeta dist y renombrar el archivo apache-solr-x.x.x.war a solr.war
  3. Luego copian ese archivo en la carpeta lib de Tomcat.
  4. Como en este ejemplo usamos SQL Server para traer los datos, descargamos el driver jdbc de Sql Server (o el correspondiente para su gestor de Base de Datos) y se copia dentro de la carpeta lib de Tomcat.

Registro de una WebApp

El siguiente paso es crear cada  instancia o aplicación web, por cada una de ellas se deben repetir los siguientes pasos:

  1. Desde la carpeta descomprimida en el paso 1 de la sección anterior (debería llamarse algo como apache-solr-x.x.x), copiar la carpeta example a la localidad deseada para guardar al configuración e indices (ejemplo /home/user/solr_indices ó C:\solr_indices)
  2. Ir a la carpeta /conf/Catalina/localhost dentro de Tomcat, allí crear un archivo .xml con el nombre de la aplicación (este nombre de la carpeta es el que saldrá en la URL) con el contenido a continuación, recuerden cambiar RUTA_TOMCAT por la ruta de instalación de Tomcat y RUTA_WEBAPP por la ruta de la carpeta creada en el paso anterior:
<Context docBase="RUTA_TOMCAT/lib/solr.war" debug="0" crossContext="true">
  <Environment type="java.lang.String" value="RUTA_WEBAPP" override="true" />
  <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="(127\.0\.0\.1)|(10\.2\.*)" />
</Context>

La cadena Valve, es opcional y sirve para restringir el acceso a la aplicación, en este caso permite acceso a la IP local y cualquiera de la red privada de clase A. El atributo allow (deny para denegar) permite expresiones regulares para las ips. Si desean bloquear nombres de dominio, usen RemoteHostValve.

Configuración de la WebApp con Solr

Les recuerdo, en este caso se estará usando SQL Server y se importarán los datos del indice desde una consulta al servidor de Base de Datos, si necesitan leer documentos XML u otra cosa, lean la wiki de Solr.

  1. Editar RUTA_WEBAPP/conf/solrconfig.xml y agregar el siguiente bloque:
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
  <lst name="defaults">
    <str name="config">data-config.xml</str>;
  </lst>
</requestHandler>

Buscar en ese mismo archivo, la sección donde dice dataDir para renombrar el nombre de la carpeta donde se guardará el índice para evitar sobre-escritura por parte de los demás índices, sustituir NOMBRE_WEBAPP por el nombre de la aplicación:

<dataDir>${solr.data.dir:./solr/data-NOMBRE_WEBAPP}</dataDir>

Crear en la misma carpeta (RUTA_WEBAPP/conf/) un archivo con el nombre data-config.xml con el siguiente contenido, recuerden modificar las credenciales de la conexión de la base de datos por las usadas en su caso:

<dataConfig>
  <dataSource type="JdbcDataSource" name="solr"
driver="com.microsoft.sqlserver.jdbc.SQLServerDriver"
url="jdbc:sqlserver://IP_SERVIDOR_BD;databaseName=NOMBRE_BD"
user="NOMBRE_USUARIO" password="CONTRASENA"/>
   <document name="NOMBRE_BUSQUEDA">
     <entity name="NOMBRE_BUSQUEDA" dataSource="NOMBRE_BUSQUEDA" query="SELECT id,content AS Txt FROM TableTest">
        <field column="id" name="DataID"/>
        <field column="Txt" name="Txt"/>
     </entity>
   </document>
</dataConfig>

En este paso se deben explicar algunas cosas, las cadenas dataSource,entity y document deben tener el atributo name, con ello Solr identifica esta fuente de datos con el indice, es recomendable usar el mismo para evitar problemas. La cadena entity debe tener el atributo dataSource, con el nombre de la fuente, con esto relaciona ambos. Ademas si observan la sentencia SQL, la misma devuelve 2 columnas: id y Txt (Txt la forzamos a llamarse así mediante AS), las cuales serán usadas para crear el índice, por ello se deben crear tantas etiquetas field como columnas tengamos en la consulta, el nombre es personal y no es obligatorio llamarlas como el nombre de la columna.

Editar el archivo schema.xml, buscar el bloque fieldsets por:

<fields>
  <field name="DataID" type="string" indexed="true" stored="true" />
  <field name="Txt" type="text" indexed="true" stored="true" />
</fields>
<uniqueKey>Txt</uniqueKey>

Aquí se coloca una cadena field por cada cadena declarada en el archivo del paso anterior, cabe destacar la importancia del atributo type, no entro en detalles pero en este mismo archivo pueden leer los existentes, por ejemplo, string no permite búsqueda parcial a diferencia de text, así que analicen los tipos necesarios para cada columna.

Deben reiniciar el servicio de Apache Tomcat con el fin de actualizar la información de la webapp y Solr pueda crear los índices.

Una vez realizado estos pasos, se puede proceder a indexar el contenido. Si desean agregar mas índices, repitan los pasos de Configuración de la Webapp con Solr, cambiando el nombre de la aplicación, carpeta donde almacenar los indices, nombre de consulta, entre otros.

Espero que esta guía les haya servido de gran ayuda.

Deja un comentario

Pequeños tips para mantener seguro tu blog

Siempre he sido muy cuidadoso con la seguridad de este blog, sin embargo, hace unos días sufrí un ataque a la base de datos del blog por un descuido que tuve y no me di cuenta de ese problema durante los 4 años que tengo usando WordPress como software para manejar el blog de este sitio. Pero todo ya fue solucionado, elevé mucho mas los niveles de seguridad y solo se perdieron los comentarios de 1 semana, por esta razón, me animé a comentarle sobre tips que deberían seguir todos para evitar posibles ataques a sus blogs:

  • Siempre tener presente que puedes ser víctima de un ataque, la mayoría de la gente piensa que no puede ser víctima de los ataques porque su blog no contiene temas interesantes, temas que ofendan a otra gente, temas con posiblidad de venta comercial entre otros. Sin embargo, es el peor error ya que los crackers simplemente se enfocan en la parte tecnológica del blog y no les importa el tema del mismo, si el blog tiene un fallo, buscarán explotarlo y atacarlo, punto.
  • La mejor manera para empezar a tener un blog seguro consiste en usar buenas contraseñas para la administración (también para la base datos y cuentas FTP), mis recomendaciones son usar: letras, numeros, mayúsculas y signos especiales. En vez de usar una palabra, usemos una frase favorita cambiando las vocales por números, la primera letra de cada palabra en mayúscula eliminando los espacios como se observa en el siguiente ejemplo: M3Gust431bl0gd3Sk4t0x (me gusta el blog de skatox). Si son mas paranoicos, simplemente escriban la frase dos veces y aumentarán exponencialmente la posibilidad de robo, además es recomendable: cambiarla cada 6 meses, evitar anotarla en algún lado, darla a conocer a otra persona, usarla en sitios o computadoras públicas y aceptar que el navegador la guarde para evitar escribirla cada vez que deseemos escribir un artículo.
  • Estar atentos a los cambios de seguridad con las nuevas versiones del software del blog, este punto lo descubrí recientemente y es muy importante en sitios que llevan mucho tiempo en línea, generalmente mucho software para gestionar blogs (ejem, WordPress) agrega con el tiempo nuevas opciones de seguridad,las cuales muchas veces no se activan por defecto, es por ello, estar siempre atento a estos cambios para activarlos. Ademas, en los sitios con mucho tiempo en línea, se suele conservar los mismos archivos de configuración desde su instalación inicial, siendo obsoletos después de unos años al faltarles parámetros introducidos en nuevas versiones.
  • Evitar exceso de código de terceros: plugins, código HTML/Javascript copiado de otros sitios, entre otros. Pues pueden introducir nuevas vulnerabilidades y no tener soporte de actualizaciones, es decir, no hay garantía de corrección de fallas en los mismos. Si tenemos instalados plugins o código de terceros, también se debe visitar periódicamente estas páginas en busca de actualizaciones o corrección a problemas existentes.
  • Tratar de evitar acceder a la página administrativa desde sitios públicos (como un punto inalámbrico de un restaurante), desde cibercafes o computadoras de uso publico, tratar de cifrar las conexiones accediento mediante Https o SFTP/FTPS para el caso de transmición  de datos. Con esto evitarás que intercepeten tus datos, sean manipulados o extraidos.
  • Si tienen el blog alojado en un servidor propio, chequear la correcta permisología de los archivos, revisar los archivos .htaccess, evitar que las carpetas de configuración y de administración sean indexadas por los motores de búsqueda (usando el robot.txt), chequear que se esté usando las últimas versiones de los servicios y si es posible, escribir un buen firewall para controlar aún mas el acceso al servidor.

Con estos tips es suficiente para conseguir una excelente seguridad en tu blog, en unas próximas semanas escribiré detalles para hacerlo con WordPress. Recuerden siempre estar atentos a todo detalle para evitar ser atacados.

1 comentario