Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

keyword

Boa Tarde,

Existe alguma diferenca entre eu usar um atributo com ou sem o final keyword?

"hits" : [
      {
        "_index" : "catalago",
        "_type" : "_doc",
        "_id" : "0h4lMHABLSWDhR0h4cQM",
        "_score" : 1.3862944,
        "_source" : {
          "fistName" : "Alberto",
          "lastName" : "Souza",
          "createdAt" : "2020-02-10",
          "skills" : [
            "Java",
            "Spring",
            "React"
          ],
          "background_exp" : "Computer Science",
          "state" : "BA",
          "city" : "Bahia",
          "country" : "Brazil"
        }
      }
    ]

Ao realizar uma query com um critério que não existe para esse registro ele me retorna mesmo assim. O que esta errado.

GET catalago/_search
{
  "query": {
    "bool": {
      "must": {
        "match": {
          "skills": "Java, Clojure"
        }
      },
      "filter": {
        "term": {
          "state.keyword": "BA"
        }
      }
    }
  }
}

Mas quando eu adiciono keyword, funciona certinho.

GET catalago/_search
{
  "query": {
    "bool": {
      "must": {
        "match": {
          "skills.keyword": "Java, Clojure"
        }
      },
      "filter": {
        "term": {
          "state.keyword": "BA"
        }
      }
    }
  }
}

Poderiam me ajudar?

1 resposta
solução!

Olá Thiago, tudo bem?

Estou começando na Alura e respondendo algumas perguntas antigas, então me desculpe se você já encontrou sua solução

Em relação a sua dúvida, acredito que o problema foi como você montou sua sua query, o ideal para não ter que utilizar o keyword seria utilizar o array de match:

GET catalogo/_search
{
  "query": {
    "bool": {
      "must": [
        {"match": {"skills": "Java"}},
        {"match": {"skills": "Spring"}}
      ],
      "filter": {
        "term": {
          "state.keyword": "BA"
        }
      }
    }
  }
}

Dessa maneira conseguimos filtrar realmente dois atributos que precisam conter, quando você colocou "Java, Closure" ele encontrou naturalmente o Java mas veja que o max_score foi baixo, e ele encontraria para qualquer coisa que tivesse "Java" até algo como "skills": "Texto aleatorio com a palavra java".

Quando você utilizou o keyword você limitou realmente para a palavra exata Java e ai a busca não trouxe resultados, mas se você buscasse por "skills.keyword": "Java, Spring" também não encontraria nada, compreende?

Então a melhor alternativa seria separar no array, ai quando trocamos no exemplo o Spring por Closure o resultado já é nulo, ainda que tenha encontrado o java o segundo termo não da match :)

Abraços e Bons Estudos!