Есть две проблемы с кодом (и они не имеют никакого отношения к вашей версии Lucene):
1) StandardAnalyzer не индексирует стоп-слова (например, «in»), поэтому PhraseQuery никогда не сможет найти фразу «Lucene in»
2) как уже упоминалось Xodarap и Shashikant Kore, ваш призыв к созданию документа должен включать Index.ANALYZED, в противном случае Lucene не использует Analyzer в этом разделе документа. Вероятно, есть отличный способ сделать это с помощью Index.NOT_ANALYZED, но я не знаком с этим.
Для удобного исправления измените метод addDoc на:
public static void addDoc(IndexWriter w, String value)throws IOException{
Document doc = new Document();
doc.add(new Field("content", value, Field.Store.YES, Field.Index.ANALYZED));
w.addDocument(doc);
}
и измените свое создание PhraseQuery на:
PhraseQuery pq = new PhraseQuery();
pq.add(new Term("content", "computer"),0);
pq.add(new Term("content", "science"),1);
pq.setSlop(0);
Это даст вам результат ниже, так как "компьютер" и "наука" не являются стоп-словами:
Found 1 hits.
1.The Art of Computer Science
Если вы хотите найти «Lucene in Action», вы можете увеличить отставание этого PhraseQuery (увеличивая «разрыв» между двумя словами):
PhraseQuery pq = new PhraseQuery();
pq.add(new Term("content", "lucene"),0);
pq.add(new Term("content", "action"),1);
pq.setSlop(1);
Если вы действительно хотите найти предложение «lucene in», вам нужно будет выбрать другой анализатор (например, SimpleAnalyzer ). В Lucene 2.9 просто замените ваш вызов на StandardAnalyzer на:
SimpleAnalyzer analyzer = new SimpleAnalyzer();
Или, если вы используете версию 3.1 или выше, вам нужно добавить информацию о версии:
SimpleAnalyzer analyzer = new SimpleAnalyzer(Version.LUCENE_35);
Вот полезный пост по аналогичной проблеме (это поможет вам начать работу с PhraseQuery):
Точный поиск по фразе с использованием Lucene? - см. Ответ WhiteFang34.