Поиск по необязательным полям с помощью exist


(Дмитрий) #1

Здравствуйте! Запутался в запросе, прошу помощи.
Есть несколько полей, по которым ищем. Одно поле обязательное для всех нод - targetStatus, в нем хранится статус. Другие поля могут быть в нодах, а могут просто отсутствовать (targetCategories - массив с категориями, targetGoodType - число). Нужно отфильтровать по статусу плюс по каждому необязательному полю по такой схеме для необязательных: этого поля либо вообще может не быть в ноде и это будет удовлетворять выборке, либо поле должно быть и должно удовлетворять заданным условиям. Примерно так, но это не работает:

$this->_paramsForSearch = [
			'index' => $this->_index,
			'type' => $this->_type,
			'body' => [
				'size' => $this->_size,
				'sort' =>  $this->_getSort(),
				'query' => [
					'bool' => [
						'must' => [
							['term' => [
								'targetStatus' => Target::STATUS_STARTED
							]],
							'bool' => [
								'should' => [
									[
										['terms' => [
											'targetCategories' => $this->_categories
										]],
										['must_not' => [
											'exists' => [
												'field' => 'targetCategories'
											]
										]],
										'minimum_should_match' => 1
									],
									[
										['term' => [
											'targetGoodType' => $this->_goodType
										]],
										['must_not' => [
											'exists' => [
												'field' => 'targetGoodType'
											]
										]],
										'minimum_should_match' => 1
									],
									'minimum_should_match' => 2
								]
							]
						]
					]
				]
			]
		];

Раньше если у ноды эти необязательные поля были пустыми, то они были, но там было либо 0 либо пустой массив. Сейчас если поле пустое, вообще не добавляю это поле в эластик. Думал через exist решу, но тоже не получилось


(Дмитрий) #3

Решено, прошу прощения что поспешил