package de.fhopf.lucenesolrtalk.lucene;
import com.google.common.base.Optional;
import de.fhopf.lucenesolrtalk.Result;
import de.fhopf.lucenesolrtalk.Talk;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.RAMDirectory;
import org.junit.Before;
import org.junit.Test;
import java.util.*;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertTrue;
import org.apache.lucene.queryparser.classic.ParseException;
public class SearcherTest {
private Indexer indexer;
private Searcher searcher;
@Before
public void initIndexerAndSearcher() {
Directory dir = new RAMDirectory();
indexer = new Indexer(dir);
searcher = new Searcher(dir);
}
@Test
public void searchAuthor() throws ParseException {
Talk talk1 = newAuthorTalk("Florian Hopf");
Talk talk2 = newAuthorTalk("Florian");
indexer.index(talk1, talk2);
List<Result> documents = searcher.search("speaker:Florian");
assertEquals(2, documents.size());
documents = searcher.search("speaker:\"Florian Hopf\"");
assertEquals(1, documents.size());
}
@Test
public void sortedByDate() throws ParseException {
Date now = new Date();
Calendar cal = GregorianCalendar.getInstance();
cal.roll(Calendar.DAY_OF_MONTH, -1);
Date yesterday = cal.getTime();
Talk yesterdayMoreRelevant = new Talk("", "Titel Treffer", new ArrayList<String>(), yesterday, "", new ArrayList<String>(), "");
Talk today = new Talk("", "Titel", new ArrayList<String>(), now, "", new ArrayList<String>(), "");
indexer.index(yesterdayMoreRelevant, today);
// sanity check
List<Result> result = searcher.search("Titel Treffer");
assertEquals(2, result.size());
assertEquals("Titel Treffer", result.get(0).getTitle());
// sort
result = searcher.searchSortedByDate("Titel");
assertEquals(2, result.size());
assertEquals("Titel", result.get(0).getTitle());
}
@Test
public void searchWithHighlighter() throws ParseException {
StringBuilder content = new StringBuilder("Hier taucht das Wort auf ");
for (int i = 0; i < 10; i++) {
content.append(" und dazwischen ist ganz viel Text der das nicht enthält, ");
}
content.append("aber jetzt kommt das Wort nochmal.");
Talk talk = new Talk("", "", Collections.<String>emptyList(), new Date(), content.toString(), Collections.<String>emptyList(), "");
indexer.index(talk);
List<Result> result = searcher.search("Wort");
assertEquals(1, result.size());
assertTrue(result.get(0).getExcerpt(), result.get(0).getExcerpt().contains("<B>Wort</B>"));
assertTrue(result.get(0).getExcerpt(), result.get(0).getExcerpt().contains("..."));
}
@Test
public void phraseQueryOnStemmedTitle() throws ParseException {
Talk talk = new Talk("", "Verteiltes Suchen mit Elasticsearch", Collections.<String>emptyList(), new Date(), "", Collections.<String>emptyList(), "");
indexer.index(talk);
// phrase queries do match even though the terms are stemmed
List<Result> result = searcher.search("title:\"verteilte suche\"");
assertEquals(1, result.size());
}
private Talk newAuthorTalk(String author) {
return new Talk("", "", Arrays.asList(author), new Date(), "", new ArrayList<String>(), "");
}
private Talk newCategoryTalk(String... category) {
return new Talk("", "", new ArrayList<String>(), new Date(), "", Arrays.asList(category), "");
}
}