2016-10-14 8 views
1

Im с помощью FOSElasticaBundle для интеграции моего проекта symfony3 с elasticsearch. У меня есть отображение, похожий на:foselasticabundle вложенные запросы

company: 
    mappings: 
     id: { boost: 1, type: string, index: not_analyzed } 
     cik: { boost: 2, type: string, index: not_analyzed } 
     conformedName: { boost: 6, analyzer: custom_analyzer } 
     assignedSIC: 
      type: object 
      properties: 
       id: { type: string, index: not_analyzed } 
       code: { type: string, index: not_analyzed } 
       title: { analyzer: custom_analyzer } 
     businessAddress: 
      type: object 
      properties: 
       street1: { analyzer: custom_analyzer } 
       street2: { analyzer: custom_analyzer } 
       city: { analyzer: custom_analyzer } 
       state: { analyzer: custom_analyzer } 
       zip: { type: string, index: not_analyzed } 
       phone: { type: string, index: not_analyzed } 

Я хочу фильтровать города, штата и почтовый индекс вложенного businessAddress собственности.

У меня есть этот запрос:

$boolQuery = new BoolQuery(); 
$cityQuery = new Match(); 
$cityQuery->setFieldQuery('businessAddress.city', array($city])); 
$cityQuery->setFieldParam('businessAddress.city', 'analyzer', 'custom_analyzer'); 
$boolQuery->addMust($cityQuery); 
$this->finder->find($boolQuery); 

JSON запрос как

{"query":{"bool":{"must":[{"match":{"businessAddress.city":{‌​"query":["NY"],"anal‌​yzer":"custom_analyz‌​er"}}}]}}} 

Но есть 0 результатов, я не знаю, если синтаксис businessAddress.city будет обрабатываться автоматически расслоением или я необходимо создать вложенный запрос. В случае, если это вложенный запрос, как я могу его построить?

EDIT

После некоторых комментариев ниже я замечаю я садился термин матча как массив, теперь я изменяю от:

$cityQuery->setFieldQuery('businessAddress.city', array($city])); 

в

$cityQuery->setFieldQuery('businessAddress.city', $city]); 

в результате на JSon запросе:

{"query":{"bool":{"must":[{"match":{"businessAddress.state":{"query":"NY","analyzer":"custom_analyzer"}}}]}}} 

У меня есть проверка через Интернет и ничего не найдено.

Пожалуйста, помогите. Спасибо

+0

Можете ли вы экспортировать '$ boolQuery' как json. Вы можете использовать метод '-> toArray()'. – hkulekci

+0

@hkulekci здесь {{query}: {"bool": {"must": [{"match": {"businessAddress.city": {"query": ["NY"], "analyzer": " custom_analyzer "}}}]}}} – bitgandtter

+0

Этот запрос не работал в elasticsearch напрямую. Запрос соответствия не поддерживает значение массива во время поиска. Вы можете проверить свой ответ на ваш запрос? Неужели Elastica вернула ошибку? – hkulekci

ответ

0

Вот как реализовать его с помощью вложенного запроса.

Прежде всего, вам необходимо обновить отображение, чтобы сделать ваш businessAddress типа nested

... 
    businessAddress: 
     type: nested 
... 

Тогда вы будете иметь возможность для выполнения запроса следующего Nested

$boolQuery = new BoolQuery(); 
$cityQuery = new Match(); 
$cityQuery->setFieldQuery('businessAddress.city', array($city])); 
$cityQuery->setFieldParam('businessAddress.city', 'analyzer', 'custom_analyzer'); 
$boolQuery->addMust($cityQuery); 
// nested query 
$query = new Nested(); 
$query->setPath('businessAddress'); 
$query->setQuery($boolQuery); 
// pass the nested query to your finder 
$this->finder->find($query); 

Надеется, что это помогает

+0

Обратите внимание, что если у вас есть только одно условие в вашем матче запрос 'BoolQuery' не является обязательным –

 Смежные вопросы

  • Нет связанных вопросов^_^