Для справки, если кто-то еще сталкивался с этой проблемой, вот мое решение:
IList<string> ALL_TYPES = new[] { "article", "blog", "forum" };
string q = ...; // The user's search string
IList<string> includeTypes = ...; // List of types to include
Query searchQuery = parser.Parse(q);
Query parentQuery = new BooleanQuery();
parentQuery.Add(searchQuery, BooleanClause.Occur.SHOULD);
// Invert the logic, exclude the other types
foreach (var type in ALL_TYPES.Except(includeTypes))
{
query.Add(
new TermQuery(new Term("type", type)),
BooleanClause.Occur.MUST_NOT
);
}
searchQuery = parentQuery;
Я перевернул логику (то есть исключил типы, которые пользователь не выбрал), потому что, если вы этого не сделаете, упорядочение результатов будет потеряно. Я не уверен, почему, хотя ...! Это позор, поскольку он делает код менее понятным / поддерживаемым, но по крайней мере он работает!