Overview
En esta guía, puede aprender a ejecutar una consulta de texto en el controlador Java de MongoDB.
Puede usar una consulta de texto para recuperar documentos que contengan un término o una frase en un campo específico. Un término es una secuencia de caracteres que excluye los espacios en blanco. Una frase es una secuencia de términos con cualquier número de espacios en blanco.
Las siguientes secciones le muestran cómo realizar los siguientes tipos de consultas de texto:
Consultar texto por un término
Consultar texto por frase
Texto de consulta con términos excluidos
Si desea ordenar los resultados de su consulta de texto, consulte la Sección de consultade texto de nuestra guía de resultados de clasificación.
Documentos de muestra
Las siguientes secciones presentan ejemplos de consultas de texto en el
fast_and_furious_movies Colección. Cada sección utiliza una variable llamada collection para referirse a la instancia MongoCollection de la colección fast_and_furious_movies.
La colección fast_and_furious_movies contiene documentos que describen una de las películas de la saga Rápidos y Furiosos. Cada documento contiene un campo de título y un campo de etiquetas.
{ "_id": 1, "title": "2 Fast 2 Furious ", "tags": ["undercover", "drug dealer"] } { "_id": 2, "title": "Fast 5", "tags": ["bank robbery", "full team"] } { "_id": 3, "title": "Furious 7", "tags": ["emotional"] } { "_id": 4, "title": "The Fate of the Furious", "tags": ["betrayal"] }
Text Index
Debe crear un índice de texto antes de ejecutar una consulta de texto. Un índice de texto especifica el campo de cadena o matriz de cadenas donde se ejecutará la búsqueda.
En los siguientes ejemplos, se ejecutan consultas de texto en el title campo de la fast_and_furious_movies colección. Para habilitar las búsquedas de texto en el title campo, cree un índice de texto con el generador de índices y el siguiente fragmento:
collection.createIndex(Indexes.text("title"));
Para obtener más información, consulte los siguientes recursos:
Entrada manualdel servidor de índices de texto
Consulta de texto
Utilice el método Filters.text() para especificar una consulta de texto.
El Filters.text() método utiliza el generador de filtros para definir un filtro de consulta que especifica qué buscar en la consulta de texto. El filtro de consulta se representa mediante una instancia BSON. Pase el filtro de consulta al find() método para ejecutar una consulta de texto.
Al ejecutar el find() método, MongoDB ejecuta una consulta de texto en todos los campos indexados con el índice de texto de la colección. MongoDB devuelve documentos que contienen uno o más términos de búsqueda y una puntuación de relevancia para cada resultado. Para obtener más información sobre las puntuaciones de relevancia, consulte la sección "Consulta de texto" en nuestra guía "Ordenar resultados".
Especificar opciones
Puede incluir TextSearchOptions como segundo parámetro del método Filters.text() para especificar opciones de consulta de texto, como la distinción entre mayúsculas y minúsculas. De forma predeterminada, las consultas de texto se ejecutan sin distinción entre mayúsculas y minúsculas, lo que significa que la búsqueda coincide con valores en mayúsculas y minúsculas.
Para especificar una búsqueda que distinga entre mayúsculas y minúsculas, utilice el siguiente fragmento:
TextSearchOptions options = new TextSearchOptions().caseSensitive(true); Bson filter = Filters.text("SomeText", options);
Para obtener más información sobre los métodos y clases mencionados en esta sección, consulte la siguiente documentación de API:
Buscar texto por un término
Pase un término como string al método Filters.text() para especificar el término en su text query.
Ejemplo
El siguiente ejemplo ejecuta una consulta de texto en los documentos de la colección fast_and_furious_movies para títulos que contienen el término "rápido":
Bson filter = Filters.text("fast"); collection.find(filter).forEach(doc -> System.out.println(doc.toJson()));
A continuación se muestra la salida del código anterior:
{ "_id": 1, "title": "2 Fast 2 Furious ", "tags": ["undercover", "drug dealer"] } { "_id": 2, "title": "Fast 5", "tags": ["bank robbery", "full team"] }
Para encontrar coincidencias en varios términos de su consulta de texto, separe cada término con espacios en el método de construcción Filters.text(). Este método devuelve la consulta de texto como una instancia Bson. Al pasar esto al método find(), este devuelve los documentos que coinciden con cualquiera de los términos.
Ejemplo
El siguiente ejemplo ejecuta una consulta de texto en los documentos de la colección fast_and_furious_movies para títulos que contengan los términos "fate" o "7":
Bson filter = Filters.text("fate 7"); collection.find(filter).forEach(doc -> System.out.println(doc.toJson()));
A continuación se muestra la salida del código anterior:
{ "_id": 3, "title": "Furious 7", "tags": ["emotional"] } { "_id": 4, "title": "The Fate of the Furious", "tags": ["betrayal"] }
Buscar texto por una frase
Pasa una frase con comillas escapadas al método Filters.text() para especificar la frase en tu query de texto. Las comillas escapadas son caracteres de comillas dobles precedidos de una barra invertida. Si no añades comillas escapadas alrededor de la frase, el método find() ejecuta una búsqueda de términos.
Ejemplo
El siguiente ejemplo ejecuta una consulta de texto en los documentos de la colección fast_and_furious_movies para títulos que contengan la frase "fate of the furious":
Bson filter = Filters.text("\"fate of the furious\""); collection.find(filter).forEach(doc -> System.out.println(doc.toJson()));
A continuación se muestra la salida del código anterior:
{ "_id": 4, "title": "The Fate of the Furious", "tags": ["betrayal"] }
Buscar texto con términos excluidos
Para cada término que desees excluir de tu query de texto, anteponle un signo menos en la cadena que envíes al método generador Filters.text().
Ninguno de los documentos devueltos por la búsqueda contiene el término excluido en su campo de índice de texto.
Importante
Debe tener al menos un término de consulta de texto si desea excluir términos de su búsqueda.
Ejemplo
El siguiente ejemplo ejecuta una consulta de texto en los documentos de la colección fast_and_furious_movies para títulos que contienen el término "furioso", pero no contienen el término "rápido":
Bson filter = Filters.text("furious -fast"); collection.find(filter).forEach(doc -> System.out.println(doc.toJson()));
A continuación se muestra la salida del código anterior:
{ "_id": 3, "title": "Furious 7", "tags": ["emotional"] } { "_id": 4, "title": "The Fate of the Furious", "tags": ["betrayal"] }