将弹性搜索查询转换为Elastica

Ibr*_*him 2 php elasticsearch elastica

我有一个弹性搜索查询:

{
  "query": {
    "bool": {
      "must": [ 
       {
       "match": {"title": "accountant"}
       },
       {
          "nested": {
            "path": "schools", 
            "query": {
              "bool": {
                "must": [ 
                  { "match": { "schools.school_name": "Duke University" }}
                ]
        }}}}
      ]
}}}
Run Code Online (Sandbox Code Playgroud)

我正在使用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);
Run Code Online (Sandbox Code Playgroud)

但是,这会返回空结果.原始查询确实返回结果,所以我知道我应该得到一些东西.有人可以帮助我吗?谢谢

小智 6

这是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'
                    ))
            )
        )
);
Run Code Online (Sandbox Code Playgroud)