package querqy.lucene.contrib.parser;
import static querqy.QuerqyMatchers.bq;
import static querqy.QuerqyMatchers.dmq;
import static querqy.QuerqyMatchers.term;
import java.util.Collections;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.MockTokenizer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.core.TypeTokenFilter;
import org.apache.lucene.analysis.synonym.SynonymFilter;
import org.apache.lucene.analysis.synonym.SynonymMap;
import org.apache.lucene.util.CharsRef;
import org.apache.lucene.util.LuceneTestCase;
import org.junit.Before;
import org.junit.Test;
import querqy.lucene.contrib.parser.AnalyzingQuerqyParser;
import querqy.model.Query;
import querqy.parser.QuerqyParser;
/**
* Test for {@link AnalyzingQuerqyParser}.
*/
public class AnalyzingQuerqyParserTest extends LuceneTestCase {
/**
* Query analyzer. Just lower cases the input.
*/
private Analyzer queryAnalyzer;
/**
* Synonym analyzer. Just adds the synonyms "synonym1" and "synonym2" for
* "test".
*/
private Analyzer synonymAnalyzer;
@Before
public void createAnalyzers() throws Exception {
queryAnalyzer = new Analyzer() {
@Override
protected TokenStreamComponents createComponents(String fieldName) {
// White space tokenizer, to lower case tokenizer.
return new TokenStreamComponents(new MockTokenizer());
}
};
SynonymMap.Builder builder = new SynonymMap.Builder(true);
builder.add(new CharsRef("test"), new CharsRef("synonym1"), false);
builder.add(new CharsRef("test"), new CharsRef("synonym2"), false);
final SynonymMap synonyms = builder.build();
synonymAnalyzer = new Analyzer() {
@Override
protected TokenStreamComponents createComponents(String fieldName) {
// White space tokenizer, to lower case tokenizer.
MockTokenizer tokenizer = new MockTokenizer();
// Filter for adding synonyms
TokenStream result = new SynonymFilter(tokenizer, synonyms, true);
// Filter all non-synonyms, because the synonym filter outputs the
// original token too.
result = new TypeTokenFilter(result, Collections.singleton(SynonymFilter.TYPE_SYNONYM),
true);
return new TokenStreamComponents(tokenizer, result);
}
};
}
/**
* Test for {@link AnalyzingQuerqyParser#parse(String)} without synonyms.
*/
@Test
public void parse_withoutSynonyms() {
QuerqyParser parser = new AnalyzingQuerqyParser(queryAnalyzer, null);
Query query = parser.parse("test dummy");
assertThat(query, bq(dmq(term("test")), dmq(term("dummy"))));
}
/**
* Test for {@link AnalyzingQuerqyParser#parse(String)} with synonyms.
*/
@Test
public void parse_withSynonyms() {
QuerqyParser parser = new AnalyzingQuerqyParser(queryAnalyzer, synonymAnalyzer);
Query query = parser.parse("test dummy");
// "test" with its synonyms, "dummy" without synonyms, because none are
// defined for it.
assertThat(query, bq(dmq(term("test"), term("synonym1"), term("synonym2")), dmq(term("dummy"))));
}
}