Попробуйте это:
Добавьте скрытое поле ввода в форму поиска, а также в сеанс пользователя. Когда форма будет опубликована, сопоставьте значение поля ввода с сеансом. При поиске спама это значение будет отсутствовать, поскольку у него не будет сеанса.
$hiddenvalue= md5(rand(0,1000));
//only fill session if we're not coming from a search action
if(count($_GET) == 0) {
$_SESSION["hidden"]= $hiddenvalue;
}
<input type="hidden" name="secret" value="$hiddenvalue">
Затем после GET:
if($_GET["secret"] == $_SESSION["hidden"]) {
//continue search
}