У меня есть эластичный поисковый запрос как:
{
"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);
Однако это возвращает пустые результаты. Необработанный запрос возвращает результаты, поэтому я знаю, что должен что-то получить. Кто-нибудь может мне помочь в этом? Спасибо
Вот перевод 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'
))
)
)
);