Texto de pesquisa
Nesta página
Visão geral
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
Dados de amostra para exemplos
Os exemplos nesta aba usam o seguinte struct Dish
como um modelo para documentos na coleção menu
:
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." }
Text Index
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?;
Pesquisa de texto
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>" } };
Pesquisar por um termo
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.
Exemplo
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.
Pesquisar uma frase
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.
Exemplo
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." }
Excluir termos da pesquisa
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.
Exemplo
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." }
Classificar por relevância
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
.
Exemplo
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
escore
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)})
Agregação
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()
.
Corresponder a um termo de pesquisa
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.")})
Classificar por relevância
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
escore
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)})
Informações adicionais
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:
Índices de texto no manual do servidor
$text no manual do servidor MongoDB
$meta no manual do servidor
Documentação da API
Para saber mais sobre os métodos e tipos mencionados neste guia, consulte a documentação da API abaixo: