Лес условий, нехороший запрос..

$pdo->manticore("SELECT * FROM `indextags` 
				".($_JSON['id'] || $_JSON['tags']  ? " WHERE " : NULL)."   
				".($_JSON['tags'] ? "MATCH('@title \"".preg_replace('/[^\p{L}\p{N}\s]/u', '', urldecode($_JSON['tags']))."\"/0.1 | @field all')" : NULL)." 
				".($_JSON['id'] && $_JSON['tags']  ? " AND " : NULL)." 
				".($_JSON['id'] ? " `id` NOT IN (".implode(',', $_JSON['id']).")" : NULL)." LIMIT 10 OPTION ranker=proximity_bm25"
			)->fetchAll(PDO::FETCH_NUM)

Пример моего запроса, смело в коллекцию говнокода можно отправлять.

В целом логика:
id - пусто
tags - пусто
Достаем записи с лимитом в 10

id - 1,2,3
Достаем записи, исключая данные id тегов

id - 1,2,3
tags - ‘кошка’
Исключаем 1,2,3, ищем совпадение по ‘кошка’ и добавляем записи по @field all до заданного лимита

Возможно все это выполнить, за счет строки sql, не вылезая из нее в условия внешнего языка?

Думаю, что нет. Там есть функция IF(), но она не работает так, чтоб или искать по “кошка” или не искать или чтоб возвращать какие-то поля или не возвращать.