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

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

{
"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(),

3

Другие решения

Это версия 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'
))
)
)
);
6

По вопросам рекламы [email protected]