Archivo de la etiqueta: Apache Solr

solr_small

Instalar Solr 4.x y configurar multiples cores en Linux Ubuntu

Aclaraciones:

  • El proceso de instalación de Solr es valido para cualquier otra versión de Solr.
  • Un core es un hilo nuevo dentro de la misma instancia de Solr. Esto permite que se corra una sola instancia de Solr pero con varios buscadores.

Este tutorial asume que tienen instalado Java 7 y tomcat 7. Si tienen las versiones 6 le cambian el numero donde sea oportuno y funciona.

Vamos a ello:

Cuando tengas en tus manos el paquete se Solr, descomprimelo y ponte con la consola dentro de esa carpeta.

Cambia a sudo:

sudo su

Curiosidad: Aunque en el paquete que descargamos de Apache Solr haya al rededor de 2950 archivos solo nos van a hacer falta al rededor de 10:

Lanzamos en consola lo siguiente:

cp dist/solr-*.war /var/lib/tomcat7/webapps/solr.war
mkdir /var/lib/tomcat7/solr
cp -R example/multicore/core0/ /var/lib/tomcat7/solr/core0
mkdir /var/lib/tomcat7/solr/core0/data
chown -R tomcat7:tomcat7 /var/lib/tomcat7/solr
mkdir /var/lib/tomcat7/lib	 	 
cp dist/solrj-lib/* /var/lib/tomcat7/lib

Ahora edita /var/lib/tomcat7/solr/solr.xml, pega lo siguiente y guárdalo.

<?xml version="1.0" encoding="UTF-8" ?>
<solr persistent="true" sharedLib="lib">
 <cores adminPath="/admin/cores">
  <core name="core0" instanceDir="core0">
    <property name="dataDir" value="/var/lib/tomcat7/solr/core0/data"></property>
  </core>
 </cores>
</solr>

Edita /etc/tomcat7/Catalina/localhost/solr.xml, pega lo siguiente y guárdalo.

<?xml version="1.0" encoding="UTF-8" ?>
<context docBase="/var/lib/tomcat7/webapps/solr.war" debug="0" privileged="true" allowLinking="true" crossContext="true">
    <environment name="solr/home" type="java.lang.String" value="/var/lib/tomcat7/solr" override="true"></environment>
</context>

Listo, reiniciemos tomcat para ver en funcionamiento el core que hemos creado:

service tomcat7 restart

Entramos en http://localhost:8080/solr/ y lo vamos a ver.
Solr recién instalado con un core

Primer core de Solr
Bueno ya tenemos un Solr con un core, pero tiene poco sentido montar un Solr de multicores que tenga un solo core, así que vamos a crear uno mas.

Para este nuevo core (y todos los que quieras crear) hay que hacer dos cosas:
1: copiar la carpeta core0 junto a su owner para ahorrarnos de andar creando la misma estructura:

cp -Rp /var/lib/tomcat7/solr/core0 /var/lib/tomcat7/solr/producto

NOTA: No olvides editar /var/lib/tomcat7/solr/producto/conf/schema.xml y /var/lib/tomcat7/solr/producto/conf/solrconfig.xml para ajustar sus parámetros.

2: actualizar /var/lib/tomcat7/solr/solr.xml agregandole un nuevo tag con lo siguiente:

<core name="producto" instanceDir="producto">
  <property name="dataDir" value="/var/lib/tomcat7/solr/producto/data"></property>
</core>

Reinicia tomcat y ya tenes otro core.
Segundo core de Solr

Suerte y saludos.

tomcat-logo

Cerrar, bloquear o restringir el puerto 8080 en Apache Solr / Tomcat 6

Si instalaste un Apache Solr y lo estas usando por medio de Drupal 6, otro CMS o una propia implementación, seguramente no te interese que dicho servicio se pueda acceder por medio del puerto 8080 (o el puerto asignado en tu servidor para Tomcat).

Bueno, un ejemplo es mucho mas claro que casos hipotéticos, así que les planteo mi necesidad:
Tengo un Ubuntu con un Drupal configurado con el modulo “apachesolr” que se conecta a localhost en el puerto 8080. Hasta ahí todo normal, el problema es que si a alguien se le ocurre tipear la URL de mi pagina montada en Drupal pero por el puerto 8080… va a poder ver Tomcat, y lo que es mas peligroso, Apache Solr y su administrador (Solr carece de mecanismos de seguridad porque los delega a Tomcat).

Bueno en el ejemplo que comente antes tenemos una solución ideal: Capar el puerto 8080 para que solo se pueda acceder por “localhost”.

Para lograr nuestro cometido solamente tenemos que editar un XML: “server.xml“:

sudo gedit /etc/tomcat6/server.xml

Busca la linea:

<connector port="8080" protocol="HTTP/1.1"
       connectionTimeout="20000"
       redirectPort="8443"></connector>

Comentarla:

<!--
<Connector port="8080" protocol="HTTP/1.1"
       connectionTimeout="20000"
       redirectPort="8443" />
-->

Y poner por dejado de la linea anterior lo siguiente:

<connector port="8080"
        address="127.0.0.1"
        maxHttpHeaderSize="8192"
        maxThreads="15"
        minSpareThreads="2"
        maxSpareThreads="7"
        enableLookups="false"
        redirectPort="8443"
        acceptCount="100"
        connectionTimeout="20000"
        disableUploadTimeout="true"
        compression="on"
        compressionMinSize="0"
        noCompressionUserAgents="gozilla, traviata"
        compressableMimeType="text/html,text/xml"></connector>

Guarda los cambios y reinicia Tomcat:

sudo service tomcat6 restart

Gualá. Comprobemos que haya funcionado:

Primero mira cual es la ip que tiene tu servidor haciéndole ping:
Usa “ifconfig” para ver la ip, que seguramente tenga la pinta “192.168.1.xxx” o “10.0.2.xx”

bien, ahora suponiendo que seguis en Ubuntu (es mi ejemplo y uso Ubuntu :) ) abri un navegador y proba a acceder a:

http://localhost:8080

y a:

http://192.168.1.xxx:8080 (las xxx reemplazalas por el resto de tu IP).

Como pudiste ver, podes acceder a localhost pero no por medio de la IP, incluso si probas a acceder a esa IP desde otra maquina/ordenador/PC/ipad/ipod/android/o-lo-que-sea XD

Hemos acabado.

Druplicon

Setear y recuperar fields de Apache Solr en Drupal (y PHP en general)

Voy a partir de la premisa de que ya tenemos un apache solr corriendo y un drupal con el modulo configurado.

Dicho lo anterior, se nos plantea la siguiente pregunta: ¿Cómo hago para tomar un dato relacionado a un nodo, se lo paso a solr para que lo indexe como un field en el documento de solr y luego lo recupero junto a los documentos/resultados de una búsqueda?

Aunque parezca mentira, es mas bien fácil de hacer, pero si les pasa como a mi, seguramente gasten una horita en conseguir este dato, porque no es un tema extensamente documentado Solr + Drupal.

1) Agregar un dato X a un field de un documento:

Para este primer paso apelamos al hook hook_apachesolr_update_index(). ¿que hace?, nos da la oportunidad de agregar o quitar información al documento que se esta por enviar a solr, y ya puestos, nos manda el nodo del cual se extrajo la información para sacar de ahi (o de cualquier otro lado) información extra. (esto nos evita tener que hacer un node_load() ).

/**
 * Implementarion of hook_apachesolr_update_index()
 * */
function mimodulo_apachesolr_update_index(&$documentoSolr, $node) {
    //Por aca obtenemos informacion extra
    $documentoSolr->addField('is_apellido_de_creador', $apellido_creador);
    $documentoSolr->addField('is_edad_creador', $edad_creador);
}

Arriba no hay mucho que aclarar, básicamente por medio del método addField() seteo un par de  nuevos field (is_apellido_creador y is_edad_creador) asignandoles un valor que anteriormente habre recogido de algun lugar.

NOTA: Mucha atención al prefijo que usé en los nombres de los field (“is_“). No lo hice por que si, sino porque en el schema.xml los creadores del modulo de drupal han predefinido una serie de prefijos para las filas dinámicas como las que estamos creando. Dicho de otra forma, si no usamos uno de los prefijos definidos en schema.xml, los field no se van a indexar.

2) Pedir un field a Solr:

Solr puede tener en un documento cualquier cantidad de fields almacenados en su interior, lo que no quiere decir que en cada resultado de una busqueda se vayan a incluir todos estos field… imaginarán que la performance no se basa justamente en la premisa de “mandame todo lo que tengas que ya veré yo que es lo que me hace falta“. Mas bien hay que decirle a Solr en la consulta, que es lo que necesitas recibir de un documento de la siguiente manera:

/**
 * Implementarion of hook_apachesolr_prepare_query()
 */
function mimodulo_apachesolr_prepare_query(&$query, &$params, $caller) {
    //concatenamos los nuevs campos a la peticion.
    $params ["fl"] = $params ["fl"] . ", is_apellido_de_creador, is_edad_de_creador";
}

Como pueden ver, lo que hago aquí es sumarle a “fl” dos campos más. “fl” es justamente la clave que almacena todos los field que le vamos a pedir a Solr.

Listo, ya podemos setear y recuperar fields. Solo queda que modifiques la pagina de resultados para poder imprimir cada uno de los nuevos field que recibiste, pero esa es otra historia.

Concepto original extraído de:

http://www.agileapproach.com/blog-entry/filtering-apache-solr-search-results-based-drupal-user-permissions