如何将2个过滤器应用于我的ElasticSearch查询对象?

时间:2013-03-24 04:53:07

标签: search lucene indexing elasticsearch

我想查询我的索引,但应用2个过滤器。 第一,价格和第二位置。

var qobject = {
        query:{
            custom_score:{
                query:{
                    filtered:{
                        query:{
                            multi_match:{
                                query: q,
                                fields: ['title','description'],
                            }
                        },
                        filter:{
                            range:{
                                price: { from: 0, to: max_price }
                            },
                            geo_distance:{
                                'distance': distance + 'mi',
                                'location':{
                                    lat: lat,
                                    lon: lon
                                }
                            }
                        }
                    }
                },
                script: '_score + _source["price"] * 10'
            }
        }
    }

    elasticSearchClient.search('products', 'products', qobject)

如您所见,此查询对象会导致错误。

但是,如果我删除范围或geo_distance ,一切都很好!但我想要两个过滤器......

1 个答案:

答案 0 :(得分:2)

使用'和'过滤器。

http://www.elasticsearch.org/guide/reference/query-dsl/and-filter.html

没有测试:

var qobject = {
        query:{
            custom_score:{
                query:{
                    filtered:{
                        query:{
                            multi_match:{
                                query: q,
                                fields: ['title','description'],
                            }
                        },
                        filter:{
                            "and" : [
                                range:{
                                    price: { from: 0, to: max_price }
                                },
                                geo_distance:{
                                    'distance': distance + 'mi',
                                    'location':{
                                        lat: lat,
                                        lon: lon
                                    }
                                }
                            ]
                        }
                    }
                },
                script: '_score + _source["price"] * 10'
            }
        }
    }

解释:'过滤'部分'过滤后的查询'实际上可以是您喜欢的任何类型的过滤器,包括'和'。一旦明确了这个概念,构建复杂的查询/过滤器就非常简单了。