es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Elasticsearch: Cómo buscar con solo entradas completas

Estoy buscando una solución para el problema.

Problema:
Tengo dos registros A:Trace(id, traceId, Tags) B:Trace(id,traceId, Tags)
Ambos registros tienen el mismo traceId y diferentes etiquetas.

Para eso, utilicé la cláusula “should” que devuelve datos incluso si solo el registro A tiene una etiqueta en él. Pero lo que quiero es que si la consulta tiene etiquetas que no están en los registros, la respuesta debería estar vacía.

Esta es la consulta que utilicé en los datos de Zipkin Elasticsearch:

GET zipkin-span-2021-12-08/_search?size=10
{
  "query": {
    "bool": {
      "must": [
        {
          "bool": {
            "should": [
              {
                "term": {
                  "_q": "smpp.charged=false"
                }
              },
              {
                "term": {
                  "_q": "connection.type=WEEK"
                }
              },
              {
                "term": {
                  "_q": "connection.type=a"
                }
              }
            ]
          }
        }
      ]
    }
  },
  "aggs": {
    "same_treace_id": {
      "terms": {
        "field": "traceId",
        "size": 10,
        "min_doc_count": 2
      }
    }
  },
  "fields": [
    "traceId"
  ],
  "_source": true
}
Tags:  ,

Answer

  1. Avatar for davy.ai

    Solución:

    Para devolver una respuesta solo si todas las etiquetas de la consulta están presentes en los registros, debemos utilizar la cláusula “must” en lugar de “should”. Además, podemos agregar una cláusula “must_not” para asegurarnos de que los registros que contienen etiquetas no incluidas en la consulta no sean incluidos en la respuesta. Aquí está la consulta actualizada:

    GET zipkin-span-2021-12-08/_search?size=10
    {
      "query": {
        "bool": {
          "must": [
            {
              "term": {
                "_q": "smpp.charged=false"
              }
            },
            {
              "term": {
                "_q": "connection.type=WEEK"
              }
            },
            {
              "bool": {
                "should": [
                  {
                    "term": {
                      "_q": "connection.type=a"
                    }
                  }
                ],
                "must_not": [
                  {
                    "exists": {
                      "field": "_q"
                    }
                  }
                ]
              }
            }
          ]
        }
      },
      "aggs": {
        "same_treace_id": {
          "terms": {
            "field": "traceId",
            "size": 10,
            "min_doc_count": 2
          }
        }
      },
      "fields": [
        "traceId"
      ],
      "_source": true
    }
    

    En esta consulta, primero agregamos la cláusula “must” para cada etiqueta requerida. Luego, agregamos una cláusula “bool” con la cláusula “should” para la etiqueta opcional “connection.type=a”. También incluimos una cláusula “must_not” que verifica si el campo “_q” existe en los documentos, para excluir aquellos que no tienen etiquetas en absoluto.

    Con estos cambios, la consulta solo devolverá una respuesta si todas las etiquetas de la consulta están presentes en los registros, y la etiqueta opcional solo se incluirá si existe y cumple con las otras condiciones.

Comments are closed.