Usa las funciones de búsqueda de texto en Cloud Firestore para buscar cadenas específicas dentro de una colección.
Antes de comenzar
Antes de comenzar a usar las consultas de texto, haz lo siguiente:
Asegúrate de tener acceso a una base de datos de operaciones compatibles con MongoDB existente o crea una base de datos y conéctate a ella.
Asegúrate de tener un índice de texto o crea uno.
Permisos de IAM
Para crear un índice en Cloud Firestore, asegúrate de que se te asigne cualquiera de los siguientes roles:
roles/datastore.ownerroles/datastore.indexAdminroles/editorroles/owner
Para otorgar un rol, consulta Otorga un solo rol. Para obtener más información sobre los roles Cloud Firestore y los permisos asociados, consulta Roles predefinidos.
Si definiste roles personalizados, asigna todos los permisos siguientes para crear índices:
datastore.indexes.createdatastore.indexes.deletedatastore.indexes.getdatastore.indexes.listdatastore.indexes.update
Ejecuta una consulta de texto
Las consultas de texto usan el operador $text dentro de un filtro.
Especifica la cadena consultada en el argumento $search.
Ejecuta una consulta de texto general
Ejecuta la siguiente consulta para realizar una consulta general:
# Find query
db.cities.find({ $text: { $search: "french bread" } })
# Aggregation query
db.cities.aggregate([
{ $match: { $text: { $search: "french bread" } } }
]);
Si tu índice está particionado, puedes filtrar según la partición. Para ello, incluye la partición en un filtro de igualdad "and" dentro de tu consulta.
Por ejemplo, si tuvieras una partición city, podrías filtrar una consulta de texto de la siguiente manera:
db.myCollection.find( { $and: [
{ $text: { $search: "french bread" } },
{ "city": "Paris" }
] } )
También puedes filtrar una agregación según una partición. Por ejemplo:
db.myCollection.aggregate([
{ $match: { $text: { $search: "french bread" } } },
{ "city": "Paris" }
] );
El valor de tu partición debe ser una cadena. Tu filtro de partición debe unirse a tu consulta con un "and".
Establece el idioma de la consulta
Puedes establecer el idioma de la consulta con el argumento $language. Por ejemplo:
db.cities.find({ $text: { $search: "french bread", $language: "en"} })
Si no estableces el idioma de la consulta, la consulta usará el idioma del índice de texto.
Consulta un término exacto
Para consultar un término exacto, configura el término como una secuencia de palabras encerradas entre comillas dobles. Por ejemplo:
# Find query
db.cities.find({ $text: { $search: "\"best french bread\"" } })
# Aggregation query
db.cities.aggregate([
{ $match: { $text: { $search: "\"best french bread\"" } } },
]);
Consulta una combinación de términos
Para que tu consulta sea más precisa, especifica una cadena de términos. Por ejemplo, la siguiente consulta muestra documentos que coinciden con la combinación best AND french AND ("bread" OR "is"):
# Find query
db.cities.find({ $text: { $search: "\"best\" \"french\" bread is" } })
# Aggregation query
db.cities.aggregate([
{ $match: { $text: { $search: "\"best\" \"french\" bread is" } } },
]);
Excluye un término
Para excluir un término de una consulta, antepón un guion (-) al término:
# Find query
db.cities.find({ $text: { $search: "best bread -french"} })
# Aggregation query
db.cities.aggregate([
{ $match: { $text: { $search: "best bread -french" } } },
]);
Calcula la puntuación de relevancia
Usa la expresión {$meta: "textScore"} para calcular la puntuación de relevancia de
los documentos que coinciden con la consulta de texto. Para ordenar los resultados en orden descendente de puntuación, usa $meta en una expresión de orden. Considera los siguientes ejemplos,
en los que SCORE_FIELD es el nombre del campo que se usa para almacenar el valor de la puntuación:
# Find query
db.cities
.find({ $text: { $search: "best french bread" } })
.sort({ SCORE_FIELD: { $meta: "textScore" } })
# Aggregation query
db.cities.aggregate([
{ $match: { $text: { $search: "best french bread" } } },
{ $sort: { "SCORE_FIELD": { $meta: "textScore"} } },
]);
También puedes usar la puntuación de texto en expresiones de proyección. Por ejemplo:
# Find query
db.cities
.find({ $text: { $search: "best french bread" } })
.project({ score: { $meta: "textScore" } })
# Aggregation query
db.cities.aggregate([
{ $match: { $text: { $search: "best french bread" } } },
{ $project: { "scoreField": { $meta: "textScore"} } },
]);
Expandir consulta
Para mejorar la relevancia de los resultados de la consulta, el operador $text aumenta la cadena de búsqueda según el idioma especificado para incluir coincidencias de sinónimos sensibles al contexto, formas derivadas, términos corregidos ortográficamente, variaciones de signos diacríticos y mucho más.
Limitaciones
- Los operadores
$neary$textno se pueden usar en la misma consulta. - Se permite un solo operador
$textpor consultafindoaggregation. - En las agregaciones, la etapa
$matchcon$textdebe ser la primera etapa de la canalización. $textsolo se puede anidar dentro de$andy$or.- Si
$textestá dentro de$or, las disyunciones que no son de búsqueda pueden usar índices ordenados existentes para optimizar la consulta. Si las otras disyunciones no están indexadas, la consulta se basará en un análisis de la colección. $textno se puede usar con sugerencias de consultas.- Las consultas con búsqueda de texto no pueden ordenar por
$natural.