Usar pesquisas de texto
Use os recursos de pesquisa de texto no Firestore com compatibilidade com o MongoDB para pesquisar strings específicas em uma coleção.
Antes de começar
Antes de começar a usar pesquisas de texto, faça o seguinte:
Verifique se você tem acesso a um banco de dados de operações compatível com o MongoDB ou crie um banco de dados e conecte-se a ele.
Verifique se você tem um índice de texto ou crie um índice de texto.
Executar uma pesquisa de texto
As pesquisas de texto usam o operador $text dentro de um filtro.
Especifique a string consultada no argumento $search.
Executar uma pesquisa de texto geral
Execute o comando a seguir para fazer uma pesquisa de texto geral:
# Find search
db.cities.find({ $text: { $search: "french bread" } })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "french bread" } } }
]);
Se o índice for particionado, você poderá filtrar com base na partição, incluindo-a em um filtro de igualdade "e" na pesquisa.
Por exemplo, se você tiver uma partição city, poderá filtrar uma pesquisa de texto da seguinte maneira:
db.myCollection.find( { $and: [
{ $text: { $search: "french bread" } },
{ "city": "Paris" }
] } )
Também é possível filtrar uma agregação com base em uma partição. Por exemplo:
db.myCollection.aggregate([
{ $match: { $text: { $search: "french bread" } } },
{ "city": "Paris" }
] );
O valor da partição precisa ser uma string. O filtro de partição precisa ser unido à pesquisa de texto usando um "e".
Definir o idioma da pesquisa de texto
É possível definir o idioma da pesquisa de texto usando o argumento $language. Por exemplo:
db.cities.find({ $text: { $search: "french bread", $language: "en"} })
Se você não definir um idioma, a pesquisa usará o idioma do índice de texto.
Pesquisar um termo exato
Para pesquisar um termo exato, configure-o como uma sequência de palavras entre aspas duplas. Por exemplo:
# Find search
db.cities.find({ $text: { $search: "\"best french bread\"" } })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "\"best french bread\"" } } },
]);
Pesquisar uma combinação de termos
Para tornar a pesquisa de texto mais precisa, especifique uma cadeia de termos. Por exemplo, a pesquisa a seguir retorna documentos que correspondem à combinação best AND french AND ("bread" OR "is"):
# Find search
db.cities.find({ $text: { $search: "\"best\" \"french\" bread is" } })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "\"best\" \"french\" bread is" } } },
]);
Excluir um termo
Para excluir um termo de uma pesquisa de texto, adicione um hífen (-) antes dele:
# Find search
db.cities.find({ $text: { $search: "best bread -french"} })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "best bread -french" } } },
]);
Calcular a pontuação de relevância
Use a expressão {$meta: "textScore"} para calcular a pontuação de relevância de
documentos correspondentes à pesquisa de texto. Para classificar os resultados em ordem decrescente de pontuação, use $meta em uma expressão de classificação. Considere os exemplos a seguir,
em que SCORE_FIELD é o nome do campo usado para armazenar o valor da pontuação:
# Find search
db.cities
.find({ $text: { $search: "best french bread" } })
.sort({ SCORE_FIELD: { $meta: "textScore" } })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "best french bread" } } },
{ $sort: { "SCORE_FIELD": { $meta: "textScore"} } },
]);
Também é possível usar a pontuação de texto em expressões de projeção. Por exemplo:
# Find search
db.cities
.find({ $text: { $search: "best french bread" } })
.project({ score: { $meta: "textScore" } })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "best french bread" } } },
{ $project: { "scoreField": { $meta: "textScore"} } },
]);
Expandir a pesquisa
Para melhorar a relevância dos resultados da pesquisa de texto, o operador $text aumenta a string de pesquisa de acordo com o idioma especificado para incluir correspondências de sinônimos contextuais, formas flexionadas, termos corrigidos ortograficamente, variações de acentuação e muito mais.
Limitações
- Os operadores
$neare$textnão podem ser usados na mesma pesquisa de texto. - Um único operador
$texté permitido por pesquisafindouaggregation. - Em agregações, a etapa
$matchcom$textprecisa ser a primeira etapa do pipeline. $textsó pode ser aninhado em$ande$or.- Se
$textestiver dentro de$or, as disjunções não pesquisadas poderão usar índices ordenados existentes para otimizar a pesquisa. Se as outras disjunções não forem indexadas, a pesquisa vai depender de uma verificação de coleção. $textnão pode ser usado com dicas.- As consultas com pesquisa de texto não podem ser classificadas por
$natural.