在ruflin中构建查询弹性搜索Symfony3

时间:2016-09-06 10:19:01

标签: elasticsearch symfony elastica

我在使用Elastica和ruflin库进行PHP构建查询时遇到了困难。我可以效仿的例子不多。

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

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

  1. 我想显示仅匹配某个工作室的用户:

    $finder = $this->get('fos_elastica.finder.app.user');
    
    $boolQuery = new BoolQuery();
    
    $fieldQuery = new Match();
    $fieldQuery->setFieldQuery('studio', 'StackOverflow studio');
    $boolQuery->addMust($fieldQuery);
    
  2. 我想显示名为John的所有用户:

    $fieldQuery = new MoreLikeThis();
    $fieldQuery->setFields(['firstName', 'lastName', 'emailAddress']);
    $fieldQuery->setLikeText('John');
    $boolQuery->addMust($fieldQuery);
    
  3. 我想得到那个工作室的成员(不是客户) 注意:用户与ClientMember实体有关系。根据它,它将显示Member:Object或Client:Object。在这种情况下,我想确保成员存在。

    $fieldQuery = new Filtered();
    $fieldQuery->setFilter(new Exists('member'));
    $boolQuery->addMust($fieldQuery);
    
    $users = $finder->find($boolQuery);
    
  4. 问题是......它不起作用。它显示了0结果。无论我怎么玩,它都会显示0结果或错误的结果。

    有人可以帮我解决如何使用ruflin库为Elastica构建正确的查询以获得基于我上面提到的条件的结果吗?

    RAW QUERY:

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

    更新1:

    我已经修改了第3个查询(存在('成员'))。事实证明,我忘了将clientmember放在config.yml的映射下。仍然是第二次查询失败。

1 个答案:

答案 0 :(得分:1)

由于没有答案,我会回答自己。 我没有使用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);