1
resposta

Busca por vários campos não respeita todos os paramêtros

Olá, vi que a mesma pergunta já foi feita antes mas não teve continuidade, porém como estou passando pelo mesmo problema então segue a dúvida.

Quando utilizamos a busca por mais de um atributo não estão sendo considerados todos os atributos. Considerando que os dados que existem no meu elasticsearch são apenas os vistos em exercícios do curso, exemplos de querys que aparentemente não funcionam da maneira adequada:

GET /catalogo/pessoas/_search?q=interesses:música&estado:SP

GET /catalogo/pessoas/_search?q=interesses:futebol&cidade:rio

As duas querys acima retornam dados inconsistentes, onde a primeira retorna dois documentos, sendo que existe apenas um que possui o interesse música e é do estado de SP.

A segunda query retorna um registro sendo que não existe nenhum registro cujo o interesse seja futebol e a cidade rio. Está retornando apenas pelo o interesse futebol e ignorando o atributo cidade.

Pensei ter haver com a relevância (score) explicado na aula, porém no primeiro caso onde só tenho um documento que atende os dois parâmetros da query e o segundo documento atende apenas o parâmetro interesses, fui verificar se um possuía o score maior que o outro, porém não era o caso, os dois possuíam o score 0.15342641.

Logo não sei se é um comportamento esperado e mais adiante veremos sobre isso ou outra coisa. Testei via curl e deu o mesmo resultado. Alguma luz?

Resultado da primeira busca:

GET /catalogo/pessoas/_search?q=interesses:música&estado:SP

{
  "took": 12,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 2,
    "max_score": 0.15342641,
    "hits": [
      {
        "_index": "catalogo",
        "_type": "pessoas",
        "_id": "1",
        "_score": 0.15342641,
        "_source": {
          "nome": "João Silva",
          "interesses": [
            "futebol",
            "música",
            "literatura"
          ],
          "cidade": "São Paulo",
          "formação": "Letras",
          "estado": "SP",
          "país": "Brasil"
        }
      },
      {
        "_index": "catalogo",
        "_type": "pessoas",
        "_id": "3",
        "_score": 0.15342641,
        "_source": {
          "nome": "Richard Edward",
          "interesses": [
            "matemática",
            "física",
            "música"
          ],
          "cidade": "Boston",
          "formação": "Física",
          "estado": "MA",
          "país": "Estados Unidos"
        }
      }
    ]
  }
}
1 resposta

Olá Flavio, tudo bem?

Por padrão o Elasticsearch utiliza o operador OR para buscas feitas na URI utilizando o método GET , então quando utiliza apenas o & esta apenas indicando outros parâmetros. Foi o que aconteceu nas suas queries, como não foi informado o operador ele assumiu como OR.

GET /catalogo/pessoas/_search?q=interesses:música&estado:SP

GET /catalogo/pessoas/_search?q=interesses:futebol&cidade:rio

Para que as suas queries retornem o que você espera, deve utilizar o operador AND:

GET /catalogo/pessoas/_search?q=interesses:música AND estado:SP

GET /catalogo/pessoas/_search?q=interesses:futebol AND cidade:rio

Espero ter ajudado!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software