4
respostas

Consulta no ElasticSearch para mais de um campo

Boa tarde,

Fiz uma consulta no ElasticSearch utilizando múltiplos campos no URL, mas o resultado é o mesmo para qualquer valor que eu digito para o atributo estado.

Fiz a seguinte consulta:

localhost:9200/catalogo/_search?q=interesses:futebol&estado:RJ

E o resultado foi:

{
  "took": 2,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 3,
    "max_score": 0.2972674,
    "hits": [
      {
        "_index": "catalogo",
        "_type": "pessoas",
        "_id": "AVcqmjrlo8hchvFxnk-i",
        "_score": 0.2972674,
        "_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": "1",
        "_score": 0.2972674,
        "_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": "AVcqgme_o8hchvFxnk-c",
        "_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"
        }
      }
    ]
  }
}

Alguém mais teve este comportamento?

Abraços!

4 respostas

Oi Eduardo,

Muito legal que esta explorando a busca em múltiplos campos. O Elasticsearch, por padrão, utiliza o conector OR para buscas que são feitas pela URI utilizando verbo GET. Logo, sua busca pode ser lida como:

interesses=futebol OR estado=RJ

Lembre-se que na busca em texto cheio, procuramos resultados considerando o 'quanto' eles casam com nossa query ao invés de 'se' eles casam com nossa query. Nesse caso, o fato do score dos documentos ligados a futebol serem mais altos, você acabou recebendo resultados relacionados a futebol.

Para fazer a busca que você realmente quer, basta dizer que, para a busca em questão, o operador a ser usado deve ser AND .E.g.:

?default_operator=AND&q=....

Para mais informações, acesse o link: https://www.elastic.co/guide/en/elasticsearch/reference/current/search-uri-request.html

Fiz alguns testes e quando acesso localhost:9200/catalogo/_search?q=interesses:futebol&estado:RJ

Na verdade ele não esta utilizando o "&" como "OR" e sim ignorando qualquer condição que eu passe após o "&". O uso do "default_operator=AND" também não solucionou este problema.

Como eu havia dito, o padrão é OR e a busca original esta usando o padrão OR. O que acontece é que você esta assumindo que pode usar & para concatenar a sua query. Parte do problema esta ai. Vale chamar atenção aos seguintes pontos:

1- O conteúdo da busca; a query em si, deve ser passado para via parâmetro 'q'. Se uma busca possui múltiplos atributos, eles devem passados para o atributo 'q'. Exemplo: ?q=atributo1:valor1 atributo2:valor2

2- Em chamadas ao verbo GET, & serve para indicar outros parâmetros. Exemplo: ?parametro1=valor1&parametro2=valor2.

Eu testei os seguintes exemplos no kopt e eles retornaram o resultado esperado:

/catalogo/pessoas/_search?default_operator=AND&q=interesses:literatura estado:MG
/catalogo/pessoas/_search?q=interesses:literatura AND estado:MG

Vale chamar a atenção para a necessidade de escaping nos exemplos acima caso vá utilizar curl, wget ou algum REST client. Por exemplo:

http://localhost:9200/catalogo/pessoas/_search?q=interesses:literatura%20AND%20estado:MG

Abraços e bons estudos.

Eu entendi o que o Rafael quis dizer. No material, está indicando que a busca por mais de um campo é feita usando &. Creio que vale uma revisão no material ou algum apontamento para esta pergunta e resposta.