La combinazione elastica deve e non deve
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
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"
}
]
}
}
]
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