I miei filtri sono raggruppati in categorie. Vorrei recuperare i documenti in cui un documento può corrispondere a qualsiasi filtro in una categoria, ma se sono impostate due (o più) categorie, il documento deve corrispondere a qualsiasi filtro in TUTTE le categorie.Come eseguire i filtri AND e OR annidati in ElasticSearch?
Se scritto in pseudo-SQL sarebbe:
SELECT * FROM Documents WHERE (CategoryA = 'A') AND (CategoryB = 'B' OR CategoryB = 'C')
Ho provato filtri nidificati in questo modo:
{
"sort": [{
"orderDate": "desc"
}],
"size": 25,
"query": {
"match_all": {}
},
"filter": {
"and": [{
"nested": {
"path":"hits._source",
"filter": {
"or": [{
"term": {
"progress": "incomplete"
}
}, {
"term": {
"progress": "completed"
}
}]
}
}
}, {
"nested": {
"path":"hits._source",
"filter": {
"or": [{
"term": {
"paid": "yes"
}
}, {
"term": {
"paid": "no"
}
}]
}
}
}]
}
}
Ma evidentemente io non capisco la sintassi ES. È sulla strada giusta o devo usare un altro filtro?
la risposta alla domanda: '' or'' con '' term'' può essere fatto più facilmente con [termini] (http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-terms- filter.html). e l'impostazione predefinita per [bool] (http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-bool-filter.html) è '' and''. qualcosa lungo '' filter.bool.must: [{terms: progress: ["incomplete", "complete"]}. {terms: paid: ["yes", "no"]}] '' potrebbe funzionare? – cfrick
query/filtri nidificati vengono utilizzati per matrici/elenchi (dipende dalla lingua con cui si ha familiarità, ad esempio 'a = [{'b': 1}, {'c': 2}])'. Potresti scrivere un esempio di uno dei tuoi documenti? Ciò aiuterebbe – Diolor
cfrick mi ha guidato sulla strada giusta. Ho annidato un sacco di filtri 'termini' all'interno di un filtro 'e', e sembra soddisfare le mie esigenze. – MHTri