elasticsearch嵌套范围过滤器脚本

时间:2015-02-27 08:21:49

标签: elasticsearch

我有弹性搜索范围聚合问题。

我在一个名为“products”的嵌套“对象”中有一个名为“prices”的嵌套对象。 在这个子嵌套对象价格中,我对不同的国家和货币有不同的价格。现在我想使用范围聚合,但是这会循环所有价格项并返回大范围聚合。 现在我想使用脚本来过滤curriencies和country price。但我的if子句从未获得返回值。

"script": "if(doc['currency']=='GBP') { doc['price']; } else 0"

这是我的查询代码

"aggs": {
    "products": {
        "nested": {
            "path": "products"
        },
        "aggs": {
            "prices": {
                "nested": {
                    "path": "products.prices"
                },
                "aggs": {
                    "range": {
                        "range": {
                            "field": "products.prices.price",
                            "script": "if(doc['currency']=='GBP') { doc['price']; } else 0",
                            "params": {
                                "currency": "GBP",
                                "country": "GB"
                            },
                            "ranges": [
                                {
                                    "to": 50
                                },
                                {
                                    "from": 50,
                                    "to": 100
                                },
                                {
                                    "from": 100
                                }
                            ]
                        }
                    }
                }
            }
        }
    }
}

和我的映射

{
"settings": {
    "index": {
        "number_of_shards": 2,
        "number_of_replicas": 1
    },
    "analysis": {
        "filter": {
            "nGram_filter": {
                "type": "nGram",
                "min_gram": 2,
                "max_gram": 20,
                "token_chars": ["letter", "digit", "punctuation", "symbol"]
            }
        },
        "analyzer": {
            "nGram_analyzer": {
                "type": "custom",
                "tokenizer": "whitespace",
                "filter": ["lowercase", "asciifolding", "nGram_filter"]
            },
            "whitespace_analyzer": {
                "type": "custom",
                "tokenizer": "whitespace",
                "filter": ["lowercase", "asciifolding"]
            }
        }
    }
},
"mappings": {
    "program": {
        "properties": {
            "title": {
                "type": "string",

                "fields": {
                    "raw": {
                        "type": "string",
                        "index": "not_analyzed"
                    }
                }
            },
            "products": {
                "type": "nested",
                "store": true,
                "index": "analyzed",
                "fields": {
                    "raw": {
                        "type": "nested",
                        "index": "not_analyzed"
                    }
                },
                "properties": {
                    "sku": {
                        "type": "string",
                        "store": true,
                        "index": "analyzed",
                        "fields": {
                            "raw": {
                                "type": "string",
                                "index": "not_analyzed"
                            }
                        }
                    },
                    "prices": {
                        "type": "nested",
                        "store": true,
                        "index": "analyzed",
                        "fields": {
                            "raw": {
                                "type": "nested",
                                "index": "not_analyzed"
                            }
                        },
                        "properties": {
                            "price": {
                                "type": "float",
                                "store": true,
                                "index": "analyzed",
                                "null_value": 0,
                                "analyzer": "english",
                                "fields": {
                                    "raw": {
                                        "type": "float",
                                        "index": "not_analyzed"
                                    }
                                }
                            },
                            "price2": {
                                "include_in_all": false,
                                "type": "float",
                                "store": true,
                                "index": "analyzed",
                                "null_value": 0,
                                "fields": {
                                    "raw": {
                                        "type": "float",
                                        "index": "not_analyzed"
                                    }
                                }
                            },
                            "vat": {
                                "include_in_all": false,
                                "type": "float",
                                "store": true,
                                "index": "analyzed",
                                "null_value": 0,
                                "fields": {
                                    "raw": {
                                        "type": "float",
                                        "index": "not_analyzed"
                                    }
                                }
                            },
                            "country": {
                                "include_in_all": false,
                                "type": "string",
                                "store": true,
                                "index": "analyzed",
                                "fields": {
                                    "raw": {
                                        "type": "string",
                                        "index": "not_analyzed"
                                    }
                                }
                            },
                            "currency": {
                                "include_in_all": false,
                                "type": "string",
                                "store": true,
                                "index": "analyzed",
                                "fields": {
                                    "raw": {
                                        "type": "string",
                                        "index": "not_analyzed"
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

}

2 个答案:

答案 0 :(得分:0)

你可以尝试一下吗?

{
    "filtered" : {
        "query" : { "match_all" : {} },
        "filter" : {
            "nested" : {
                "path" : "products",
                "filter" : {
                    "bool" : {
                        "must" : [
                            {
                                "term" : {"prices.currency" : "GBP"}
                            },
                            {
                                "range" : {"range.count" : {"gt" : 5}}
                            }
                        ]
                    }
                },
                "_cache" : true
            }
        }
    }
}

答案 1 :(得分:0)

此时对于ElasticSearch已弃用Filtered,并被bool替换。新版本将如下:

{
"query" : {
    "nested" : {
        "path" : "products",
        "query" : {
            "bool" : {
                "must" : [
                    {
                        "term" : {"prices.currency" : "GBP"}
                    },
                    {
                        "range" : {"range.count" : {"gt" : 5}}
                    }
                ]}
            }
        }
    }
}

以下是对ElasticSearch documentation

的引用