Если я правильно понимаю, проблема в том, что вы возвращаете все результаты со совпадениями на fieldCity, независимо от того, есть ли у вас совпадение с fieldText или нет, и вы хотите, чтобы у всех результатов было хотя бы одно совпадение с fieldText.
То, что у вас сейчас есть, в основном: +city text1 text2 text3
. Единственный термин, необходимый для соответствия - город. Остальная часть срока будет влиять на счет, но не будет ограничивать набор результатов. Если вы хотите убедиться, что вы получили хотя бы одно совпадение fieldText, вы можете изменить запрос так, чтобы он выглядел так: +city +(text1 text2 text3)
:
BooleanQuery fieldTextSubQuery = new BooleanQuery.Builder()
.add(new WildcardQuery(new Term(fieldText, str), Occur.SHOULD)
.add(new FuzzyQuery(new Term(fieldText, strTemp), fuzzy), Occur.SHOULD)
.add(new FuzzyQuery(new Term(fieldText, mergedKeyword), fuzzy), Occur.SHOULD)
.build();
BooleanQuery finalQuery = new BooleanQuery.Builder()
.add(new FuzzyQuery(new Term(fieldCity, city), 0), Occur.FILTER)
.add(textSubQuery, Occur.MUST)
.build();