Limitar o número de entradas de índices de texto verificadas em implantações autogerenciadas
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
department
Uma chave de índice
text
no 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.