Это не та вещь, которую легко сделать с Lucene. Возможно, вы захотите пересмотреть свой вариант использования, посмотрите, действительно ли полнотекстовый поиск - это путь.
У меня нет точного решения, чтобы дать вам, но фразеологические запросы выглядят довольно похоже на то, чего вы пытаетесь достичь.
Вы можете попробовать что-то вроде этого:
queryBuilder.simpleQueryString().onField("myField").matching("foo smth \"bar bar\"").createQuery();
Выше будет соответствовать два "бара", которые строго следуют друг за другом. Если вы хотите быть немного более мягким, вы можете установить помойку:
queryBuilder.simpleQueryString().onField("myField").matching("foo smth \"bar bar\"~2").createQuery();
Это будет соответствовать двум "полосам", которые следуют друг за другом ИЛИ разделены одним или двумя словами. Фактический смысл немного сложнее, но вы поняли идею. Вы можете найти точное определение помола в Javadoc org.apache.lucene.search.PhraseQuery#getSlop
.
Полагаю, использование очень высокого откоса позволит добиться более или менее того, что вы хотите, но это может плохо сказаться на производительности.