【问题标题】:Convert Elastic Search Query to Elastica将 Elastic Search 查询转换为 Elastica
【发布时间】:2015-05-07 16:50:24
【问题描述】:

我有一个弹性搜索查询:

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

我正在使用 Elastica 的 php 库,我想将此原始查询转换为 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);

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

【问题讨论】:

    标签: php elasticsearch elastica


    【解决方案1】:

    这是 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'
                        ))
                )
            )
    );
    

    【讨论】:

      【解决方案2】:

      以下是 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() 打印它。

      【讨论】:

        猜你喜欢
        • 2022-09-28
        • 1970-01-01
        • 2016-01-23
        • 1970-01-01
        • 2019-01-17
        • 2013-08-15
        • 2016-02-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多