Tu sitio en Django puede tener una herramienta de búsqueda útil en poco tiempo
Juan Pablo Romero
Software EngineerCuando tienes un sitio Django y no quieres torturar tu base de datos con búsquedas, pero quieres ofrecer a tus usuarios la posibilidad de tener una buena herramienta de búsqueda, puedes echarle un vistazo a haystack, esto es un motor de búsqueda configurable donde puedes tomar backends tales como xapian, solr y whoosh, entre otros. Si tienes buen hardware ve por solr, si no esperas muchas visitas, ve por whoosh, pero seguramente encontraras a xapian realmente bueno. Nosotros también preferimos xapian.
Espera, ya tienes una base de datos relacional, ahora estas añadiendo una base de datos documental, así en tu siguiente reunión geek podrías hablar fluidamente sobre esto; nota que tendrás una segunda base de datos especializada para búsquedas, así el proceso es más o menos así: añades o actualizas un registro en tu base de datos original, el sistema añade o actualiza un registro en la base de datos documental, el “índice” se actualiza y las búsquedas se efectúan solo en la base de datos documental dejando que tu base de datos relacional haga las cosas que tienen que ver con el la lógica del sitio sin sobrecargarla con solicitudes de las búsquedas de los usuarios.
Asumimos que estas trabajando con virtualenv, si no lo estas usando, ve por el primero :), si estas usando Debian o Ubuntu, puedes seguir esa guía, en otros sabores o sistemas operativos debería funcionar, pero necesitarás trabajar en esto por ti mismo o actualizar a alguno de los sistemas operativos recomendados que usamos aquí. Asumimos que tienes python 2.7, si no, la técnica de copiar/pegar no funcionaría directamente.
Obteniendo las herramientas
En tu maquina instala xapian
apt-get install python-xapian
Asumiendo que tu virtualenv se llama tr, el siguiente script deberia funcionar ajustando tus variables acorde a tu instalación.
Interconectando" class="redactor-autoparser-object">https://gist.github.com/179399... Django con haystack
Añade a tu archivo requirements.txt las siguietes líneas. Si te preguntas que hace requierements.txt, échale un vistazo a virtualenv.
xapian-haystack==1.1.5beta
django-haystack==1.2.6
translitcodec==0.2
Como de costumbre, ejecutas
pip install -U requirements.txt
En tu setting.py añades 'haystack',
Y configuras las siguientes variables en tu settings.py , asegúrate de colocar tales variables ANTES de la configuración de las aplicaciones:
HAYSTACK_SITECONF = 'rt.search_sites'
HAYSTACK_SEARCH_ENGINE = 'xapian'
HAYSTACK_XAPIAN_PATH = '/var/lib/rtsearch/rtindex'
donde rt es tu proyecto, tienes un archivo search_sites.py en el interior, más tarde comentaremos acerca de esto, y tienes el directorio /var/lib/rtsearch/rtindex con los permisos apropiados (www-data:www-data o todo lo que el usuario ejecuta en servidor web con el virtualenv).
Encender tu sitio django con haystack
Recuerdas que hablamos sobre la base de datos documental? en haystack hay un archivo search_indexes.py que es muy parecido a models.py, ahí especificamos como recogemos elementos de la base de datos relacional que se deben buscar, con este archivo haystack sabe qué debe comparar con lo que es buscado, en otras palabras, el índice se genera con este archivo, así, cuando alguien busque, la base documental se emplea y no tu base de datos relacional. En haystack hay un archivo donde queda la información que será usada para la búsqueda, es una plantilla, y puedes personalizar tu pagina de resultados y los aspectos usuales en los que estés interesado cuando ofrezcas una herramienta de búsqueda. Hay tres archivos importantes: autodiscover, search_indexes.py, la plantilla y la configuraron de urls, y como un bono te mostraremos una aproximación que no tiene en cuenta los acentos.
Todavía estas leyendo? Iremos a el índice, esto esta en search_indexes.py, para motivarnos:
Hay" class="redactor-autoparser-object">https://gist.github.com/179385... tres formas para actualizar el índice, en tiempo real, en lote o en una cola, para este ejemplo usaremos tiempo real, te sugerimos emplear el método de colas en un sitio en producción, este archivo se asemeja a models.py, estamos definiendo los campos que estamos usando para el índice en nuestras búsquedas, la mas sencilla es assignednumber, mapeando directamente a un campo de el modelo RR, para hacerte la vida más fácil incluímos un ManyToManyField representado por people donde definimos un método llamado indexsearch() que será usado como índice, por otra parte estamos mostrando en territorio una posible ForeignKey que puede ser nula donde estamos indexando por el campo name, y finalmente describimos el campo de texto que tiene el atributo use_template con el valor True, esto es de especial interés porque somos capaces de definir en una plantilla otros campos y aspectos usando el lenguaje de plantillas para iterar y seguir las relaciones para hacer que el índice esté un poco más completo. El siguiente código te muestra una plantilla ejemplo, esta plantilla deberías ubicarla en templates/search/indexes/informationgathering/restitutionrequest_text.txt
Finalmente" class="redactor-autoparser-object">https://gist.github.com/179420... cuando definas tu índice, asegúrate de registrarlo con el modelo, a la interfaz de administración.
Puedes activar tu url con algo como
Reconstruyendo" class="redactor-autoparser-object">https://gist.github.com/179423... el indice
si por cualquier razón necesitas reconstruir tu indice, tu shell django tiene ahora rebuild_index, asi puedes usar
./manage.py rebuild_index
En caso de ser necesario
Usando acentos
Dado que nosotros (AxiaCore) estamos en un país donde se habla español, necesitamos el control/evitar acentos, así ofrecemos urls complementarias, un formulario y un template.
A continuación un formulario sencillo usando translitcodec, si, viste esto antes en requierements.txt.
y" class="redactor-autoparser-object">https://gist.github.com/179425... puedes personalizar tus resultados usando tus propias plantillas, al mostrar los resultados de la busqueda, deberias colocarlo en templates/search/search.html
Finalmente" class="redactor-autoparser-object">https://gist.github.com/179425... tu urls.py deberían verse como
Referencias
Mas por hacer
Si, puedes conectar tu propio backend, puedes hacer búsquedas parciales y cosas avanzadas que tu documento favorito de la base de datos pueda hacer.
Written by Juan Pablo Romero
Juan Pablo designs and builds robust software solutions with a focus on performance and usability. His problem-solving skills and attention to detail ensure high-quality and efficient applications.