elasticsearch - 在ruflin Elastic search Symfony3中构建查询

标签 elasticsearch symfony elastica

我在使用Elastica和ruflin库来构建PHP时遇到困难。我没有很多例子可以效仿。

我在Symfony项目中有User实体,该实体包含以下字段:firstNamelastNameemailAddressstudiomemberclient(取决于它是什么用户)

所以现在我想过滤掉一些结果。

  • 我想显示仅与特定工作室匹配的用户:
    $finder = $this->get('fos_elastica.finder.app.user');
    
    $boolQuery = new BoolQuery();
    
    $fieldQuery = new Match();
    $fieldQuery->setFieldQuery('studio', 'StackOverflow studio');
    $boolQuery->addMust($fieldQuery);
    
  • 我想显示所有名称为John的用户:
    $fieldQuery = new MoreLikeThis();
    $fieldQuery->setFields(['firstName', 'lastName', 'emailAddress']);
    $fieldQuery->setLikeText('John');
    $boolQuery->addMust($fieldQuery);
    
  • 我想成为那个工作室的成员(不是客户)
    注意:用户与ClientMember实体有关系。依赖于此,它将显示Member:Object或Client:Object。在这种情况下,我想确保该成员存在。
    $fieldQuery = new Filtered();
    $fieldQuery->setFilter(new Exists('member'));
    $boolQuery->addMust($fieldQuery);
    
    $users = $finder->find($boolQuery);
    

  • 问题是...它不起作用。它显示了0个结果。无论我如何处理,它都会显示0个结果或错误的结果。

    有人可以帮我如何使用ruflin库为Elastica建立适当的查询,以便根据上述条件获得结果吗?

    原始查询:
    {
    
        "query":{
            "bool":{
                "must":[
                    {
                        "match":{
                            "studio":{
                                "query":"StackOverflow studio"
                            }
                        }
                    },
                    {
                        "filtered":{
                            "filter":{
                                "exists":{
                                    "field":"member"
                                }
                            }
                        }
                    },
                    {
                        "more_like_this":{
                            "fields":[
                                "firstName",
                                "lastName",
                                "emailAddress"
                            ],
                            "like_text":"John"
                        }
                    }
                ]
            }
        }
    
    }
    

    更新1:

    我已经设法解决第三查询(Exists('member'))。原来,我忘记了将clientmember放在config.yml中的映射下。仍然第二次查询失败。

    最佳答案

    既然没有答案,我会自己回答。
    我没有使用MoreLikeThis查询来查找文本,而是使用QueryString,事情开始起作用

    这是整个现在的样子:
    config.yml:

    fos_elastica:
        ...
        indexes:
            app:
                types:
                    user:
                        mappings:
                            emailAddress: ~
                            firstName: ~
                            lastName: ~
                            studio: ~
                            member: ~
                            client: ~
                        persistence:
                            driver: orm
                            model: AppBundle\Entity\User
                            provider: ~
                            listener:
                            finder: ~
    
    Controller:
        $finder = $this->get('fos_elastica.finder.app.user');
    
        $boolQuery = new BoolQuery();
    
        $fieldQuery = new Match();
        $fieldQuery->setFieldQuery('studio', 'StackOverflow studio');
        $boolQuery->addMust($fieldQuery);
    
        $fieldQuery = new Filtered();
        $fieldQuery->setFilter(new Exists('member'));
        $boolQuery->addMust($fieldQuery);
    
        $fieldQuery = new QueryString();
        $fieldQuery->setFields(['firstName', 'lastName', 'emailAddress']);
        $fieldQuery->setQuery('John*'); // * wildcard will filter look a like results for you.
        $boolQuery->addMust($fieldQuery);
    
        $query = new Query();
        $query->setQuery($boolQuery);
        $query->addSort(['firstName' => 'asc']);
    
        $users = $finder->find($query);
    

    关于elasticsearch - 在ruflin Elastic search Symfony3中构建查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39346544/

    相关文章:

    Elasticsearch 查询多个术语

    nosql - 在Elasticsearch中,多个顶级文档可以共享一个嵌套文档吗?

    python - elasticsearch-py连接池

    javascript - 使用 Twig 和 Symfony2 在 javascript 中生成路由

    php - 在 Symfony2 中获取客户端 IP

    php - Symfony - 如何知道控制台命令是从 Controller 运行还是从终端运行?

    elasticsearch - 检索仅包含允许标签的文档(完全等于)

    elasticsearch - Elastica多项搜索未返回正确结果

    symfony - 找不到服务 "fos_elastica.finder.app.user"

    php - 在一个查询中组合两个不同的过滤器 - Elastica