如何在弹性搜索中匹配所有args传递数组?

时间:2016-09-16 12:55:17

标签: elasticsearch foselasticabundle

如果所有args(1,2)中的一个匹配并且我需要所有args必须具有用户的degree.id,这里的术语给出结果
这里有我这样的数据

"id": 66,
"name": null,
"degrees": [
    {
        "id": 1,
        "name": "BCA",
    },{
        "id": 2,
        "name": "MCA",
    }
]

所以我需要的是,如果BCA和MCA两个学位都存在,那么只有那些记录会到达结果

$term = new \Elastica\Query\Terms();
$term->setTerms('degrees.id', array('1','2'));

return $boolQuery->addMust($term);

1 个答案:

答案 0 :(得分:1)

您使用setTerms制作的内容实际上是OR字段上的degrees

要进行AND查询,建议您使用Elastica\Query\BoolQuery类,如下所示:

$BCAQuery = new Elastica\Query\Term();
$BCAQuery->setTerm('degree.id', 1);

$MCAQuery = new Elastica\Query\Term();
$MCAQuery->setTerm('degree.id', 2);

$boolQuery = new BoolQuery();
$boolQuery->addMust($BCAQuery);
$boolQuery->addMust($MCAQuery);

请注意,如果将degrees映射为nested,则使用Elastica\Query\Nested

进行bool查询
$degreesQuery = new Elastica\Query\Nested();
$degreeQuery->setPath('degrees');
$degreesQuery->setQuery($boolQuery);