Realizar pesquisa de texto com o Amazon DocumentDB
O recurso nativo de pesquisa de texto completo do Amazon DocumentDB permite que você realize pesquisas de texto em grandes conjuntos de dados textuais usando índices de texto para fins especiais. Esta seção descreve as funcionalidades do recurso de índice de texto e fornece etapas sobre como criar e usar índices de texto no Amazon DocumentDB. As limitações da pesquisa de texto também estão listadas.
Tópicos
Funções com suporte
A pesquisa de texto do Amazon DocumentDB suporta as seguintes funcionalidades compatíveis com a API MongoDB:
Criar índices de texto em um único campo.
Criar índices de texto composto que incluam mais de um campo de texto.
Fazer pesquisas com uma ou várias palavras.
Controlar os resultados da pesquisa usando pesos.
Classificar os resultados da pesquisa por pontuação.
Usar o índice de texto no pipeline de agregação.
Pesquisar a frase exata.
Usar o índice de texto do Amazon DocumentDB
Para criar um índice de texto em um campo contendo dados de string, especifique a string “text” conforme mostrado abaixo:
Índice de campo único:
db.test.createIndex({"comments": "text"})
Esse índice suporta consultas de pesquisa de texto no campo da string “comments” na coleção especificada.
Crie um índice de texto composto em mais de um campo de string:
db.test.createIndex({"comments": "text", "title":"text"})
Esse índice suporta consultas de pesquisa de texto nos campos de caracteres “comentários” e “título” na coleção especificada. É possível especificar até 30 campos ao criar um índice de texto composto. Depois de criadas, suas consultas de pesquisa de texto consultarão todos os campos indexados.
nota
Somente um índice de texto é permitido em cada coleção.
Listar um índice de texto em uma coleção do Amazon DocumentDB
Você pode usar getIndexes()
em sua coleção para identificar e descrever índices, incluindo índices de texto, conforme mostrado no exemplo abaixo:
rs0:PRIMARY> db.test.getIndexes() [ { "v" : 4, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "test.test" }, { "v" : 1, "key" : { "_fts" : "text", "_ftsx" : 1 }, "name" : "contents_text", "ns" : "test.test", "default_language" : "english", "weights" : { "comments" : 1 }, "textIndexVersion" : 1 } ]
Depois de criar um índice, você pode começar a inserir dados em sua coleção do Amazon DocumentDB.
db.test.insertMany([{"_id": 1, "star_rating": 4, "comments": "apple is red"}, {"_id": 2, "star_rating": 5, "comments": "pie is delicious"}, {"_id": 3, "star_rating": 3, "comments": "apples, oranges - healthy fruit"}, {"_id": 4, "star_rating": 2, "comments": "bake the apple pie in the oven"}, {"_id": 5, "star_rating": 5, "comments": "interesting couch"}, {"_id": 6, "star_rating": 5, "comments": "interested in couch for sale, year 2022"}])
Executar consultas de pesquisa de texto
Executar uma consulta de pesquisa de texto com uma única palavra
Você precisará usar os operadores $text
e $search
para realizar pesquisas de texto. O exemplo a seguir retorna todos os documentos em que seu campo indexado de texto contém a string “apple” simplesmente ou em outros formatos, como “apples”:
db.test.find({$text: {$search: "apple"}})
Saída:
A saída desse comando será semelhante a esta:
{ "_id" : 1, "star_rating" : 4, "comments" : "apple is red" }
{ "_id" : 3, "star_rating" : 3, "comments" : "apples, oranges - healthy fruit" }
{ "_id" : 4, "star_rating" : 2, "comments" : "bake the apple pie in the oven" }
Executar uma pesquisa de texto com várias palavras
Você também pode realizar pesquisas de texto com várias palavras nos seus dados do Amazon DocumentDB. O comando abaixo retorna documentos com um campo de texto indexado contendo “apple” ou “pie”:
db.test.find({$text: {$search: "apple pie"}})
Saída:
A saída desse comando será semelhante a esta:
{ "_id" : 1, "star_rating" : 4, "comments" : "apple is red" }
{ "_id" : 2, "star_rating" : 5, "comments" : "pie is delicious" }
{ "_id" : 3, "star_rating" : 3, "comments" : "apples, oranges - healthy fruit" }
{ "_id" : 4, "star_rating" : 2, "comments" : "bake the apple pie in the oven" }
Executar uma pesquisa de texto com várias palavras
Para uma pesquisa com várias palavras, use este exemplo:
db.test.find({$text: {$search: "\"apple pie\""}})
Saída:
O comando acima retorna documentos com campo de texto indexado contendo a frase exata “apple pie”. A saída desse comando será semelhante a esta:
{ "_id" : 4, "star_rating" : 2, "comments" : "bake the apple pie in the oven" }
Executar uma pesquisa de texto com filtros
Você também pode combinar a pesquisa de texto com outros operadores de consulta para filtrar os resultados com base em critérios adicionais:
db.test.find({$and: [{star_rating: 5}, {$text: {$search: "interest"}}]})
Saída:
O comando acima retorna documentos com um campo indexado de texto contendo qualquer forma de “interest” e uma “star_rating” igual a 5. A saída desse comando será semelhante a esta:
{ "_id" : 5, "star_rating" : 5, "comments" : "interesting couch" }
{ "_id" : 6, "star_rating" : 5, "comments" : "interested in couch for sale, year 2022" }
Limitar o número de documentos retornados em uma pesquisa de texto
Você pode optar por restringir o número de documentos devolvidos usando limit
:
db.test.find({$and: [{star_rating: 5}, {$text: {$search: "couch"}}]}).limit(1)
Saída:
O comando acima retorna um resultado que satisfaz o filtro:
{ "_id" : 5, "star_rating" : 5, "comments" : "interesting couch" }
Classificar resultados por pontuação de texto
O exemplo a seguir classifica os resultados da pesquisa de texto por pontuação de texto:
db.test.find({$text: {$search: "apple"}}, {score: {$meta: "textScore"}}).sort({score: {$meta: "textScore"}})
Saída:
O comando acima retorna documentos com um campo de texto indexado contendo “apple” simplesmente ou em outros formatos, como “apples”, e classifica o resultado com base na relevância do documento em relação ao termo de pesquisa. A saída desse comando será semelhante a esta:
{ "_id" : 1, "star_rating" : 4, "comments" : "apple is red", "score" : 0.6079270860936958 }
{ "_id" : 3, "star_rating" : 3, "comments" : "apples, oranges - healthy fruit", "score" : 0.6079270860936958 }
{ "_id" : 4, "star_rating" : 2, "comments" : "bake the apple pie in the oven", "score" : 0.6079270860936958 }
$text
e $search
também são suportados para os comandos aggregate
, count
, findAndModify
, update
e delete
.
Operadores de agregação
Pipeline de agregação usando $match
db.test.aggregate( [{ $match: { $text: { $search: "apple pie" } } }] )
Saída:
O comando acima retorna os seguintes resultados:
{ "_id" : 1, "star_rating" : 4, "comments" : "apple is red" }
{ "_id" : 3, "star_rating" : 3, "comments" : "apple - a healthy fruit" }
{ "_id" : 4, "star_rating" : 2, "comments" : "bake the apple pie in the oven" }
{ "_id" : 2, "star_rating" : 5, "comments" : "pie is delicious" }
Uma combinação de outros operadores de agregação
db.test.aggregate( [ { $match: { $text: { $search: "apple pie" } } }, { $sort: { score: { $meta: "textScore" } } }, { $project: { score: { $meta: "textScore" } } } ] )
Saída:
O comando acima retorna os seguintes resultados:
{ "_id" : 4, "score" : 0.6079270860936958 }
{ "_id" : 1, "score" : 0.3039635430468479 }
{ "_id" : 2, "score" : 0.3039635430468479 }
{ "_id" : 3, "score" : 0.3039635430468479 }
Especifique vários campos ao criar um índice de texto
Você pode atribuir pesos a até três campos em seu índice de texto composto. O peso padrão atribuído a um campo em um índice de texto é um (1). O peso é um parâmetro opcional e deve estar na faixa de 1 a 100000.
db.test.createIndex( { "firstname": "text", "lastname": "text", ... }, { weights: { "firstname": 5, "lastname":10, ... }, name: "name_text_index" } )
Diferenças com o MongoDB
O atributo de índice de texto do Amazon DocumentDB usa índice invertido com um algoritmo de frequência de termos. Os índices de texto são esparsos por padrão. Devido às diferenças na lógica de análise, delimitadores de tokenização e outros, o mesmo conjunto de resultados do MongoDB pode não ser retornado para o mesmo conjunto de dados ou formato de consulta.
Existem as seguintes diferenças adicionais entre o índice de texto do Amazon DocumentDB e o MongoDB:
Não há suporte para índices compostos usando índices que não sejam de texto.
Os índices de texto do Amazon DocumentDB não diferenciam maiúsculas de minúsculas e sinais diacríticos.
Somente o idioma inglês é suportado com o índice de texto.
A indexação de texto de campos de matriz (ou de várias chaves) não é suportada. Por exemplo, a criação de um índice de texto em “a“ com o documento {“a”: [“apple”, “pie”]} falhará.
A indexação de texto curinga não é suportada.
Índices de texto exclusivos não são suportados.
A exclusão de um termo não é suportada.
Práticas recomendadas e diretrizes
Para um desempenho ideal em consultas de pesquisa de texto que envolvam classificação por pontuações de texto, recomendamos que você crie o índice de texto antes de carregar os dados.
Os índices de texto exigem armazenamento adicional para uma cópia interna otimizada dos dados indexados. Isso tem implicações adicionais de custo.
Limitações
A pesquisa de texto tem as seguintes limitações no Amazon DocumentDB:
A pesquisa de texto é compatível somente com clusters baseados em instâncias do Amazon DocumentDB 5.0.