Формат массива Elasticsearch для нескольких обязательных терминов - PullRequest
0 голосов
/ 16 января 2019

Я работаю надasticsearch (2.3) и пытаюсь создать поисковый запрос. Для упругого поиска мне нужен JSON, но я начинаю с простого массива php и впоследствии кодирую его в JSON.

У меня проблема с созданием правильного формата массива.

Это небольшая часть кода, который я использую:

$params['body']['query']['filtered']['filter']['bool']['must']["term"]['pprCategories']= "category1";
$params['body']['query']['filtered']['filter']['bool']['must_not']['exists']['field'] = "field1";

С оператором if я добавляю новую строку:

$params['body']['query']['filtered']['filter']['bool']['must']['term']['country_name']= "country1";

Итак, общий код:

<code>$params['body']['query']['filtered']['filter']['bool']['must']["term"]['pprCategories']= "category1";
$params['body']['query']['filtered']['filter']['bool']['must_not']['exists']['field'] = "field1";
$params['body']['query']['filtered']['filter']['bool']['must']['term']['country_name']= "country1";

#output
echo "<pre>";
print_r(json_encode($params, JSON_PRETTY_PRINT));
echo "
";

Фактический результат, который я получаю из построенного мной запроса:

{
    "body": {
        "query": {
            "filtered": {
                "filter": {
                    "bool": {
                        "must": {
                            "term": {
                                "pprCategories": "category1",
                                "country_name": "country1"
                            }
                        },
                        "must_not": {
                            "exists": {
                                "field": "field1"
                            }
                        }
                    }
                }
            }
        }
    }
}

Однако желаемый результат будет следующим, т.е. с двумя элементами в массиве bool/must:

{
  "body": {
    "query": {
      "filtered": {
        "filter": {
          "bool": {
            "must": [
              {
                "term": {
                  "pprCategories": "category1"
                }
              },
              {
                "term": {
                  "country_name": "country1"
                }
              }
            ],
            "must_not": {
              "exists": {
                "field": "field1"
              }
            }
          }
        }
      }
    }
  }
}

Как вы можете видеть, массив bool/must содержит два условия вместо одного: pprCategories и country_name - это два разных обязательных условия.

Спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Я думаю, вы должны идти этим путем, прежде чем отправлять его в JSON.

$params['body']['query']['filtered']['filter']['bool']['must'][0]["term"]['pprCategories']= "category1";
$params['body']['query']['filtered']['filter']['bool']['must'][1]["term"]['country_name']= "country1";
$params['body']['query']['filtered']['filter']['bool']['must'][2]["term"]['population_name']= "population1";
$params['body']['query']['filtered']['filter']['bool']['must'][3]["term"]['kilometers_amount']= "55145";
0 голосов
/ 16 января 2019

Если вы хотите добавить несколько условий, вы должны понимать, что bool/must должен быть массивом. Вы можете заставить свой код работать так:

// first create the bool/must array with a single term condition
$params['body']['query']['filtered']['filter']['bool']['must'] = [ 
   [ 
     'term' => [
        'pprCategories' => "category1"; 
     ]
   ] 
];
// add the must_not condition
$params['body']['query']['filtered']['filter']['bool']['must_not']['exists']['field'] = "field1";

// test your condition
if (...) {
    // now add a second constraint to the bool/must array
    $params['body']['query']['filtered']['filter']['bool']['must'][] = [ 
        'term' => [
            'country_name' => "country1" 
        ]
    ];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...