Преобразование Эластичного Поискового запроса в Эластику

У меня есть эластичный поисковый запрос как:

{
  "query": {
    "bool": {
      "must": [ 
       {
       "match": {"title": "accountant"}
       },
       {
          "nested": {
            "path": "schools", 
            "query": {
              "bool": {
                "must": [ 
                  { "match": { "schools.school_name": "Duke University" }}
                ]
        }}}}
      ]
}}}

Я использую библиотеку php Elastica и хочу преобразовать этот необработанный запрос в Elastica. Я знаю, что могу выполнять необработанные запросы из Elastica, но я бы предпочел использовать классы Elastica. Я пробовал это и это. Но ни один из них не работает. Вот упрощенная версия моего текущего кода:

$schoolsTermFilter = new \Elastica\Filter\Term(['schools.school_name' => "Duke University"]);
$schoolsBoolFilter = new \Elastica\Filter\Bool();
$schoolsBoolFilter->addMust($schoolsTermFilter);

$nestedFilter = new \Elastica\Filter\Nested();
$nestedFilter->setPath("schools");
$nestedFilter->setFilter($schoolsBoolFilter);

$boolFilter = new \Elastica\Filter\Bool();
$boolFilter->addMust($nestedFilter);

$query->setPostFilter($boolFilter);

Однако это возвращает пустые результаты. Необработанный запрос возвращает результаты, поэтому я знаю, что должен что-то получить. Кто-нибудь может мне помочь в этом? Спасибо

2 ответа

Решение

Вот перевод 1:1 в Elastica по вашему запросу:

$query = new \Elastica\Query();

$matchQuery = new \Elastica\Query\Match();
$matchQuery->setField("title", "accountant");

$schoolsTermQuery = new \Elastica\Query\Match();
$schoolsTermQuery->setField("schools.school_name", "Duke University");
$schoolsBoolQuery = new \Elastica\Query\Bool();
$schoolsBoolQuery->addMust($schoolsTermQuery);

$nestedQuery = new \Elastica\Query\Nested();
$nestedQuery->setPath("schools");
$nestedQuery->setQuery($schoolsBoolQuery);

$boolQuery = new \Elastica\Query\Bool();
$boolQuery->addMust($matchQuery);
$boolQuery->addMust($nestedQuery);

$query->setQuery($boolQuery);

print_r(json_encode($query->toArray()));

Вставленный вами запрос Elasticsearch не содержит фильтров, только запросы. Таким образом, перевод Elastica не должен использовать объекты из \Elastica\Filter но из \Elastica\Query вместо. Кроме того, если вы хотите проверить запрос перед его использованием в Elasticsearch, вы можете напечатать его с помощью $query->toArray(),

Это версия QueryBuilder (>= v1.4.2.0):

$qb = new \Elastica\QueryBuilder();

$query = new \Elastica\Query(
    $qb->query()->bool()
        ->addMust($qb->query()->match(
            'title',
            'accountant'
        ))
        ->addMust($qb->query()->nested()
            ->setPath('schools')
            ->setQuery(
                $qb->query()->bool()
                    ->addMust($qb->query()->match(
                        'schools.school_name',
                        'Duke University'
                    ))
            )
        )
);
Другие вопросы по тегам