Traducido por Miguel A. Ponce

documentación de Django - 5.2.15.dev20260527181452

Home | Table of contents | Index | Modules
« previous | up | next »

Búsqueda¶

Tarea común para aplicaciones web es buscar datos en la base de datos con la entrada del usuario. En un caso simple, esto podría ser filtrar una lista de objetos por categoría. Un uso más complejo puede requerir búsqueda con ponderación, categorización, resaltado, múltiples idiomas y así sucesivamente. Este documento explica algunas de las posibles casusas de uso y las herramientas que puedes utilizar.

Referiremos a los mismos modelos utilizados en Haciendo consultas.

Uso de Casos¶

Consultas textuales estándar¶

Campos de texto tienen una selección de operaciones de coincidencia. Por ejemplo, puede desear permitir buscar un autor como se muestra a continuación:

>>> Author.objects.filter(name__contains="Terry")
[<Author: Terry Gilliam>, <Author: Terry Jones>]

Esta es una solución muy frágil, ya que requiere que el usuario conozca un substring exacto del nombre del autor. Una mejor aproximación podría ser una comparación insensible a mayúsculas y minúsculas (icontains), pero esto solo es ligeramente mejor.

Las funciones de comparación avanzadas de una base de datos¶

Si estás utilizando PostgreSQL, Django proporciona una selección de herramientas específicas del motor de bases de datos para permitirte aprovechar opciones de consultas más complejas. Las otras bases de datos tienen diferentes selecciones de herramientas, posiblemente a través de plugins o funciones definidas por el usuario. Django no incluye ninguna función de soporte para ellas en este momento. Usaremos algunos ejemplos de PostgreSQL para demostrar la clase de funcionalidad que las bases de datos pueden tener.

Búsqueda en otras bases de datos

Todas las herramientas de búsqueda proporcionadas por django.contrib.postgres se construyen enteramente sobre APIs públicas como consultas personalizadas y funciones del motor de base de datos. Dependiendo de tu base de datos, deberías poder construir consultas para permitir APIs similares. Si hay cosas específicas que no se pueden lograr de esta manera, por favor abre un ticket.

En el ejemplo anterior, determinamos que una comparación insensible a mayúsculas y minúsculas sería más útil. Al tratar con nombres no en inglés, otra mejora es usar comparación sin acentos:

>>> Author.objects.filter(name__unaccent__icontains="Helen")
[<Author: Helen Mirren>, <Author: Helena Bonham Carter>, <Author: Hélène Joy>]

Esto muestra otro problema, donde estamos realizando una coincidencia contra un diferente spelling del nombre. En este caso tenemos una asimetría aunque - una búsqueda por Helen seleccionará Helena o Hélène, pero no al revés. Otra opción sería usar una comparación similar a trigramas que compara secuencias de letras.

Por ejemplo:

>>> Author.objects.filter(name__unaccent__lower__trigram_similar="Hélène")
[<Author: Helen Mirren>, <Author: Hélène Joy>]

Ahora tenemos un problema diferente - el nombre más largo de «Helena Bonham Carter» no aparece ya que es mucho más largo. Las búsquedas por trigramas consideran todas las combinaciones de tres letras y comparan cuántas aparezcan en ambas cadenas de búsqueda y fuente. Para el nombre más largo, hay muchas combinaciones que no aparecen en la cadena de fuente, por lo que ya no se considera una coincidencia cercana.

La elección correcta de funciones de comparación aquí depende de tu conjunto de datos particular, por ejemplo, los idiomas utilizados y el tipo de texto que estás buscando. Todas las muestras que hemos visto son sobre cadenas cortas donde el usuario es probablemente a ingresar algo cercano (por definiciones variables) al dato de origen.

Búsqueda en documentos¶

Operaciones estándar en bases de datos dejan de ser una aproximación útil cuando se consideran grandes bloques de texto. Mientras que los ejemplos anteriores pueden pensarse como operaciones sobre una cadena de caracteres, la búsqueda de texto completo analiza las palabras reales. Dependiendo del sistema utilizado, es probable que utilice algunas de las siguientes ideas:

  • Ignorando palabras como «a», «el», «y».

  • Reducción de palabras, para que «pony» y «ponies» se consideren similares.

  • Ponderación de palabras basada en diferentes criterios como la frecuencia con que aparecen en el texto o la importancia de los campos, como el título o las palabras clave, en los que aparecen.

Hay muchas alternativas para utilizar software de búsqueda, algunas de las más destacadas son Elastic y Solr. Estas son soluciones de búsqueda basadas en documentos completos. Para usarlas con datos de modelos Django, necesitarás una capa que traduzca tus datos en un documento textual, incluyendo referencias a los IDs de la base de datos. Cuando un motor de búsqueda devuelve un cierto documento, puedes buscarlo luego en la base de datos. Hay varias bibliotecas de terceros diseñadas para ayudar con este proceso.

Soporte para PostgreSQL¶

PostgreSQL tiene su propia implementación de búsqueda de texto completo integrada. Si bien no es tan potente como algunos otros motores de búsqueda, tiene la ventaja de estar dentro de tu base de datos y por lo tanto puede combinarse fácilmente con otras consultas relacionales, como la categorización.

El módulo django.contrib.postgres proporciona algunas herramientas para realizar estas consultas. Por ejemplo, una consulta podría seleccionar todos los entradas del blog que mencionen «queso»:

>>> Entry.objects.filter(body_text__search="cheese")
[<Entry: Cheese on Toast recipes>, <Entry: Pizza recipes>]

Puedes filtrar también sobre una combinación de campos y modelos relacionados:

>>> Entry.objects.annotate(
...     search=SearchVector("blog__tagline", "body_text"),
... ).filter(search="cheese")
[
    <Entry: Cheese on Toast recipes>,
    <Entry: Pizza Recipes>,
    <Entry: Dairy farming in Argentina>,
]

Ve la documentación completa en el documento contrib.postgres Búsqueda de texto completo.

Tabla de contenido

  • Búsqueda
    • Uso de Casos
      • Consultas textuales estándar
      • Las funciones de comparación avanzadas de una base de datos
      • Búsqueda en documentos
        • Soporte para PostgreSQL

Tema anterior

Agregación

Próximo tema

Administradores

Esta página

  • Mostrar el código

Búsqueda rápida

Last update:

may 31, 2026

« previous | up | next »