Realizar pesquisa de texto com o Amazon DocumentDB - Amazon DocumentDB

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.

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.

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.