2016-01-20 86 views
2

我是一名初学者,正在研究elasticsearch php进行简单搜索。 我必须根据过滤器是否被选择的天气来有条件地设置过滤器。 因此,我已经为该特定任务制作了过滤器,并将它们放置在不同的文件中。我所做的是在isset返回true时包含这些文件。 但问题是,如果选择了多个过滤器,则最后一个过滤器会覆盖数组的过滤器部分,并且不会提供所需的多个过滤答案。无论如何做这项工作? (请原谅我,如果这是低效的,因为我是一个初学者,只是努力学习。)将多个过滤器添加到ElasticsearchPhp中的现有过滤器

我的文件是这样的

BalFilter.php

<?php 

if ($val == 1) { 
    $params['body']['query']['filtered']['filter'] = ['range' => [ 
      'balance' => ['gte' => $bal] 
     ] 
    ]; 
} 
if ($val == 2) { 
    $params['body']['query']['filtered']['filter'] = ['range' => [ 
      'balance' => ['lte' => $bal] 
     ] 
    ]; 
} 

AgeFilter.php

<?php 
$params['body']['query']['filtered']['filter']['term'] = ['age' => $age]; 

OnlyQuery.php

<?php 
$params['body']['query']['filtered']['query'] = [ 'query_string' => [ 
                'default_field' => '_all', 
                'query' => $q, 
                'lenient' => true 
                   ] 
               ]; 

,并在主索引

if (isset($_GET['age'])) { 
    $age = $_GET['age']; 
} else { 
    $age = 0; 
} 
if (isset($_GET['val'])) { 
    $val = $_GET['val']; 
} else { 
    $val = 0; 
} 
if (isset($_GET['bal'])) { 
    $bal = $_GET['bal']; 
} else { 
    $bal = 0; 
} 

include "OnlyQuery.php"; 

if ($age != 0) { 
    include "AgeFilter.php"; 
} 
if (($val == 0 && $bal != 0) || ($val != 0 && $bal == 0)) { 
    echo "Please choose the right combination for balance"; 
} 
if ($val != 0 && $bal != 0) { 
    include "BalFilter.php"; 
} 
+0

对于多个过滤器,你可以使用'AND'过滤器。这里是文档:https://www.elastic.co/guide/en/elasticsearch/reference/1.4/query-dsl-and-filter.html – Samir

+0

你可以显示'OnlyQuery.php'的内容吗? – Val

+0

@Samir'AND'不支持'gte'和'lte'过滤器 –

回答

1

你可以做的是创造得到由每个过滤器中所包含的文件填充的bool/must滤镜阵列。这可以在OnlyQuery.php或只是包括OnlyQuery.php后进行的,基本上是这样的:

... 
include "OnlyQuery.php"; 

$params['body']['query']['filtered']['filter'] = array('bool' => [ 
    'must' => [] 
]); 
... 

然后AgeFilter.php可以改成这样:

$term = array('term' => ['age' => $age]); 
array_push($params['body']['query']['filtered']['filter']['bool']['must'], $term); 

而且BalFilter.php这个

if ($val == 1) { 
    $range = array('range' => [ 
     'balance' => ['gte' => $bal] 
    ]); 
    array_push($params['body']['query']['filtered']['filter']['bool']['must'], $range); 
} 
if ($val == 2) { 
    $range = array('range' => [ 
     'balance' => ['lte' => $bal] 
    ]); 
    array_push($params['body']['query']['filtered']['filter']['bool']['must'], $range); 
} 
+0

我同意你的观点,赞成 – zhilevan

+0

谢谢,它有效。 但有一件事我不明白是为什么数组元素被替换而不是添加,因为我不是指其过滤器的实际位置。 –

+0

真棒,很高兴它帮助! – Val