Спасибо, Никита! Да, это была ошибка копирования-вставки, хотя правильная версия все равно дает правильные результаты.
Ваша ссылка на AnalyzerUtils очень помогла, так как я смог использовать следующий код для генерации Shingles:
ShingleAnalyzerWrapper shingleAnalyzer = new ShingleAnalyzerWrapper(4);
shingleAnalyzer.setOutputUnigrams(false);
TokenStream stream = shingleAnalyzer.tokenStream("contents", new StringReader("red dress shoes with black laces"));
ArrayList tokenList = new ArrayList();
while (true) {
Token token = null;
try {
token = stream.next();
} catch (IOException e) {
e.printStackTrace();
}
if (token == null) break;
tokenList.add(token);
}
Который производит:
[(red dress,0,9,type=shingle), (red dress shoes,0,15,type=shingle,posIncr=0), (red dress shoes black,0,26,type=shingle,posIncr=0), (dress shoes,4,15,type=shingle), (dress shoes black,4,26,type=shingle,posIncr=0), (dress shoes black laces,4,32,type=shingle,posIncr=0), (shoes black,10,26,type=shingle), (shoes black laces,10,32,type=shingle,posIncr=0), (black laces,21,32,type=shingle)]
Проблема была не в самом ShingleAnalyzerWrapper, а в QueryParser. Мне нужно еще немного покопаться, чтобы выяснить, что является основной причиной, но вы дали мне кое-что, с чего начать.