View Javadoc
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  }