Omitnorms – Desvendando os segredos desta propriedade

Se olharmos na documentação oficial do Solr, encontraremos a seguinte explicação:

  • This is arguably an advanced option.
  • Set to true to omit the norms associated with this field (this disables length normalization and index-time boosting for the field, and saves some memory). Only full-text fields or fields that need an index-time boost need norms.

Começamos mal… A primeira vez que eu li isso eu nem entendi direito, então fui atrás tentar descobrir o que era.

Mas, logo de cara, entendi que isso desabilitava boost em tempo de indexação e liberava um pouco de memória. Ou seja, por padrão defino os campos com omitnorms = true, pois a maioria dos campos não são fulltext e nem precisam deste tipo de boost.

Então começo a definir quais devem ter normas. Pela rápida explicação do tutorial, os campos que precisam de boost em index-time não tem negócio, então estes vão ter mesmo omitnorms=false, pois as normas são que guardam os dados deste tipo de boost.

Dentre aqueles que são fulltext, vamos entender quais vão precisar das normas. Para isso tive que entender o que são as normas. Normas são:

  • Um fator de score específico para cada campo de um documento
  • É calculado em tempo de indexação
  • Baseado no boost do documento, do campo e no lenghtNorm

Do que esta na explicação acima, temos como novidade apenas a questão do LengthNorm, que é um valor calculado de acordo com o conteúdo do campo. De forma que campos com menos conteúdo tenham mais relevância no cálculo final do valor da norma. Esta norma é calculada multiplicando-se os valores do boost do documento, com o lenghtNorm e o boost do campo.

Para tentar tornar a explicação um pouco mais simples, a norma é um dos fatores que são levados em consideração na hora de se determinar quais documentos são mais importantes para uma determinada busca – o score daquele documento.

Basta agora apenas saber que este valor de norma perde precisão no processo de indexação e busca, ou seja, as modificações de valores de boost devem ser realizadas com cuidado e muitos testes.

Ou seja, se seu campo fulltext deve ser levado em conta na hora de se determinar o score de um documento com base na quantidade de dados nele, determine que ele armazene a norma (omitnorms=false), caso contrário não. Dica: campos fulltext muito pequenos normalmente não vão necessitar de normas.

Mas afinal, que diferença faz eu colocar omitnorms=false para todos os campos fulltext? Não é mais simples?

E aqui mora o perigo. Por não entendermos corretamente o que esta propriedade faz podemos comprometer a utilização da memória de nosso servidor. Um exemplo nos ajudará a entender melhor o que quero dizer:

As normas são armazenadas no índice utilizando 1 byte por campo por documento. Quando, através de um IndexReader, elas são carregadas, são criados arrays com o tamanho do número total de documentos no índice (new Array[maxdoc]), sendo um array por campo. Isso significa que, mesmo que apenas um documento num índice de 6 milhões de registros tenha o campo com normas, será alocado na memória um Array de aproximadamente 6 Mb na RAM. E isso porque estamos falando de apenas um campo, se este mesmo índice tiver 10 campos assim, estamos falando de 60 Mb. Em alguns cenários, com mais campos ou mais registros, podemos estar falando de uma pequena catástrofe (não se surpreenda se 1 Gb de RAM sumir de seu servidor quando o Solr for iniciado).

Notas:
Index-time boost é diferente de query-time boost. Para boost em tempo de query não são necessárias as normas para o campo, ou seja, podemos definir como omitnorms=true.

Valeu e até a próxima.

Um comentário sobre “Omitnorms – Desvendando os segredos desta propriedade

  1. Pingback: Como funciona a relevância no Solr « Visão Tecnológica

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s