Se você realizar queries de pesquisa de texto em um grande conjunto de dados, um índice de texto de campo único poderá verificar um grande número de entradas para retornar resultados, o que pode resultar em queries lentas.
Para melhorar o desempenho da query, você pode criar umíndice de texto composto e incluir uma correspondência de igualdade nas suas queries de pesquisa de texto. Se o índice composto contiver o campo usado em sua correspondência de igualdade, o índice verificará menos entradas e retornará os resultados mais rapidamente.
Sobre esta tarefa
Neste exemplo, um gerente de loja faz query de uma collection inventory que contém estes documentos:
db.inventory.insertMany( [ { _id: 1, department: "tech", description: "lime green computer" }, { _id: 2, department: "tech", description: "wireless red mouse" }, { _id: 3, department: "kitchen", description: "green placemat" }, { _id: 4, department: "kitchen", description: "red peeler" }, { _id: 5, department: "food", description: "green apple" }, { _id: 6, department: "food", description: "red potato" } ] )
O gerente realiza query de pesquisa de texto para itens dentro de um departamento específico.
Um índice de texto composto nos campos department e description limita as chaves de índice digitalizadas somente a documentos dentro do department especificado. O índice de texto composto fornece melhor desempenho em comparação com um índice de texto de campo único no campo description .
Procedimento
Crie um índice composto na coleção inventory que contém os seguintes campos:
Uma chave de índice ascendente ou descendente no campo
departmentUma chave de índice
textno campodescription
db.inventory.createIndex( { department: 1, description: "text" } )
Resultados
Depois de criar o índice composto, as queries de pesquisa de texto verificam apenas documentos que correspondam a uma condição de igualdade especificada no campo department.
Por exemplo, a seguinte query verifica documentos com department igual a kitchen onde o campo description contém a string green:
db.inventory.find( { department: "kitchen", $text: { $search: "green" } } )
Saída:
[ { _id: 3, department: 'kitchen', description: 'green placemat' } ]
Ver número de documentos examinados
Para ver quantos documentos foram digitalizados para retornar a consulta, visualize o executionStats da consulta:
db.inventory.find( { department: "kitchen", $text: { $search: "green" } } ).explain("executionStats")
O número de chaves de índice examinadas é indicado no campo totalKeysExamined . Queries que examinam mais chaves de índice geralmente levam mais tempo para serem concluídas.
Com o índice composto em department e description, a query examina somente uma chave de índice. Há apenas um documento na coleção em que department está kitchen e o description contém a string green.
No entanto, se a query usasse um índice de texto de campo único somente no campo description, a query examinaria três chaves de índice. Há três documentos na coleção em que o campo description contém a string green.
Em uma coleção pequena como a usada no exemplo anterior, não há uma diferença perceptível no desempenho entre índices de texto composto e índices de campo único. No entanto, em coleções maiores, ter mais digitalizações de entrada de índice pode prejudicar visivelmente o desempenho. Para obter o melhor desempenho, crie índices de texto que limitem o número de entradas de índice digitalizadas para melhor se adequarem às suas correspondências de igualdade.