简体   繁体   English

将弹性搜索查询转换为Elastica

[英]Convert Elastic Search Query to Elastica

I have an Elastic Search query as: 我有一个弹性搜索查询:

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

I'm using Elastica library of php and I want to convert this raw query into Elastica. 我正在使用php的Elastica库,我想将这个原始查询转换为Elastica。 I know I can run raw query from Elastica, but I would prefer using Elastica classes. 我知道我可以从Elastica运行原始查询,但我更喜欢使用Elastica类。 I have tried this and this . 我试过这个这个 But none of them works. 但它们都不起作用。 Here is the simplified version of my current code: 这是我当前代码的简化版本:

$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);

However, this returns empty results. 但是,这会返回空结果。 The raw query does return results, so I know I should get something. 原始查询确实返回结果,所以我知道我应该得到一些东西。 Can anybody help me in this? 有人可以帮助我吗? Thanks 谢谢

This is the QueryBuilder version (>= v1.4.2.0): 这是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'
                    ))
            )
        )
);

Here is a 1:1 translation to Elastica for your query: 以下是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()));

The Elasticsearch query which you have pasted does not contain filters, only queries. 您粘贴的Elasticsearch查询不包含过滤器,仅包含查询。 So, the Elastica translation should not use objects from \\Elastica\\Filter but from \\Elastica\\Query instead. 因此,Elastica转换不应使用\\Elastica\\Filter对象,而应使用\\Elastica\\Query Also, if you want to verify the query before using it in Elasticsearch, you can print it with $query->toArray() . 此外,如果要在Elasticsearch中使用它之前验证查询,可以使用$query->toArray()进行打印。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM