Overview
En esta guía, puede aprender a usar Django MongoDB Backend para ejecutar Consultas deMongoDB Search en una colección. MongoDB Search permite realizar búsquedas de texto completo en las colecciones de MongoDB. Los índices de MongoDB Search especifican el comportamiento de la búsqueda y los campos que se indexan.
Datos de muestra
Los ejemplos de esta guía utilizan el Movie y los Theater modelos, que representan las colecciones y de los sample_mflix.movies sample_mflix.theaters conjuntos de datos de muestra del Atlas. Las clases de modelo tienen las siguientes definiciones:
from django.db import models from django.contrib.gis.db import models from django_mongodb_backend.fields import ArrayField class Movie(models.Model): title = models.CharField(max_length=200) plot = models.TextField(blank=True) runtime = models.IntegerField(default=0) genres = ArrayField(models.CharField(max_length=100), null=True, blank=True) class Meta: db_table = "movies" managed = False def __str__(self): return self.title class Theater(models.Model): theater_id = models.IntegerField(default=0, db_column="theaterId") geo = models.PointField(db_column="location.geo") class Meta: db_table = "theaters" managed = False def __str__(self): return self.theater_id
Tip
Campos de GeoDjango
El modelo Theater utiliza un GeoDjango PointField llamado geo para almacenar datos geoespaciales. Para obtener más información sobre los campos de GeoDjango, consulte Guía dedatos geoespaciales modelo.
Los Movie Theater modelos y incluyen una Meta clase interna, que especifica los metadatos del modelo, y un __str__() método, que define la representación de cadena del modelo. Para obtener más información sobre estas características del modelo,consulte "Definir un modelo" en la guía "Crear modelos".
Ejecutar ejemplos de código
Puedes usar el shell interactivo de Python para ejecutar los ejemplos de código. Para acceder al shell, ejecuta el siguiente comando desde el directorio raíz de tu proyecto:
python manage.py shell
Después de ingresar al shell de Python, asegúrese de importar los siguientes modelos y módulos:
from <your application name>.models import Movie, Theater from django_mongodb_backend.expressions import ( SearchEquals, SearchAutocomplete, SearchExists, SearchIn, SearchPhrase, SearchQueryString, SearchRange, SearchRegex, SearchText, SearchWildcard, SearchGeoShape, SearchGeoWithin, SearchMoreLikeThis, CompoundExpression, SearchScoreOption )
Para aprender a crear una aplicación Django que use el Movie modelo y el shell interactivo de Python para interactuar con documentos MongoDB, visita el tutorial Primeros pasos.
Ejecutar una consulta de búsqueda de MongoDB
Importante
Requisitos del índice
Antes de ejecutar una consulta de búsqueda de MongoDB, debe crear un índice de búsqueda en los campos correspondientes. Para saber cómo crear índices de búsqueda, consulte "Índices de búsqueda" en la guía "Crear índices".
Para ejecutar una consulta de búsqueda de MongoDB, use el método annotate() de la API QuerySet de Django. Pase sus criterios de búsqueda de MongoDB, incluyendo su operador de búsqueda, como argumento score a annotate(). El siguiente código muestra la sintaxis básica para ejecutar una consulta de búsqueda:
Model.objects.annotate( score=<Search Operator>(path="<field name", <additional arguments>) )
Para especificar operadores de búsqueda, utilice las clases de expresión proporcionadas por el módulo django_mongodb_backend.expressions. Cada clase corresponde a un operador de búsqueda.
Las siguientes secciones muestran cómo ejecutar consultas de búsqueda utilizando cada clase de expresión compatible.
Buscar es igual
Importante
Requisitos adicionales del índice
Antes de usar la SearchEquals expresión en una consulta de búsqueda, cree un índice de búsqueda que indexe el campo relevante como tipo de token. A partir de Django MongoDB Backend v,5.2.2 puede usar el argumento field_mappings para crear este índice.
La SearchEquals expresión coincide con los documentos en los que un campo es igual a un valor especificado. Esto corresponde al operador "igual" de MongoDB.
Para utilizar este operador, pase los siguientes argumentos al constructor SearchEquals():
pathNombre del campo de búsqueda. Puede especificar un valor de cadena o una instanciaFde.value: El valor a coincidir. Puedes especificar un valor de string o una instanciaValuescore: (Opcional) Una instancia de SearchScoreOption que configura la puntuación de relevancia.
El siguiente ejemplo utiliza el operador SearchEquals para consultar la colección sample_mflix.movies para documentos que tengan un valor title de "Finding Nemo":
Movie.objects.annotate(score=SearchEquals(path="title", value="Finding Nemo"))
Búsqueda automática
Importante
Requisitos adicionales del índice
Antes de usar la SearchAutocomplete expresión en una consulta de búsqueda, cree un índice de búsqueda que indexe el campo relevante como tipo de autocompletado. A partir de Django MongoDB Backend v,5.2.2 puede usar el argumento field_mappings para crear este índice.
La SearchAutocomplete expresión busca una palabra o frase que contenga una secuencia de caracteres de una cadena de entrada incompleta. Esto corresponde al operador de autocompletado de MongoDB.
Para utilizar este operador, pase los siguientes argumentos al constructor SearchAutocomplete():
pathNombre del campo de búsqueda. Puede especificar un valor de cadena o una instanciaFde.queryCadena de entrada que se autocompletará. Puede especificar un valor de cadena o una instanciaValuede.fuzzy: (Opcional) Un diccionario que permite la coincidencia aproximada y permite configurar su comportamiento. Por ejemplo, puede especificar{"maxEdits": 1}para permitir un cambio de carácter antes de que coincida con el término de búsqueda. Para ver todos los valores disponibles, consulte las opciones de autocompletado en la documentación de MongoDB Atlas.token_order: (Opcional) Una cadena que configura el comportamiento de la secuencia de tokens. Puede establecer este valor"sequential"en"any"o.score: (Opcional) Una instancia de SearchScoreOption que configura la puntuación de relevancia.
El siguiente ejemplo utiliza la expresión SearchAutocomplete para consultar la colección sample_mflix.movies en busca de documentos que tengan un valor title que comience con "First":
Movie.objects.annotate(score=SearchAutocomplete(path="title", query="First"))
SearchExiste
La SearchExists expresión coincide con los documentos que contienen un campo especificado. Esto corresponde al operador "exist" de MongoDB.
Para utilizar este operador, pase los siguientes argumentos al constructor SearchExists():
pathNombre del campo que se va a buscar. Puede especificar un valor de cadena o una instanciaFde.score: (Opcional) Una instancia de SearchScoreOption que configura la puntuación de relevancia.
El siguiente ejemplo utiliza la expresión SearchExists para consultar la colección sample_mflix.movies en busca de documentos que tengan un campo plot:
Movie.objects.annotate(score=SearchExists(path="plot"))
Buscar en
Importante
Requisitos adicionales del índice
Antes de usar la SearchIn expresión en una consulta de búsqueda, cree un índice de búsqueda en el campo correspondiente. Si consulta un string campo, debe indexarlo como token. A partir de la versión 7300 de Django MongoDB Backend,5.2.2 puede usar el argumento field_mappings para crear este índice.
La SearchIn expresión coincide con los documentos cuyo valor de campo se encuentra en una lista dada. Esto corresponde al operador "in" de MongoDB.
Para utilizar este operador, pase los siguientes argumentos al constructor SearchIn():
pathNombre del campo de búsqueda. Puede especificar un valor de cadena o una instanciaFde.valueLa lista de valores que se deben buscar. Puede especificar una lista de valores o unaValueinstancia.score: (Opcional) Una instancia de SearchScoreOption que configura la puntuación de relevancia.
El siguiente ejemplo utiliza la expresión SearchIn para consultar la colección sample_mflix.movies en busca de documentos que tengan un valor runtime de 100, 200 o 300 minutos:
Movie.objects.annotate(score=SearchIn(path="runtime", value=[100, 200, 300]))
Frase de búsqueda
La SearchPhrase expresión coincide con secuencias exactas o casi exactas de términos en un campo. Esto corresponde al operador de frase de MongoDB.
Para utilizar este operador, pase los siguientes argumentos al constructor SearchPhrase():
pathNombre del campo de búsqueda. Puede especificar un valor de cadena o una instanciaFde.queryLa frase que se busca. Puede especificar una cadena o una lista de cadenas.slop: (Opcional) El número máximo de términos permitidos entre términos de frases.synonyms: (Opcional) El nombre de una asignación de sinónimos definida en su índice de búsqueda.score: (Opcional) Una instancia de SearchScoreOption que configura la puntuación de relevancia.
El siguiente ejemplo utiliza la expresión SearchPhrase para consultar la colección sample_mflix.movies en busca de documentos que tengan la frase "space adventure" en su campo plot, permitiendo hasta 2 palabras entre estos términos:
Movie.objects.annotate(score=SearchPhrase(path="plot", query="space adventure", slop=2))
Cadena de consulta de búsqueda
El SearchQueryString operador permite realizar búsquedas de texto, comodines, expresiones regulares, difusas y de rango en los string campos. Esto corresponde al operador queryString de MongoDB.
Para utilizar este operador, pase los siguientes argumentos al constructor SearchQueryString():
pathNombre del campo de búsqueda. Puede especificar un valor de cadena o una instanciaFde.queryCadena de consulta de estilo Lucene. Para obtener más información sobre la sintaxis de consulta de Lucene, consulte la documentación de Apache Lucene.score: (Opcional) Una instancia de SearchScoreOption que configura la puntuación de relevancia.
El siguiente ejemplo utiliza la expresión SearchQueryString para consultar la colección sample_mflix.movies en busca de documentos que coincidan con una consulta de estilo Lucene en el campo plot:
Movie.objects.annotate(score=SearchQueryString(path="plot", query="romance AND (paris OR tokyo)"))
Rango de búsqueda
Importante
Requisitos adicionales del índice
Antes de usar la SearchRange expresión en una consulta de búsqueda, cree un índice de búsqueda en el campo correspondiente. Si consulta un string campo, debe indexarlo como token. A partir de la versión 7300 de Django MongoDB Backend,5.2.2 puede usar el argumento field_mappings para crear este índice.
La SearchRange expresión busca valores dentro de un rango específico. Puede proporcionar un rango de valores numéricos, de fecha, de cadena ObjectId o. Esto corresponde al operador de rango de MongoDB.
Para utilizar este operador, pase los siguientes argumentos al constructor SearchRange():
pathNombre del campo de búsqueda. Puede especificar un valor de cadena o una instanciaFde.lt: (Opcional) Límite superior exclusivo<()lte: (Opcional) Límite superior inclusivo<=()gt: (Opcional) Límite inferior exclusivo>()gte: (Opcional) Límite inferior inclusivo>=()score: (Opcional) Una instancia de SearchScoreOption que configura la puntuación de relevancia.
El siguiente ejemplo utiliza la expresión SearchRange para consultar la colección sample_mflix.movies en busca de documentos que tengan un valor runtime entre 90 y 120 minutos.
Movie.objects.annotate(score=SearchRange(path="runtime", gt=90, lt=120))
BúsquedaRegex
La SearchRegex expresión coincide con los valores de los campos de cadena mediante una expresión regular. Esto corresponde al operador regex de MongoDB.
Para utilizar este operador, pase los siguientes argumentos al constructor SearchRegex():
pathNombre del campo de búsqueda. Puede especificar un valor de cadena o una instanciaFde.query:La cadena de expresión regular utilizada para buscar el contenido del campo.allow_analyzed_field: (Opcional) Un valor booleano que indica si se permite la coincidencia con los campos analizados. El valor predeterminadoFalsees.score: (Opcional) Una instancia de SearchScoreOption que configura la puntuación de relevancia.
El siguiente ejemplo utiliza la expresión SearchRegex para consultar la colección sample_mflix.movies en busca de documentos que tengan un valor title que incluya la palabra "winter":
Movie.objects.annotate(score=SearchRegex(path="title", query=r".*winter.*"))
Texto de búsqueda
La SearchText expresión realiza una búsqueda de texto completo en campos de cadena. Esto corresponde al operador de texto de MongoDB.
Para utilizar este operador, pase los siguientes argumentos al constructor SearchText():
pathNombre del campo de búsqueda. Puede especificar un valor de cadena o una instanciaFde.query:El término o frase de búsqueda.fuzzy: (Opcional) Un diccionario que permite la coincidencia aproximada y permite configurar su comportamiento. Por ejemplo, puede especificar{"maxEdits": 1}para permitir un cambio de carácter antes de que coincida con el término de búsqueda.match_criteria: (Opcional) Si se buscan documentos que contengan"all"o"any"de los términos de búsqueda. El valor predeterminado"any"es.synonyms: (Opcional) El nombre de una asignación de sinónimos definida en su índice Atlas.score: (Opcional) Una instancia de SearchScoreOption que configura la puntuación de relevancia.
El siguiente ejemplo utiliza la expresión SearchText para consultar la colección sample_mflix.movies en busca de documentos que tengan "sudden disappearance" en su campo plot, con coincidencia aproximada habilitada:
Movie.objects.annotate(score=SearchText( path="plot", query="sudden disappearance", fuzzy={"maxEdits": 2}, match_criteria="all" ))
Comodín de búsqueda
La SearchWildcard expresión coincide con cadenas mediante patrones comodín. Esto corresponde al operador comodín de MongoDB.
Para utilizar este operador, pase los siguientes argumentos al constructor SearchWildcard():
pathNombre del campo de búsqueda. Puede especificar un valor de cadena o una instanciaFde.query:Una cadena comodín que puede incluir el carácter*, para que coincida con cualquier secuencia de caracteres, y el carácter?, para que coincida con cualquier carácter individual.allow_analyzed_field: (Opcional) Un valor booleano que permite la coincidencia con los campos analizados. El valor predeterminadoFalsees.score: (Opcional) Una instancia de SearchScoreOption que configura la puntuación de relevancia.
El siguiente ejemplo utiliza la expresión SearchWildcard para consultar la colección sample_mflix.movies en busca de documentos que tengan un title que comience con "Star" y termine con cualquier carácter:
Movie.objects.annotate(score=SearchWildcard(path="title", query="Star*"))
BuscarGeoShape
Importante
Requisitos adicionales del índice
Antes de usar la SearchGeoShape expresión en una consulta de búsqueda, cree un índice de búsqueda que indexe el campo relevante como tipo geográfico con la indexShapes propiedad establecida true en. A partir de Django MongoDB Backend v,5.2.2 puede usar el argumento field_mappings para crear este índice.
La SearchGeoShape expresión filtra documentos según sus relaciones espaciales con una forma. Esto corresponde al operador geoShape de MongoDB.
Para utilizar este operador, pase los siguientes argumentos al constructor SearchGeoShape():
pathNombre del campo de búsqueda. Puede especificar un valor de cadena o una instanciaFde.relationRelación espacial a probar. Los valores válidos son"within","intersects"y"disjoint".geometry:Un objeto de geometría GeoJSON para comparar.score: (Opcional) Una instancia de SearchScoreOption que configura la puntuación de relevancia.
El siguiente ejemplo utiliza la expresión SearchGeoShape para consultar la colección sample_mflix.theaters en busca de documentos que tengan un valor geo dentro de un polígono especificado:
chicago = { "type": "Polygon", "coordinates": [ [ [-87.851, 41.976], [-87.851, 41.653], [-87.651, 41.653], [-87.651, 41.976], [-87.851, 41.976], ] ] } theaters = Theater.objects.annotate(score=SearchGeoShape( path="geo", relation="within", geometry=chicago ))
Búsqueda en GeoWithin
Importante
Requisitos adicionales del índice
Antes de usar la SearchGeoWithin expresión en una consulta de búsqueda, cree un índice de búsqueda que indexe el campo de consulta como tipo geográfico. A partir de la versión 7200 de Django MongoDB Backend,5.2.2 puede usar el argumento field_mappings para crear este índice.
La SearchGeoWithin expresión filtra documentos con campos geográficos dentro de una forma específica. Esto corresponde al operador geoWithin de MongoDB.
Para utilizar este operador, pase los siguientes argumentos al constructor SearchGeoWithin():
pathNombre del campo de búsqueda. Puede especificar un valor de cadena o una instanciaFde.kind:El tipo de geometría GeoJSON:"circle","box"o"geometry".geometry:La geometría GeoJSON que define el límite espacial.score: (Opcional) Una instancia de SearchScoreOption que configura la puntuación de relevancia.
El siguiente ejemplo utiliza el operador SearchGeoWithin para consultar la colección sample_mflix.theaters en busca de documentos que tengan un valor geo dentro de un círculo especificado:
circle = { "center": {"type": "Point", "coordinates": [-73.98, 40.75]}, "radius": 5000 } theaters = Theater.objects.annotate(score=SearchGeoWithin( path="geo", kind="circle", geometry=circle ))
Buscar más como esto
La SearchMoreLikeThis expresión busca documentos similares a los ejemplos proporcionados. Esto corresponde al operador moreLikeThis de MongoDB.
Para utilizar este operador, pase los siguientes argumentos al constructor SearchMoreLikeThis():
documents:Una lista de documentos o expresiones de ejemplo que sirven como referencias de similitud.score: (Opcional) Una instancia de SearchScoreOption que configura la puntuación de relevancia.
El siguiente ejemplo utiliza la expresión SearchMoreLikeThis para consultar la colección sample_mflix.movies en busca de documentos que sean similares a un documento de ejemplo proporcionado:
Movie.objects.annotate(score=SearchMoreLikeThis([ {"title": "The Godfather"}, {"genres": ["Crime", "Drama"]} ]))
Combinar expresiones
Puede realizar consultas de búsqueda de MongoDB que combinen múltiples expresiones de búsqueda de las siguientes maneras:
Utilice la clase CompoundExpression
La CompoundExpression expresión permite usar lógica booleana para combinar varias expresiones de búsqueda. Esto corresponde al operador compuesto de MongoDB.
Debe pasar uno o más de los siguientes argumentos al constructor CompoundExpression():
must:Una lista de expresiones con las que deben coincidir los documentosshould:Una lista de expresiones con las que los documentos deben coincidirmust_not:Una lista de expresiones con las que los documentos no deben coincidirfilter:Una lista de expresiones que filtran los resultados
También puedes pasar los siguientes argumentos opcionales:
minimum_should_match:El número mínimo de cláusulasshouldque deben coincidir los documentosscore:Una instancia de SearchScoreOption que configura la puntuación de relevancia
Este ejemplo utiliza la expresión CompoundExpression para consultar la colección sample_mflix.movies en busca de documentos que coincidan con los siguientes criterios:
plotel campo existeplotEl campo contiene el texto"fast-paced"genresEl campo no contiene ni"Romance"ni"Comedy"
plot_exists = SearchExists(path="plot") plot_text = SearchText(path="plot", query="fast-paced") genres_range = SearchIn(path="genres", value=["Romance", "Comedy"]) Movie.objects.annotate( score=CompoundExpression( must=[plot_exists, plot_text], must_not=[genres_range] ) )
Utilice operadores bit a bit
Puedes usar los siguientes operadores bit a bit para combinar expresiones de búsqueda:
&: Representa una operación AND lógica|: Representa una operación OR lógica~: Representa una operación lógica NOT
Este ejemplo usa el operador | para consultar la colección sample_mflix.movies en busca de documentos que coincidan con uno o ambos de los siguientes criterios:
plotEl campo contiene el texto"heartwarming"genresEl campo contiene"Romance"o"Comedy"
expr = SearchText(path="plot", query="heartwarming") | SearchIn(path="genres", value=["Romance", "Comedy"]) Movie.objects.annotate(score=expr)
Configurar puntuaciones de relevancia
MongoDB asigna una puntuación de relevancia a cada documento devuelto en una consulta de búsqueda. Los documentos incluidos en un conjunto de resultados se ordenan de mayor a menor puntuación de relevancia.
Puede usar la expresión SearchScoreOption para personalizar cómo MongoDB calcula y aplica las puntuaciones de relevancia. El constructor SearchScoreOption() acepta los siguientes argumentos:
boost:Aumenta la puntuación de los documentos que coinciden con una expresión específicaconstant:Aplica una puntuación fija a todos los partidosfunction:Aplica una función para calcular la puntuaciónpath:Puntúa los documentos según el valor de un campo
Tip
Para obtener más información sobre las puntuaciones de relevancia, consulte Puntuación de los documentos en los resultados en la documentación de MongoDB Atlas.
El siguiente ejemplo aumenta la puntuación de relevancia de los documentos que coinciden con la expresión SearchEquals por un factor de 3:
boost = SearchScoreOption({"boost": {"value": 3}}) Movie.objects.annotate( score=SearchEquals( path="title", value="Life of Pi", score=boost ) )
Información Adicional
Para obtener más información sobre la creación de índices de búsqueda de MongoDB, consulte Índices de búsqueda en la guía Crear índices.
Para obtener más información sobre las consultas de búsqueda de MongoDB, consulte Descripción general de búsqueda de MongoDB en la documentación de MongoDB Atlas.