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:

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.