2016-09-06 1 views
0

У меня трудные времена с библиотекой Elastica и ruflin для PHP для создания запросов. Я не могу привести много примеров.Создание запросов в ruflin Упругий поиск Symfony3

У меня есть User сущность в проекте Symfony, который состоит из следующих полей: firstName, lastName, emailAddress, studio и member или 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. Я хочу, чтобы члены эта студия (не клиенты) Примечание: Пользователь имеет отношение к Client и Member. В зависимости от этого в нем будет показан элемент: объект или клиент: объект. В этом случае я хочу быть уверенным, что Member существует.

    $fieldQuery = new Filtered(); 
    $fieldQuery->setFilter(new Exists('member')); 
    $boolQuery->addMust($fieldQuery); 
    
    $users = $finder->find($boolQuery); 
    

Проблема заключается в том, что ... он не работает. Это показывает мне 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" 
        } 
       } 
      ] 
     } 
    } 

} 

UPDATE 1:

Я сведущих исправить 3-й запрос (Exists ('член')). Оказалось, что я забыл поставить client и member под сопоставлениями в config.yml. По-прежнему выполняется второй запрос.

+0

@ruflin это для вас ;-) – Val

+0

Нет глупых вопросов, поэтому я собираюсь задать один вопрос: «Вы проиндексировали пользователей?» – malcolm

+0

Да :) Я проиндексировал пользователей. Он правильно фильтрует на студию (первый запрос), но на MoreLikeThis и Exists нет, дает 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); 
Смежные вопросы