Realce de Resultados de Busca no Elasticsearch

Preparando os Dados

Antes de explorar o recurso de realce, vamos criar um documento de exemplo no índice pessoas:

PUT pessoas/registro/10
{
  "nome": "Pedro",
  "idade": 34,
  "origem": "brasil",
  "biografia": "programador dedicado e curioso",
  "etiquetas": ["eficiente", "detalhista", "proativo"]
}

Realce Padrão

Por padrão, o Elasticsearch utiliza a tag <em> para destacar os termos encontrados. Para ativar o realce, basta incluir o bloco highlight na consulta e esepcificar quais campos devem ser destacados em fields:

GET pessoas/registro/_search
{
  "query": {
    "match": {
      "nome": "Pedro"
    }
  },
  "highlight": {
    "fields": {
      "nome": {}
    }
  }
}

O resultado trará, além dos dados originais em _source, um bloco highlight contendo o campo realçado:

{
  "took": 2,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 1.3862944,
    "hits": [
      {
        "_index": "pessoas",
        "_type": "registro",
        "_id": "10",
        "_score": 1.3862944,
        "_source": {
          "nome": "Pedro",
          "idade": 34,
          "origem": "brasil",
          "biografia": "programador dedicado e curioso",
          "etiquetas": ["eficiente", "detalhista", "proativo"]
        },
        "highlight": {
          "nome": [
            "<em>Pedro</em>"
          ]
        }
      }
    ]
  }
}

Personalização das Tags de Realce

Caso seja necessário utilizar tags HTML diferentes do padrão, o Elasticsearch permite definir tags personalizadas por meio dos parâmetros pre_tags e post_tags. Esses parâmetros aceitam qualquer marcação HTML, inclusive com atributso e estilos inline:

GET pessoas/registro/_search
{
  "query": {
    "match": {
      "origem": "brasil"
    }
  },
  "highlight": {
    "pre_tags": "<span class='destaque' style='background-color:yellow'>",
    "post_tags": "</span>",
    "fields": {
      "origem": {}
    }
  }
}

Na resposta, o termo encontrado será envolvido pelas tags customizadas:

{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 0.2876821,
    "hits": [
      {
        "_index": "pessoas",
        "_type": "registro",
        "_id": "10",
        "_score": 0.2876821,
        "_source": {
          "nome": "Pedro",
          "idade": 34,
          "origem": "brasil",
          "biografia": "programador dedicado e curioso",
          "etiquetas": ["eficiente", "detalhista", "proativo"]
        },
        "highlight": {
          "origem": [
            "<span class='destaque' style='background-color:yellow'>brasil</span>"
          ]
        }
      }
    ]
  }
}

Atenção: ao definir atributos ou estilos dentro das tags personalizadas, utilize sempre aspas simples. Isso evita conflitos com as aspas duplas utilizadas na sintaxe JSON do Elasticsearch.

Tags: elasticsearch Highlight search JSON Query DSL

Publicado em 7-8 16:38