我有一个 flex 搜索查询为:

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

我正在使用PHP的Elastica库,我想将此原始查询转换为Elastica。我知道我可以从Elastica运行原始查询,但我更喜欢使用Elastica类。我尝试了thisthis。但是它们都不起作用。这是我当前代码的简化版本:
$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);

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

最佳答案

这是您查询的Elastica 1:1转换:

$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()进行打印。

09-04 23:09