No puedo filtrar por un campo

Estoy indexando informacion de usuarios en elastic. Puedo filtrar por todos los campos pero, en el caso del codigo postal, elastic nunca retorna nada.

¬ŅPuedes compartir el mapping de ese √≠ndice, algun ejemplo de documento indexado (sin datos confidenciales), y un ejemplo de como haces el filtrado?

¬ŅFiltras usando una query en Elasticsearch o en Kibana?

2 Likes

Aqui está una parte del mapping. puedo filtrar por cualquier propiedad menos por zipCode. Para las queries estoy usando una bibliteca en Java pero copié la consulta que genera y estoy usando un cliente dentro del IDE.

{
  "user": {
    "mappings": {
      "properties": {
        "city": {
          "type": "text",
          "analyzer": "autocomplete",
          "search_analyzer": "autocomplete_search"
        },
        "countryCode": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "emailAddress": {
          "type": "text",
          "fields": {
            "custom": {
              "type": "text",
              "analyzer": "my_email_analyzer"
            }
          },
          "analyzer": "standard",
          "search_analyzer": "my_email_analyzer"
        },
        "familyName": {
          "type": "text",
          "analyzer": "autocomplete",
          "search_analyzer": "autocomplete_search"
        },
        "genderCode": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "givenName": {
          "type": "text",
          "analyzer": "autocomplete",
          "search_analyzer": "autocomplete_search"
        },
        "zipCode": {
          "type": "text",
          "analyzer": "autocomplete",
          "search_analyzer": "autocomplete_search"
        }
      }
    }
  }
}

este es un ejemplo de query:

  "timeout": "60s",
  "query": {
    "bool": {
      "must": [
        {
          "bool": {
            "should": [
              {
                "multi_match": {
                  "query": "female",
                  "fields": [
                    "givenName^1.0",
                    "zipCode^1.0",
                    "city^1.0",
                    "emailAddress^1.0",
                    "genderCode^1.0"
                  ],
                  "type": "phrase_prefix",
                  "operator": "OR",
                  "slop": 0,
                  "prefix_length": 0,
                  "max_expansions": 50,
                  "minimum_should_match": "2",
                  "zero_terms_query": "NONE",
                  "auto_generate_synonyms_phrase_query": true,
                  "fuzzy_transpositions": true,
                  "boost": 1.0
                }
              }
            ],
            "adjust_pure_negative": true,
            "boost": 1.0
          }
        }
      ],
      "adjust_pure_negative": true,
      "boost": 1.0
    }
  },
  "from": 0,
  "size": 500
}

Gracias por el detalle.

Podr√≠as tambi√©n a√Īadir el detalle del analyzer, autocomplete_search? Veo que el campo zipCode lo usa.

Si adem√°s puedes dar ejemplos de zipCode, genial. ¬ŅSon solo num√©ricos o alfanum√©ricos?

En la query ejemplo buscas "female", lo que falla es que si buscas por "28028" no te devuelve documentos que tienen ese zipCode? O quieres hacer un match por 28 y que te devuelva todos los documentos donde el código postal empieza por 28?

En general, sería recomendable usar un analizador a medida para analizar un campo de tipo código postal. Aunque no lo puedo asegurar en tu caso. Hay una discusión interesante aquí: https://stackoverflow.com/questions/51709666/custom-analyzer-use-case-zip-code-elasticsearch

Dependiendo de c√≥mo sean los c√≥digos postales, y el tipo de b√ļsqueda que quieras que hagan los usuarios (match del inicio del c√≥digo postal, match exacto del c√≥digo, match de cualquier trozo del c√≥digo...), tendr√°s distintas alternativas tanto en el analizador como para construir la query.

Con un multi_match en la query tienes diversos tipos, y puede que no te valga el mismo para todos los campos que est√°s incluyendo: