$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, не вылезая из нее в условия внешнего языка?