首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将弹性搜索查询转换为Elastica

将弹性搜索查询转换为Elastica
EN

Stack Overflow用户
提问于 2015-05-07 16:50:24
回答 2查看 2.9K关注 0票数 2

我有一个弹性搜索查询,查询如下:

代码语言:javascript
复制
{
  "query": {
    "bool": {
      "must": [ 
       {
       "match": {"title": "accountant"}
       },
       {
          "nested": {
            "path": "schools", 
            "query": {
              "bool": {
                "must": [ 
                  { "match": { "schools.school_name": "Duke University" }}
                ]
        }}}}
      ]
}}}

我正在使用php的Elastica库,我希望将这个原始查询转换为Elastica。我知道我可以从Elastica运行原始查询,但是我更喜欢使用Elastica类。我试过thisthis。但它们都不起作用。下面是我当前代码的简化版本:

代码语言:javascript
复制
$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);

但是,这将返回空的结果。原始查询确实返回结果,因此我知道我应该得到一些结果。有人能帮我吗?谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-07 22:06:38

对于您的查询,这里有一个1:1的转换到Elastica:

代码语言:javascript
复制
$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\Filter的对象,而应该使用来自\Elastica\Query的对象。此外,如果要在Elasticsearch中使用查询之前验证查询,可以使用$query->toArray()打印它。

票数 4
EN

Stack Overflow用户

发布于 2015-05-14 21:51:37

这是QueryBuilder版本(>= v1.4.2.0):

代码语言:javascript
复制
$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'
                    ))
            )
        )
);
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30107235

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档