2016-01-20 84 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