Nested query never returns a result [solved]


#1

Hello guys,

I am having trouble querying nested documents from ElasticSearch. Below you can find my schema and some example queries incl. data.

#!/bin/bash
curl -XPUT 'http://localhost:9200/search/'
curl -XPUT "http://localhost:9200/search/models/_mapping" -d '{
 "models": {
   "_timestamp": {"enabled": true, "store": true},
   "properties": {
     "categories": {"type": "string"},
     "categoryTree": {"type": "string"},
     "products": {
       "type": "nested",
       "properties": {
         "id": {"type": "string"},
         "title": {"type": "string"},
         "description": {"type": "string"},
         "color": {"type": "string"},
         "variants": {
           "type": "nested",
           "properties": {
              "id": {"type": "string"},
              "size": {"type": "string"},
              "sellers": {
                "type": "nested",
                "properties": {
                  "id": {"type": "string"},
                  "deepLinkUrl": {"type": "string"},
                  "stock": {"type": "long"},
                  "price": {
                    "type": "nested",
                    "properties": {
                      "isoCode": {"type": "string"},
                      "original": {"type": "double"},
                      "current": {"type": "double"},
                      "discountPercentage": {"type": "long"}
                    }
                  },
                  "shippingMethods": {
                    "type": "nested",
                     "properties": {
                       "id": {"type": "string"},
                       "carrier": {"type": "string"},
                       "deliveryMethod": {"type": "string"},
                       "deliveryCostsSingleItem": {
                         "type": "nested",
                         "properties": {
                           "isoCode": {"type": "string"},
                           "original": {"type": "double"},
                           "current": {"type": "double"},
                           "discountPercentage": {"type": "long"}
                         }
                       },
                       "deliveryCostsMultiItem": {
                         "type": "nested",
                         "properties": {
                           "isoCode": {"type": "string"},
                           "original": {"type": "double"},
                           "current": {"type": "double"},
                           "discountPercentage": {"type": "long"}
                         }
                       },
                       "deliveryTimeMin": {"type": "long"},
                       "deliveryTimeMax": {"type": "long"},
                       "handlingTimeMin": {"type": "long"},
                       "handlingTimeMax": {"type": "long"}
                   }
                 }
               }
             }
           }
         },
         "images": {
           "type": "nested",
           "properties": {
             "type": {"type": "string"},
             "urls": {
               "type": "nested",
               "properties": {
                 "small": {"type": "string"},
                 "medium": {"type": "string"},
                 "large": {"type": "string"}
               }
             }
           }
         },
         "attributes": {
           "type": "nested",
           "properties": {
             "id": {"type": "string"},
             "value": {"type": "string"},
             "title": {"type": "string"}
           }
         }
       }
     }
   }
 }
}'

I try and query the data with the following queries:

#!/bin/bash

# this is working - notice default_field = _all
curl -XPOST "http://localhost:9200/search/models/_search" -d '{
  "query": {
    "bool": {
      "must": [
        {
          "query_string": {
            "default_field": "_all",
            "query": "Blau"
          }
        }
      ]
    }
  }
}'

# this is not working, trying to limit the search to default_field = models.products.color
# it seems this happens with ALL nested documents, as i can easily filter by e.g. models.categories
curl -XPOST "http://localhost:9200/search/models/_search" -d '{
  "query": {
    "bool": {
      "must": [
        {
          "query_string": {
            "default_field": "models.products.color",
            "query": "Blau"
          }
        }
      ]
    }
  }
}'

# doesn't work either, despite using nested paths.
curl -XPOST "http://localhost:9200/search/models/_search" -d '{
  "query": {
    "bool": {
      "must": [
        {
          "nested": {
            "path": "models.products",
            "query": {
              "bool": {
                "must": [
                  { "match": { "models.products.color": "Blau" }}
                ]
        }}}}
      ]
}}}'

I really have no clue what I'm doing wrong here. Any help would be highly appreciated.

Example data can be found here: http://pastebin.com/WG3xj2qz


(Alexander Reelsen) #2

Hey,

can you try changing the path and the match fields and remove the type prefix. So it becomes "path": "products" and "match" : { "products.color" : "Blau" }

Worked for me in a quick test, maybe my recreation was wrong.

--Alex


#3

Hi,

that did the trick and everything is working as intended!

You rock! :slight_smile:

Many, many thanks!


(system) #4