foselasticabundle вложенные запросы

#symfony #elasticsearch #elastica #foselasticabundle

#symfony #эластичный поиск #elastica #foselasticabundle

Вопрос:

Я использую FOSElasticaBundle для интеграции моего проекта symfony3 с elasticsearch. У меня есть сопоставление, похожее на:

 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 результатов, я не знаю, будет ли пакет sintax businessAddress.city обрабатываться автоматически пакетом или мне нужно создать вложенный запрос. В случае, если это вложенный запрос, как я могу его построить?

Редактировать

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

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

Для

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

результат по запросу json:

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

я проверил через Интернет и ничего не нашел.

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

Комментарии:

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

2. @hkulekci вот оно {«query»:{«bool»:{«must»:[{«match»:{«businessAddress.city»:{«query»:[«NY»],»analyzer»:»custom_analyzer»}}}]}}}

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

4. привет @hkulekci нет elastica не выдает и не регистрирует никаких ошибок, она возвращает только 0 данных

5. @hkulekci я обновляю вопрос некоторыми изменениями, которые я выполняю из вашего комментария, к сожалению, не смотрю

Ответ №1:

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

Прежде всего, вам нужно обновить сопоставление, чтобы создать businessAddress тип a 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);
 

Надеюсь, это поможет

Комментарии:

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