Menu Docs
Página inicial do Docs
/ / /
Driver Rust
/ / /

Texto de pesquisa

Nesta página

  • Visão geral
  • Dados de amostra para exemplos
  • Text Index
  • Pesquisa de texto
  • Pesquisar por um termo
  • Pesquisar uma frase
  • Excluir termos da pesquisa
  • Classificar por relevância
  • Agregação
  • Corresponder a um termo de pesquisa
  • Classificar por relevância
  • Informações adicionais
  • Documentação da API

Neste guia, você pode aprender como usar o driver Rust para executar uma pesquisa de texto. Uma pesquisar de texto permite query campo de forma eficiente com valores de string.

Importante

O texto do MongoDB Atlas Search é diferente do recurso mais poderoso do Atlas Search . Para saber mais, consulte adocumentação do Atlas Search .

Este guia inclui as seguintes seções:

  • Dados de amostra para exemplos apresenta os dados de amostra que são usados pelos exemplos de Atlas Search de texto

  • Índice de texto descreve como criar um índice de texto em um campo com valor de string

  • A Atlas Searchde texto descreve como realizar pesquisas de texto com diferentes critérios da Atlas Search

  • Agregação descreve como realizar pesquisas de texto usando pipelines de agregação

  • Informações adicionais fornecem links para recursos e documentação da API para os tipos e métodos mencionados neste guia

Os exemplos nesta aba usam o seguinte struct Dish como um modelo para documentos na coleção menu:

#[derive(Serialize, Deserialize, Debug)]
struct Dish {
name: String,
description: String,
}

Os exemplos usam os seguintes documentos de exemplo que descrevem pratos que você pode pedir em um restaurante:

{ "name": "Shepherd’s Pie", "description": "A vegetarian take on the classic dish that uses lentils as a base. Serves 2." },
{ "name": "Green Curry", "description": "A flavorful Thai curry, made vegetarian with tofu. Vegetarian and vegan friendly." },
{ "name": "Herbed Branzino", "description": "Grilled whole fish stuffed with herbs and pomegranate seeds. Serves 3-4." },
{ "name": "Kale Tabbouleh", "description": "A bright, herb-based salad. A perfect starter for vegetarians and vegans." },
{ "name": "Garlic Butter Trout", "description": "Baked trout seasoned with garlic, lemon, dill, and, of course, butter. Serves 2." }

Antes de realizar uma pesquisa de texto, você deve criar um índice de texto na collection. Um índice de texto especifica a string ou o campo de array de strings no qual você pode executar pesquisas de texto.

Os exemplos deste guia executam pesquisar de texto no campo description de documento na collection menu . Para habilitar pesquisas de texto no campo description , crie um índice de texto como mostrado no seguinte código:

let index = IndexModel::builder()
.keys(doc! { "description": "text" })
.build();
let idx_res = my_coll.create_index(index).await?;

Uma pesquisa de texto recupera documentos que contêm um termo ou frase especificada no valor do campo indexado. Um termo é uma sequência de caracteres que exclui caracteres de espaços em branco. Uma frase é uma sequência de termos com qualquer número de caracteres do espaço em branco.

Para executar uma pesquisa de texto, inclua o operador de query de avaliação do $text , seguido pelo campo $search em seu filtro de query. O operador $text especifica que você está realizando uma pesquisa de texto nos campos indexados de texto. O campo $search especifica o termo ou frase a ser pesquisada nos campos indexados por texto.

Filtros de query para pesquisas de texto usam o seguinte formato:

let filter = doc! { "$text": { "$search": "<search term or phrase>" } };

Para pesquisar um termo, especifique o termo como uma string em seu filtro de query. Para pesquisar vários termos, separe cada termo com um espaço.

Observação

Ao pesquisar vários termos, o método find() retorna qualquer documento no qual o campo ou campos indexados por texto contenham pelo menos um dos termos.

Por exemplo, se os termos de sua pesquisa forem "one two three", o MongoDB retornará documentos nos quais o campo indexado contém "one", "two", "three" ou mais de um desses termos.

O exemplo a seguir executa uma pesquisa de documentos nos quais o campo description contém o termo "herb":

let filter = doc! { "$text": { "$search": "herb" } };
let mut cursor = my_coll.find(filter).await?;
while let Some(doc) = cursor.try_next().await? {
println!("{:?}", doc);
}
Dish { name: "Kale Tabbouleh", description: "A bright, herb-based salad. A perfect starter for vegetarians and vegans." }
Dish { name: "Herbed Branzino", description: "Grilled whole fish stuffed with herbs and pomegranate seeds. Serves 3-4." }

Dica

Mesmo que o termo de pesquisa seja "herb", a pesquisa de texto também corresponde a documentos nos quais o campo description contém "herbs". Isso ocorre porque um índice de texto do MongoDB usa derivação de sufixo para corresponder a palavras semelhantes. Para saber mais sobre como o MongoDB corresponde aos termos, consulte Entradas de índice no manual do servidor.

Para pesquisar uma frase, especifique a frase com aspas escapadas em seu filtro de query:

let filter = doc! { "$text": { "$search": "\"<some phrase>\"" } };

Se você não adicionar aspas escapadas ao redor da frase, o Atlas Search executará um Atlas Search.

O exemplo a seguir executa uma pesquisa de documentos nos quais o campo description contém a frase "serves 2":

let filter = doc! { "$text": { "$search": "\"serves 2\"" } };
let mut cursor = my_coll.find(filter).await?;
while let Some(doc) = cursor.try_next().await? {
println!("{:?}", doc);
}
Dish { name: "Shepherd’s Pie", description: "A vegetarian take on the classic dish that uses lentils as a base. Serves 2." }
Dish { name: "Garlic Butter Trout", description: "Baked trout seasoned with garlic, lemon, dill, and, of course, butter. Serves 2." }

Para especificar um termo ou frase que você deseja excluir da pesquisa de texto, prefixe-o com um sinal de subtração no filtro de query:

let filter = doc! { "$text": { "$search": "<term> -<excluded term>" } };

Importante

Você deve pesquisar pelo menos um termo ou frase para excluir outros termos da sua pesquisa. Se você excluir apenas os termos, a pesquisa não retornará nenhum documento.

O exemplo a seguir executa uma pesquisa de documentos nos quais o campo description contém o termo "vegan", mas não contém o termo "tofu":

let filter = doc! { "$text": { "$search": "vegan -tofu" } };
let mut cursor = my_coll.find(filter).await?;
while let Some(doc) = cursor.try_next().await? {
println!("{:?}", doc);
}
Dish { name: "Kale Tabbouleh", description: "A bright, herb-based salad. A perfect starter for vegetarians and vegans." }

Uma pesquisa de texto atribui uma pontuação numérica de texto para indicar até que ponto cada resultado corresponde à string em seu filtro de query. Uma pontuação de texto mais alta indica que o resultado é mais relevante para sua query. Para revelar a pontuação de texto em sua saída, utilize uma projeção para recuperar o campo textScore dos metadados. Você pode classificar a pontuação do texto em ordem decrescente especificando uma classificação no campo de metadados textScore .

Este exemplo executa as seguintes ações:

  • Realiza uma pesquisa por documentos em que o campo description contém o termo "vegetarian"

  • Classifica os resultados em ordem decrescente na pontuação de texto

  • Inclui apenas os campos name e score na saída

let filter = doc! { "$text": { "$search": "vegetarian" } };
let sort = doc! { "score": { "$meta": "textScore" } };
let projection =
doc! {
"_id": 0,
"name": 1,
"score": { "$meta": "textScore" }
};
let doc_coll: Collection<Document> = my_coll.clone_with_type();
let mut cursor = doc_coll.find(filter)
.sort(sort)
.projection(projection)
.await?;
while let Some(doc) = cursor.try_next().await? {
println!("{:?}", doc);
}
Document({"name": String("Green Curry"), "score": Double(0.9166666666666667)})
Document({"name": String("Kale Tabbouleh"), "score": Double(0.5625)})
Document({"name": String("Shepherd’s Pie"), "score": Double(0.5555555555555556)})

Você pode incluir o operador de query de avaliação do $text em um estágio de agregação $match para executar uma pesquisa de texto em um pipeline de agregação .

As seções a seguir demonstram como realizar pesquisas de texto usando aggregation pipelines em vez do método find() .

O exemplo a seguir usa uma agregação para realizar uma pesquisa de documentos nos quais o campo description contém o termo "herb":

let match_stage = doc! { "$match": { "$text": { "$search": "herb" } } };
let mut cursor = my_coll.aggregate([match_stage]).await?;
while let Some(doc) = cursor.try_next().await? {
println!("{:?}", doc);
}
Document({"_id": ObjectId("..."), "name": String("Kale Tabbouleh"), "description": String("A bright, herb-based salad. A perfect starter for vegetarians and vegans.")})
Document({"_id": ObjectId("..."), "name": String("Herbed Branzino"), "description": String("Grilled whole fish stuffed with herbs and pomegranate seeds. Serves 3-4.")})

Este exemplo usa uma agregação para executar a seguinte ação:

  • Realiza uma pesquisa por documentos em que o campo description contém o termo "vegetarian"

  • Classifica os resultados em ordem decrescente na pontuação de texto

  • Inclui apenas os campos name e score na saída

let match_stage = doc! { "$match": { "$text": { "$search": "vegetarian" } } };
let sort_stage = doc! { "$sort": { "score": { "$meta": "textScore" } } };
let proj_stage =
doc! { "$project": {
"_id": 0,
"name": 1,
"score": { "$meta": "textScore" }
} };
let pipeline = [match_stage, sort_stage, proj_stage];
let mut cursor = my_coll.aggregate(pipeline).await?;
while let Some(doc) = cursor.try_next().await? {
println!("{:?}", doc);
}
Document({"name": String("Green Curry"), "score": Double(0.9166666666666667)})
Document({"name": String("Kale Tabbouleh"), "score": Double(0.5625)})
Document({"name": String("Shepherd’s Pie"), "score": Double(0.5555555555555556)})

Para obter um exemplo executável que usa o método find() , consulte o exemplo de uso Encontrar vários documentos .

Para saber mais sobre as operações neste guia, consulte a seguinte documentação:

Para saber mais sobre os métodos e tipos mencionados neste guia, consulte a documentação da API abaixo:

Voltar

Fluxos de change streams