在Elasticsearch中一起使用“terms”和“range”过滤器

时间:2016-01-27 09:46:57

标签: php elasticsearch

我到处搜索,但没有一个答案符合我的要求。 我的代码是这样的:

档案1

<?php
 if($year != 0)
 {
 $temp = strval($year);
 $term =[ 
         "range" => [
           "decidedon" => [
               "gte" => $temp."-01-01",
               "lte" => $temp."-12-31"
                      ]
                    ]
        ];
 array_push($params['body']['query']['filtered']['filter']['bool']['must'], $term);
 }

文件2

<?php
 $dummy = explode(" ",$cor);
 $params['body']['query']['filtered']['filter']['bool']['must'] = ['terms'=> ['court' => $dummy]  ];

我将它们包含在不同实例的索引页面中,如下所示

if(isset($_GET['cor'])){
 $cor = $_GET['cor'];
 if(strcasecmp($cor,"all")!=0){
  include 'courtfilter.php';  
  }
}

if(isset($_GET['year'])){
 $year = $_GET['year'];
 if($year != 0){
  include 'yearfilter.php';
  }
} 

当我运行查询时,它表示术语和范围不能嵌套在一起。 有人能告诉我一个更好的方法来做到这一点,而不会使我的程序复杂化或不必为这两个编写单独的过滤器?

(我是初学者,请原谅我,如果我错了,或者这太琐碎了。)

1 个答案:

答案 0 :(得分:1)

你几乎就在那里。在第二个文件中,您需要将terms插入must,如下所示:

$params['body']['query']['filtered']['filter']['bool']['must'] = [['terms'=> ['court' => $dummy]  ]];
                                                                 ^                                 ^
                                                                 |                                 |
                                                               add this .....................and this

即。 <{1}}必须是一个数组,并且您直接为它分配一个对象/哈希。

更好的方法是在包含任何文件之前(即bool/must之前)初始化must子句。您首先要初始化if(isset($_GET['cor']))数组,如下所示:

bool/must

然后在您收录的两个文件中,您只需按照文件$params['body']['query']['filtered']['filter']['bool']['must'] = []; 中的array_push()进行yearfilter.php