La combinazione elastica deve e non deve

Sep 04 2020

Vorrei creare una query in elastico in cui ottengo tutti i documenti che corrispondono a un valore e non hanno un campo specifico: quello che sto cercando di fare è il seguente:

{
    "query": {
        "bool": {
            "must": [
                {
                    "match": {
                        "some-field.b": true
                    }
                },
                {
                    "bool": {
                        "must_not": {
                            "exists": {
                                "field": "some-other-field.a"
                            }
                        }
                    }
                }
            ]
        }
    }
}

Anche se cambio un documento in elastico e assegno un valore al campo -altro-a, la query continua a restituirmi lo stesso numero di hit totali. Qualche idea sul perché sta succedendo?

L'unico modo che ho trovato per cambiare questo è aggiungendo il punteggio minimo alla query, ma non sono sicuro di aver capito veramente il concetto di punteggio. Vorrei ricevere i documenti solo se entrambe le condizioni sono soddisfatte.

Ho notato un'altra cosa. Se ripeto la query pur avendo un punteggio minimo, il numero di hit restituiti varia.

Risposte

1 ESCoder Sep 04 2020 at 21:41

Dal momento che non hai menzionato nulla sulla tua mappa e sui dati di indice.

Aggiunta di un esempio funzionante con mappatura dell'indice, dati dell'indice e query di ricerca (considerando che i dati sono di tipo nidificato come some-other-field.asembra un campo nidificato)

Mappatura indice:

{
  "mappings": {
    "properties": {
      "user": {
        "type": "nested" 
      },
      "qualification": {
        "type": "nested" 
      }
    }
  }
}

Dati indice:

{
  "user" : [ 
    {
      "first" : "Bhavya",
      "last" :  "Gupta"
    }
  ]
}

{
  "user" : [ 
    {
      "first" : "Bhavya",
      "last" :  "Gupta"
    }
  ],
  "qualification": [
    {
      "degree": "MTech"
    }
  ]
}

{
  "user" : [ 
    {
      "first" : "John",
      "last" :  "Smith"
    }
  ],
  "qualification": [
    {
      "degree": "BTech"
    }
  ]
}

Query di ricerca:

{
  "query": {
    "bool": {
      "must": [
        {
          "nested": {
            "path": "user",
            "query": {
              "bool": {
                "must": [
                  {
                    "match": {
                      "user.first": "Bhavya"
                    }
                  }
                ]
              }
            }
          }
        }
      ],
      "must_not": {
        "nested": {
          "path": "qualification",
          "query": {
            "exists": {
              "field": "qualification.degree"
            }
          }
        }
      }
    }
  }
}

Risultato della ricerca:

"hits": [
      {
        "_index": "stof",
        "_type": "_doc",
        "_id": "3",
        "_score": 0.35667494,
        "_source": {
          "user": [
            {
              "first": "Bhavya",
              "last": "Gupta"
            }
          ]
        }
      }
    ]
1 Doseikis Sep 10 2020 at 15:24

L'ultima domanda di cui avevo bisogno era la seguente:

"query": {
    "bool": {
        "must": [
            {
                "match": {
                    "some-field.b": true
                }
            }
        ],
        "must_not": {
            "nested": {
                "path": "some-other-field",
                "query": {
                    "exists": {
                        "field": "some-other-field.a"
                    }
                }
            }
        }
    }
}

Sembra che il mio errore sia stato la parte must_not della query poiché il campo altro era un campo nidificato