protected function _getTargetFields($isList = false) {
		$result = [];
		$targetModels = $this->_modelConfigSearchInfo->getTargetModels();
		$targetDeep = $this->_modelConfigSearchInfo->getTargetDeep();
		$cachePath = null;
		if (empty($targetModels)) {
			return $result;
		}

		$language = (string)Configure::read('Config.language');
		$dataStr = serialize($targetModels + compact('targetDeep', 'isList', 'language'));
		$cachePath = 'TargetFields.' . md5($dataStr);
		$cached = Cache::read($cachePath, CAKE_SEARCH_INFO_CACHE_KEY_QUERY_CFG);
		if (!empty($cached)) {
			return $cached;
		}

		foreach ($targetModels as $modelName => $modelConfig) {
			$modelObj = ClassRegistry::init($modelName, true);
			if ($modelObj === false) {
				continue;
			}

			if (empty($modelConfig) || !is_array($modelConfig)) {
				continue;
			}

			$modelLabel = (isset($modelConfig['name']) ? $modelConfig['name'] : $modelName);
			if ($targetDeep < 1) {
				if ($isList) {
					$result[] = $modelName;
				} else {
					$result[$modelLabel] = $modelName;
				}
			} else {
				if (!isset($modelConfig['fields']) || empty($modelConfig['fields'])) {
					continue;
				}

				foreach ($modelConfig['fields'] as $modelFieldName => $fieldLabel) {
					if (!$this->_checkFieldType($modelFieldName)) {
						continue;
					}

					if ($isList) {
						$result[] = $modelName . '.' . $modelFieldName;
					} else {
						$result[$modelLabel][$modelName . '.' . $modelFieldName] = $fieldLabel;
					}
				}
			}
		}
		if ($isList) {
			if (($targetDeep > 0) && !empty($result)) {
				$result = array_values(array_unique($result));
			}
		}
		Cache::write($cachePath, $result, CAKE_SEARCH_INFO_CACHE_KEY_QUERY_CFG);

		return $result;
	}