Emil
Emil

Reputation: 6893

ElasticSearch- How to limit size of the each combined query?

Here is my Mapping

{
   "state":"open",
   "settings":{
      "index":{
         "creation_date":"1453816191454",
         "number_of_shards":"5",
         "number_of_replicas":"1",
         "version":{
            "created":"1070199"
         },
         "uuid":"TfMJ4M0wQDedYSQuBz5BjQ"
      }
   },
   "mappings":{
      "Product":{
         "properties":{
            "index":"not_analyzed",
            "store":true,
            "type":"string"
         },
         "ProductName":{
            "type":"nested",
            "properties":{
               "Name":{
                  "store":true,
                  "type":"string"
               }
            }
         },
         "ProductCode":{
            "type":"string"
         },
         "Number":{
            "index":"not_analyzed",
            "store":true,
            "type":"string"
         },
         "id":{
            "index":"no",
            "store":true,
            "type":"integer"
         },
         "ShortDescription":{
            "store":true,
            "type":"string"
         },
         "Printer":{
            "_routing":{
               "required":true
            },
            "_parent":{
               "type":"Product"
            },
            "properties":{
               "properties":{
                  "RelativeUrl":{
                     "index":"no",
                     "store":true,
                     "type":"string"
                  }
               }
            },
            "PrinterId":{
               "index":"no",
               "store":true,
               "type":"integer"
            },
            "Name":{
               "store":true,
               "type":"string"
            }
         }
      },
      "aliases":[]
   }
}

I would like to query mainly Products and if there products have 20 results, then return 20 products but if Products dont have any matching return printers+products having matching printers(childs)

When I execute this query, for key=tn-200, it returns 20 products and for key=hl-2230 returns me only printers. It works as expected. because hl-2230 doesnt have any products matching.

{
    "query": {
        "bool": {
            "should": [{
                "query_string": {
                    "default_field": "_all",
                    "query": "key"
                }
            }],
            "must_not": [],
            "must": []
        }
    },
    "from": 0,
    "size": 20,
    "sort": [],
    "aggs": {}
}

when I execute this query for hl-2230, it will return me products of matching hl-2230 printer. Also works as expected.

{ 
    "query": {
        "has_child": {
            "type": "Printer",
            "query": { 
                "match": {
                    "Name": "HL-2230"
                }
            }
        }
    },
    "from": 0,
    "size": 20,
    "sort": [],
    "aggs": {}
}

Now my questions is how to combine those? I tried to use combined bool query with limit but when I search hl-2230, it only returns products and never returns any printers. As if "should" part is inactive and only must part is executed. because If I set "value" : 1 for the must query, I get 5 results (5 shards), "value" : 2, I get 10 results. I am not sure if the limit query is the way to go also? Please advise me. thanks.

{
    "query": {
        "bool": {
            "should": [{
                "filtered" : {
                    "filter" : {
                        "limit" : {
                            "value" : 20
                        }
                    },
                    "query": {
                        "multi_match": {
                            "type": "best_fields",
                            "query": "hl-2230",
                            "fields": [
                                "ManufactureNumber^5",
                                "Number^4",
                                "Name^3"
                            ]
                        }
                    }
                }
            }],
            "must": [{
                "filtered" : {
                    "filter" : {
                        "limit" : {
                            "value" : 1
                        }
                    },
                    "query": {
                        "has_child": {
                            "type": "Printer",
                            "query": {
                                "match": {
                                    "Name": "HL-2230"
                                }
                            }
                        }
                    }
                }
            }]
        }  
    },
    "from": 0,
    "size": 20,
    "sort": [],
    "aggs": {}
}

Upvotes: 0

Views: 582

Answers (1)

Richa
Richa

Reputation: 7649

PLease try this:

{
 "query": {
  "bool": {
     "should": [
        {
           "multi_match": {
              "type": "best_fields",
              "query": "hl-2230",
              "fields": [
                 "ManufactureNumber^5",
                 "Number^4",
                 "Name^3"
              ]
           }
        },
        {
           "has_child": {
              "type": "Printer",
              "query": {
                 "match": {
                    "Name": "HL-2230"
                 }
              }
           }
        }
     ]
    }
 },
 "size": 20,
 "sort": [],
 "aggs": {}
}

Hope this helps.

Upvotes: 1

Related Questions