Solucionado (ver solução)
Solucionado
(ver solução)
8
respostas

Diferença da pesquisa com o 'de'

Olá, olha eu de novo... acho que minha pesquisa não está funcionando como esperado... tanto faz eu pesquisar por 'rio janeiro' ou 'janeiro rio' que o resultado dá o mesmo (33), até aqui tudo bem. O problema é quando pesquiso por 'rio de janeiro', por exemplo, ai o resultado já cai pra 7. Eu fiz o teste com o _analyze que escolhi e o 'de' não gera nenhum token. Alguém sabe me dizer o que pode ser? Abaixo as configurações que utilizei:

Mapping (reduzido, mas as 'variáveis' que não utilizo coloco como index : no):

{
  "settings": {
    "index": {
      "number_of_shards": 3,
      "number_of_replicas": 0
    },
    "analysis": {
      "filter": {
        "brazilian_stop": {
          "type": "stop",
          "stopwords": "_brazilian_"
        },
        "brazilian_stemmer": {
          "type": "stemmer",
          "language": "brazilian"
        },
        "filtro_de_sinonimos": {
          "type": "synonym",
          "synonyms": [
            "r,rua",
            "av,aven"
          ]
        }
      },
      "analyzer": {
        "sinonimos": {
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "brazilian_stop",
            "brazilian_stemmer",
            "filtro_de_sinonimos"
          ]
        }
      }
    }
  },
  "mappings": {
    "busca": {
      "_all": {
        "type": "string",
          "index": "analyzed",
          "analyzer": "brazilian",
          "search_analyzer": "sinonimos"
      },
      "properties": {
        "address_1": {
          "type": "string",
          "index": "analyzed",
          "analyzer": "brazilian",
          "search_analyzer": "sinonimos"
        },
        "address_2": {
          "type": "string",
          "index": "analyzed",
          "analyzer": "brazilian",
          "search_analyzer": "sinonimos"
        },
        "address_id": {
          "type": "long",
          "index": "no"
        },
        "capa": {
          "type": "string",
          "index": "no"
        },
        "city": {
          "type": "string",
          "index": "analyzed",
          "analyzer": "brazilian",
          "search_analyzer": "sinonimos"
        },
        "code": {
          "type": "string",
          "index": "no"
        },
        "mypage": {
          "type": "string",
          "index": "analyzed",
          "analyzer": "brazilian",
          "search_analyzer": "sinonimos"
        },
        "nome": {
          "type": "string",
          "index": "analyzed",
          "analyzer": "brazilian",
          "search_analyzer": "sinonimos"
        },
        "nome_fantasia": {
          "type": "string",
          "index": "analyzed",
          "analyzer": "brazilian",
          "search_analyzer": "sinonimos"
        },
        "number": {
          "type": "long",
          "index": "no"
        },
        "razao_social": {
          "type": "string",
          "index": "analyzed",
          "analyzer": "brazilian",
          "search_analyzer": "sinonimos"
        },
      }
    }
  }
}

Query:

{
  "from": 0,
  "size": 20,
  "sort": [
    {
      "_geo_distance": {
        "location": {
          "lat": -23.5646027,
          "lon": -46.6557225
        },
        "order": "asc",
        "unit": "m",
        "distance_type": "arc"
      }
    }
  ],
  "query": {
    "query_string": {
      "fields": [
        "categoria",
        "city",
        "address_1",
        "address_2",
        "razao_social",
        "nome_fantasia"
      ],
      "query": "rio de janeiro",
      "default_operator": "AND"
    }
  },
  "post_filter": {
    "term": {
      "filter": 1
    }
  }
}

O que estou fazendo de errado? O que tem de errado nessas configurações? Como ficaria uma configuração ideal? Obrigado!

8 respostas
solução!

Opa Rafael,

Não sou especialista em Elasticsearch, mas vou tentar ajudar.

Quando você fala que o resultado é 33, você diz em número de resultados? De fato, o analyzer brazilian não gera token para de (nem o analyzer sinonimos). Uma coisa que notei é que você busca o field categoria e ele não está no seu mapping. Não seria ele o culpado da diferença de resultado?

Uma opção seria você definir o analyzer na própria query, algo como:

"query_string": {
      "fields": [
        "categoria",
        "city",
        "address_1",
        "address_2",
        "razao_social",
        "nome_fantasia"
      ],
      "query": "rio de janeiro",
      "analyzer": "brazilian",
      "default_operator": "AND"
}

Uma dica é que talvez o analyzer brazilian já contemple os sinônimos de avenida e rua, eliminando a necessidade do seu sinonimos. Outra coisa é que no seu caso, acredito que o search_analyzerpoderia ser igual ao analyzer (que é o padrão, eliminando a necessidade de explicitamente definir o search_analyzer).

Fala Gabriel, Obrigado pela resposta e vamos lá: Sim, 33 é o número de resultados da 'busca' (Hits total:33). O field categoria está no meu mapping (só reduzi o código para não ficar grande, se você quiser eu compartilho ele inteiro) por isso acredito que ele não seja o culpado, acredito que é alguma bobeira que estou cometendo. O analyzer brazilian não contempla o sinônimo de rua e avenida por isso tive que colocá-lo. Coloquei outros também, mas por dicas retirei, pois mais pra frente pode atrapalhar a busca.

O analyzer de categoria é o mesmo? E fez alguma diferença colocar um analyzer na query?

Olá Gabriel, Eu errei aqui mesmo, na hora de subir o arquivo subi a versão errada que não era mapeado o field 'categoria'. Agora fez diferença colocar um analyzer na query. Sabe o que isso implica? Posso tirar do mapping, faz diferença no funcionamento etc ? Mais uma vez, obrigado pela resposta.

Você poderia tirar o search_analyzer do seu mapping. Por padrão, search_analyzer é igual ao analyzer (que na maioria dos casos faz sentido).

Pelo que eu entendi, colocar um analyzer na query é equivalente a colocar vários search_analyzer de mesmo valor nos fields que você está buscando.

Entendi Gabriel, mas se eu retirar o search_analyzer eu perderei os sinônimos, certo?

Não. Basta você utilizar o analyzer como sinonimos, isto é

"city": {
          "type": "string",
          "index": "analyzed",
          "analyzer": "sinonimos"
},

Olá Gabriel, muito obrigado pela ajuda! Grande Abraço.

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