Создание динамического эластичного поискового запроса в php - PullRequest
0 голосов
/ 19 ноября 2018

Мне нужно создать следующий упругий поисковый запрос в php:

$parameters = [
    'index' => 'myindex',
    'from' => 0,
    'size' => 60,
    'body' => [
        'query' => [
            'bool' => [
                'filter' => [[
                'bool' => [
                    'must' => [
                        $myvariable,
                        ['nested' => [
                                'path' => 'sh',
                                'query' => [
                                    'bool' => [
                                        'filter' => [
                                            ['term' => ['sh.keyword' => 'PK']]
                                        ]
                                    ]
                                ]
                            ]
                        ]
                    ]
                ]
                    ]],
            ]
        ],
        "sort" => [
            ["score" => ["mode" => "avg"]]
        ]
    ]
];

Где $ myvariable должен быть:

['bool'=>
  ['should'=>[
      ['term'=> ['id'=> {$id1}]],
      ['term'=> ['id'=> {$id2}]],
          ],
    'minimum_should_match'=> 1
  ]
]

Я не хочу жестко кодировать значения, поскольку это полностью зависит от пользователя, выберет ли он / она упомянутые значения в раскрывающемся списке или нет.

Что я пробовал?

Я пытался создать внутреннюю часть, то есть термин часть:

$countofids = count($combined_array['ids']);


if ($countofids != 0) {

for ($i = 0; $i < $countofids ; $i++) {

    if ($i == 0) {
        $myvariable= array('term' => array('id' => $combined_array['ids'][$i]));
    } else {
         array_push($myvariable, $combined_array['ids'][$i]);
    }
}

}

Но это не работает, как ожидалось. Я получаю:

['term'=> ['id'=> {$id1}]]

Но, кроме того, я не получаю требуемый результат. Более того, я не знаю, как разделить их запятой. Кто-нибудь может предложить лучшее решение?

1 Ответ

0 голосов
/ 19 ноября 2018

Я немного переработал код, чтобы его было легче читать, но идея в том, что вы просто перезаписывали $myvariable каждый раз. Я включил некоторые тестовые данные для своих собственных целей и покажу, что он делает, но основная часть заключается в замене кода, который у вас уже есть ...

$combined_array = ['ids' => [1,2]];

if (count($combined_array['ids']) != 0) {
    // Define array for terms
    $myvariable = [];
    foreach ( $combined_array['ids'] as $id ) {
        // Add new term to existing list
        $myvariable[]= array('term' => array('id' => $id));
    }
    // Combine data with main structure
    $myvariable = [ 'bool' => ['should' => $myvariable,
        'minimum_should_match'=> 1]
    ];
}

print_r($myvariable);

что дает ...

Array
(
    [bool] => Array
        (
            [should] => Array
                (
                    [0] => Array
                        (
                            [term] => Array
                                (
                                    [id] => 1
                                )
                        )
                    [1] => Array
                        (
                            [term] => Array
                                (
                                    [id] => 2
                                )
                        )
                )
        )
)

Если я сделал какие-то неверные предположения, дайте мне знать, и я разберусь с ними.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...