【问题标题】:Adding Multiple Filters to an existing Filter in ElasticsearchPhp向 Elasticsearch Php 中的现有过滤器添加多个过滤器
【发布时间】:2016-01-20 14:52:48
【问题描述】:

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

我的文件是这样的

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]
        ]
    ];
}

年龄过滤器.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";
}

【问题讨论】:

标签: php elasticsearch


【解决方案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);
}

【讨论】:

  • 谢谢,它有效。但我不明白的一件事是为什么数组元素被替换而不是被添加,因为我不是指过滤器的实际位置。
  • 太棒了,很高兴它有帮助!
猜你喜欢
  • 2018-02-17
  • 2022-01-17
  • 2011-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多