【问题标题】:Using "terms" and "range" filters together in Elasticsearch在 Elasticsearch 中同时使用“terms”和“range”过滤器
【发布时间】:2016-01-27 19:29:26
【问题描述】:

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

文件 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';
  }
} 

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

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

【问题讨论】:

    标签: php elasticsearch


    【解决方案1】:

    你快到了。在您的第二个文件中,您需要将 terms 插入到您的 must 中,如下所示:

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

    bool/must 必须是一个数组,并且您直接为其分配了一个对象/哈希。

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

    $params['body']['query']['filtered']['filter']['bool']['must'] = [];
    

    然后在您包含的两个文件中,您可以像在文件 yearfilter.php 中一样简单地执行 array_push()

    【讨论】:

    • 会尝试并回复您。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多