1 package org.wikimedia.search.extra.levenshtein; 2 3 import java.io.IOException; 4 import java.util.Arrays; 5 import java.util.Collection; 6 7 import org.apache.lucene.search.Query; 8 import org.elasticsearch.common.compress.CompressedXContent; 9 import org.elasticsearch.common.lucene.search.function.FunctionScoreQuery; 10 import org.elasticsearch.common.lucene.search.function.ScoreFunction; 11 import org.elasticsearch.index.mapper.MapperService; 12 import org.elasticsearch.index.query.QueryBuilders; 13 import org.elasticsearch.index.query.QueryShardContext; 14 import org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder; 15 import org.elasticsearch.plugins.Plugin; 16 import org.elasticsearch.test.AbstractQueryTestCase; 17 import org.elasticsearch.test.TestGeoShapeFieldMapperPlugin; 18 import org.hamcrest.CoreMatchers; 19 import org.wikimedia.search.extra.ExtraCorePlugin; 20 21 public class LevenshteinDistanceScoreESTest extends AbstractQueryTestCase<FunctionScoreQueryBuilder> { 22 private boolean hasMissing; 23 24 private static final String MY_FIELD = "my_test_field"; 25 26 @Override 27 protected void initializeAdditionalMappings(MapperService mapperService) throws IOException { 28 mapperService.merge("_doc", 29 new CompressedXContent("{\"properties\":{\"" + MY_FIELD + "\":{\"type\":\"text\" }}}"), 30 MapperService.MergeReason.MAPPING_UPDATE); 31 } 32 33 @Override 34 protected Collection<Class<? extends Plugin>> getPlugins() { 35 return Arrays.asList(ExtraCorePlugin.class, TestGeoShapeFieldMapperPlugin.class); 36 } 37 38 @Override 39 protected FunctionScoreQueryBuilder doCreateTestQueryBuilder() { 40 LevenshteinDistanceScoreBuilder scoreBuilder = new LevenshteinDistanceScoreBuilder(MY_FIELD, "text value"); 41 this.hasMissing = randomBoolean(); 42 if (this.hasMissing) { 43 scoreBuilder.missing("missing value"); 44 } 45 return QueryBuilders.functionScoreQuery(scoreBuilder); 46 } 47 48 @Override 49 protected void doAssertLuceneQuery(FunctionScoreQueryBuilder queryBuilder, Query query, QueryShardContext context) throws IOException { 50 assertThat(query, CoreMatchers.instanceOf(FunctionScoreQuery.class)); 51 FunctionScoreQuery fquery = (FunctionScoreQuery) query; 52 assertEquals(1, fquery.getFunctions().length); 53 ScoreFunction function = fquery.getFunctions()[0]; 54 assertThat(function, CoreMatchers.instanceOf(LevenshteinDistanceScore.class)); 55 LevenshteinDistanceScore lfunction = (LevenshteinDistanceScore) function; 56 assertEquals(MY_FIELD, lfunction.getFieldType().name()); 57 assertEquals("text value", lfunction.getValue()); 58 assertEquals(this.hasMissing ? "missing value" : null, lfunction.getMissing()); 59 } 60 }