2016-09-06 3 views
0

PHP用のElasticaとruflinライブラリでクエリを作成するのが苦労しています。私が従うことができる多くの例はありません。ruflinでクエリを作成するエラスティック検索symfony3

私は、次のフィールドで構成されてsymfonyプロジェクトで Userエンティティ持っ

firstNamelastNameemailAddressstudiomemberまたはclient(それが何であるかをユーザーに依存)

をだから今、私はフィルタリングしたいですいくつかの結果。

私は特定のスタジオに一致するユーザーを表示したい
  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); 
    

問題は、それが動作しない...ということです。それは私に0の結果を示しています。どのようにプレイしても、結果は0か間違っています。

上記の条件に基づいて結果を得るために、Elasticaのruflinライブラリを使用して適切なクエリを作成する方法を教えてもらえますか?

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" 
        } 
       } 
      ] 
     } 
    } 

} 

UPDATE 1:

私は() 'メンバー'(存在する)第三クエリを修正するためにうまく管理しています。私は、config.ymlにマッピングの下にclientmemberを入れるのを忘れていたことが判明しました。まだ2番目のクエリは失敗します。

+0

@ruflinこれはあなたのためです;-) – Val

+0

愚かな質問はありませんので、私は1つ質問します: "ユーザーのインデックスを作成しましたか?" – malcolm

+0

はい:私はユーザーのインデックスを作成しました。スタジオ(最初のクエリ)で適切にフィルタリングしますが、MoreLikeThisとExistsではそうではありませんが、Johnが存在していてもメンバーのプロパティは0になっています。 – undefinedman

答えて

0

答えがないので、私は自分自身に答えるでしょう。代わりに、テキストの一部を見つけるために、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); 
関連する問題