有条件地将术语过滤器添加到elasticsearch过滤器查询

时间:2015-10-10 09:18:38

标签: elasticsearch elasticsearch-query

我一直在想如何在将该术语过滤器实际添加到过滤后的查询之前检查搜索参数是否为空。根据我对弹性搜索的有限经验,似乎我必须提前构建我的确切查询。

如果我使用Node / Mongo,我知道我可以按照

的方式做点什么
var searchTerms = {};
if(req.body.country){
  searchTerm['user.country'] = req.body.country;
}

if(req.body.company){
  searchTerm['user.company'] = req.body.company;
}

if(req.body.salary){
  searchTerm['user.salary'] = req.body.salary;
}

Users.find(searchTerm)
  .exec(function(err, users) {
    if(!err){
      res.send(200, users);    
    }
    else{
      res.send(200, err);
    }
 });    

在角度方面我已经为弹性搜索构建了一个查询,只要填写了所有参数,它就能正常工作。我想我的问题是如何基于已填写的参数有条件地动态构建过滤查询用户。

即。用户A填写国家和公司但留下薪水。因此,薪水不会被列为术语过滤器。

client.search({
  index: 'firebase',
  type: 'user',
  body: {
    "query": {
       "filtered" : {
           "query" : {
               "match_all" : {}
             },
             "filter": {
                "and": [
                    {
                      "term": { "country" : searchParameters.country }
                    },
                    {
                      "term": { "company" : searchParameters.company }
                    },
                    {
                      "term": { "salary" : searchParameters.salary }
                    }
                ]
             }

       }
 }

提前谢谢大家!

1 个答案:

答案 0 :(得分:0)

您所描述的Node / Mongo所做的是Elasticsearch查询的方法。

所以你的JS代码可能类似于:

var filters = [];
var fields = ['country', 'company', 'salary',...]; // or some kind of hash to map req fields to elasticsearch fields if appropriate
for(var k = 0; k < fields.length; k++) {
    if(req.body[fields[k]]) {
        var termq = { term : {} };
        termq.term[fields[k]] = req.body[fields[k]];
        filters.push(termq);
    }
}

var query = {
    filtered : {
        query : { match_all : {} },
        filter : filters.length ? { and : filters } : {}
    }
};

client.search({ index: ..., type: ..., body: query }, ...);