# Nested field and query/filter sur plusieurs champs en même temps

**URL:** <https://discuss.elastic.co/t/nested-field-and-query-filter-sur-plusieurs-champs-en-meme-temps/133554>\
**Category:** Elasticsearch\
**Created:** [May 28, 2018, 1:51pm UTC](https://discuss.elastic.co/t/nested-field-and-query-filter-sur-plusieurs-champs-en-meme-temps/133554 "2018-05-28T13:51:30Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![Ugo\_Bourdon](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/ugo_bourdon/32/10725_2.png) [@Ugo\_Bourdon](https://discuss.elastic.co/u/Ugo_Bourdon)\
**Post date:** [May 28, 2018, 1:51pm UTC](https://discuss.elastic.co/t/nested-field-and-query-filter-sur-plusieurs-champs-en-meme-temps/133554/1 "2018-05-28T13:51:30Z")

</div>

Bonjour,

Je dispose de données associant des identifiants quelconques à des zones géographiques et je veux pouvoir les requêter ensemble.

Voici le mapping que j'ai déduis de mon besoin :

```
 "zones": {
    "type": "nested",
    "properties": {
        "zone": {
            "type": "geo_shape",
            "tree": "quadtree",
            "precision": "1m"
        },
        "uids": {
            "type": "string",
            "index": "not_analyzed"
        }
    }
}

```

Je veux pouvoir requêter les critères zones.zone et zones.uids en même temps.  
C'est à dire si j'ai un document qui contient une zones { zone: A\_ZONE, uids: [1234,2345]} et une autre zones {zone: B\_ZONE, uids: [6666]}  
si je requête 1234 et B\_ZONE je ne veux pas que ce document ressorte.

Il faudrait bien qu'il y ait un document avec la zones {zone: B\_ZONE, uids: [1234,2345]} pour que ça match.

Mais je ne trouve pas comment faire cela ?  
Quel type de requête dois-je faire ? Dois-je changer mon mapping ?

---

<div class="post-metadata">

**Author:** ![dadoonet](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/dadoonet/32/137187_2.png) [@dadoonet](https://discuss.elastic.co/u/dadoonet)\
**Post date:** [May 28, 2018, 5:08pm UTC](https://discuss.elastic.co/t/nested-field-and-query-filter-sur-plusieurs-champs-en-meme-temps/133554/2 "2018-05-28T17:08:04Z")

</div>

Qu'est ce que tu as essayé jusqu'à présent ?  
Peux-tu fournir un script, le plus simple possible, qui permette de jouer avec un cas de test ?

---

<div class="post-metadata">

**Author:** ![Ugo\_Bourdon](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/ugo_bourdon/32/10725_2.png) [@Ugo\_Bourdon](https://discuss.elastic.co/u/Ugo_Bourdon)\
**Post date:** [May 29, 2018, 12:50pm UTC](https://discuss.elastic.co/t/nested-field-and-query-filter-sur-plusieurs-champs-en-meme-temps/133554/3 "2018-05-29T12:50:22Z")

</div>

Alors voici précisément ce que j'essai de faire :

> Le mapping :

```
{
      "my_type" : {
        "properties" : {
          "interventionZones" : {
            "type" : "nested",
            "properties" : {
              "openingTicketPurposes" : {
                "type" : "string",
                "index" : "not_analyzed"
              },
              "zone" : {
                "type" : "geo_shape",
                "tree" : "quadtree",
                "tree_levels" : 20
              }
            }
          }
        }
      }
    }

```

> Le document à la forme suivante :

```
{
  "uid" : "0b314e92-208d-4d82-8845-b7ec47f6a65e",
  "interventionZones" : [ {
    "openingTicketPurposes" : ["7bd5b87e-b5de-4336-a861-be1af85cbc69"],
    "zone" : {
      "type":"geometrycollection",
      "geometries" : [ {
        "type" : "circle",
        "coordinates" : [1, 0],
        "radius" : "100.0m"
      } ]
    }
  } ]
}

```

> La requête :

```
{
  "from" : 0,
  "size" : 100,
  "query" : {
    "filtered" : {
      "query" : {
        "match_all" : { }
      },
      "filter" : {
        "bool" : {
          "must" : [ {
            "nested" : {
              "filter" : {
                "terms" : {
                  "interventionZones.openingTicketPurposes" : ["0519cb57-8f8c-4d30-b490-7af880b21fbd"]
                }
              },
              "path" : "interventionZones"
            }
          }, {
            "nested" : {
              "filter" : {
                "geo_shape" : {
                  "interventionZones.zone" : {
                    "shape" : {
                      "type" : "point",
                      "coordinates" : [1.0, 0.0]
                    },
                    "relation" : "intersects"
                  },
                  "_name" : null
                }
              },
              "path" : "interventionZones"
            }
          } ]
        }
      }
    }
  }
}

```

---

<div class="post-metadata">

**Author:** ![dadoonet](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/dadoonet/32/137187_2.png) [@dadoonet](https://discuss.elastic.co/u/dadoonet)\
**Post date:** [May 29, 2018, 9:26pm UTC](https://discuss.elastic.co/t/nested-field-and-query-filter-sur-plusieurs-champs-en-meme-temps/133554/5 "2018-05-29T21:26:02Z")

</div>

Tu sembles utiliser une vieille version, non ?

Peux-tu faire le même style de script sur la version 6.2 STP?  
Le script idéal est le script qu'on peut copier-coller dans Kibana et simplement exécuter. Peux-tu faire ça ?

---

<div class="post-metadata">

**Author:** ![Ugo\_Bourdon](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/ugo_bourdon/32/10725_2.png) [@Ugo\_Bourdon](https://discuss.elastic.co/u/Ugo_Bourdon)\
**Post date:** [May 30, 2018, 7:40am UTC](https://discuss.elastic.co/t/nested-field-and-query-filter-sur-plusieurs-champs-en-meme-temps/133554/6 "2018-05-30T07:40:56Z")

</div>

En effet j'utilise encore la version 1.7 😕

Je sais pas comment faire un script qui s'exécute sur Kibana.

Par contre j'ai trouvé une requête qui semble marcher avec cette forme :

```
{
  "from" : 0,
  "size" : 100,
  "query" : {
    "filtered" : {
      "query" : {
        "match_all" : { }
      },
      "filter" : {
        "bool" : {
          "must" : {
            "nested" : {
              "filter" : {
                "and" : {
                  "filters" : [ {
                    "terms" : {
                      "uid" : ["93af5213-0aaa-41b1-a465-fb21de716e3c"]
                    }
                  }, {
                    "terms" : {
                      "name" : ["toto"]
                    }
                  } ]
                }
              },
              "path" : "agencies"
            }
          }
        }
      }
    }
  },
  "sort" : [ {
    "expectedDate" : {
      "order" : "asc"
    }
  } ]
}

```

En gros si je comprends le principe, si je veux requêter plusieurs champs d'un objet nested et garder cette cohérence, il faut que je n'utilise qu'une seule occurence de nested.  
J'avais aussi trouvé ça [http://obtao.com/blog/2014/04/elasticsearch-recherche-avancee-nested/](http://obtao.com/blog/2014/04/elasticsearch-recherche-avancee-nested/) mais j'arrive pas à refaire cette forme de requête avec le DSL scala (a.k.a Elastic4s) que j'utilise pour faire du Elasticsearch .

---

<div class="post-metadata">

**Author:** ![dadoonet](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/dadoonet/32/137187_2.png) [@dadoonet](https://discuss.elastic.co/u/dadoonet)\
**Post date:** [May 30, 2018, 10:04am UTC](https://discuss.elastic.co/t/nested-field-and-query-filter-sur-plusieurs-champs-en-meme-temps/133554/7 "2018-05-30T10:04:32Z")

</div>

Aucune chance que je réinstalle une version 1.7 ou 2.4 sur mon laptop!

Un script Kibana, c'est quelque chose comme:

```auto
DELETE index
PUT index/_doc/1
{
  "foo": "bar"
}
GET index/_search
{
  "query": {
    "match": {
      "foo": "bar"
    }
  }
}

```

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)\
**Post date:** [June 27, 2018, 10:04am UTC](https://discuss.elastic.co/t/nested-field-and-query-filter-sur-plusieurs-champs-en-meme-temps/133554/8 "2018-06-27T10:04:36Z")

</div>

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