elasticsearch,kibana,Javascript,elasticsearch,Kibana" /> elasticsearch,kibana,Javascript,elasticsearch,Kibana" />

Javascript 在kibana3/elastic.js中合并两个过滤器

Javascript 在kibana3/elastic.js中合并两个过滤器,javascript,elasticsearch,kibana,Javascript,elasticsearch,Kibana,我在Kibana3的自定义面板中有两个过滤器: request = request.query( $scope.ejs.FilteredQuery( boolQuery, filterSrv.getBoolFilter(filterSrv.ids()) // has to be merged with BoolFilter2 )) .size($scope.panel.size); 这适用于两个过滤器中的任何一个,但我想使用两个对象进

我在Kibana3的自定义面板中有两个过滤器:

 request = request.query(
    $scope.ejs.FilteredQuery(
       boolQuery,
       filterSrv.getBoolFilter(filterSrv.ids())  // has to be merged with BoolFilter2
     ))
     .size($scope.panel.size);

这适用于两个过滤器中的任何一个,但我想使用两个对象进行过滤,但我不知道如何合并它们。有人能帮忙吗?

Kibana 3过滤器可以设置为任意一种模式,而不是必须设置

这转化为如下所示的过滤器:

{
  "filter": {
    "bool": {
      "should": [
        {
          "fquery": {
            "query": {
              "query_string": {
                "query": "test1"
              }
            },
            "_cache": true
          }
        },
        {
          "fquery": {
            "query": {
              "query_string": {
                "query": "test2"
              }
            },
            "_cache": true
          }
        }
      ]
    }
  }
}
以下是在Kibana 3中处理该问题的filterSrv代码:


您可以修改该函数,使其接受一个可选参数,该参数将指令设置为任意一个。

我不知道javascript逻辑是如何工作的,但我的建议是And过滤器。
this.getBoolFilter = function(ids) {
  var bool = ejs.BoolFilter();
  // there is no way to introspect the BoolFilter and find out if it has a filter. We must keep note.
  var added_a_filter = false;

  _.each(ids,function(id) {
    if(dashboard.current.services.filter.list[id].active) {
      added_a_filter = true;

      switch(dashboard.current.services.filter.list[id].mandate)
      {
      case 'mustNot':
        bool.mustNot(self.getEjsObj(id));
        break;
      case 'either':
        bool.should(self.getEjsObj(id));
        break;
      default:
        bool.must(self.getEjsObj(id));
      }
    }
  });
  // add a match filter so we'd get some data
  if (!added_a_filter) {
    bool.must(ejs.MatchAllFilter());
  }
  return bool;
};

this.getEjsObj = function(id) {
  return self.toEjsObj(dashboard.current.services.filter.list[id]);
};