лучше использовать query_string и строку $text бить на токены перед этим, удаляя стоп-слова, составляя запрос вида word1 AND word2 AND word3 и так далее. Можно скопбинировать с match_phrase. Также непонятно какой у Вас маппинг, как происходит токенизация внутри эластика чтобы искать по основе слова (чтобы находил по запросу ВЕДРО варианты с разным окончанием, например ВЕДРА). Чтобы искать по точному совпадению если поле article имеет числовой вид или keyword то можно использовать term, если тип text то использовать match, при этом анализатор не должен изменять значение поля.