caio.co/de/cerberus

Introduce SearchPolicy.rewriteParsedSimilarityQuery

Works similarly to rewriteParsedFulltextQuery, but for similarity
queries.
Id
3839cf0472277f90dde22cadc98a1c9113a8e5a7
Author
Caio
Commit time
2019-04-30T16:10:18+02:00

Modified src/main/java/co/caio/cerberus/search/SearchPolicy.java

@@ -5,5 +5,7
public interface SearchPolicy {
Query rewriteParsedFulltextQuery(Query query);

+ Query rewriteParsedSimilarityQuery(Query query);
+
boolean shouldComputeFacets(int totalHits);
}

Modified src/main/java/co/caio/cerberus/search/SearcherImpl.java

@@ -66,7 +66,7
@Override
public SearchResult findSimilar(String recipeText, int maxResults) {
try {
- var query = moreLikeThis.like(FULL_RECIPE, new StringReader(recipeText));
+ var query = parseSimilarity(recipeText);
var result = indexSearcher.search(query, maxResults);

var builder = new SearchResult.Builder().totalHits(result.totalHits.value);
@@ -77,6 +77,14
}

return builder.build();
+ } catch (IOException wrapped) {
+ throw new SearcherException(wrapped);
+ }
+ }
+
+ Query parseSimilarity(String recipeText) {
+ try {
+ return moreLikeThis.like(FULL_RECIPE, new StringReader(recipeText));
} catch (IOException wrapped) {
throw new SearcherException(wrapped);
}

Modified src/main/java/co/caio/cerberus/search/SearcherWithPolicy.java

@@ -21,4 +21,10
var parsed = super.parseFulltext(fulltext);
return searchPolicy.rewriteParsedFulltextQuery(parsed);
}
+
+ @Override
+ Query parseSimilarity(String similarText) {
+ var parsed = super.parseSimilarity(similarText);
+ return searchPolicy.rewriteParsedSimilarityQuery(parsed);
+ }
}

Modified src/test/java/co/caio/cerberus/search/SearcherTest.java

@@ -380,15 +380,7
Util.getSampleRecipes()
.forEach(
testRecipe -> {
- var recipeText =
- String.join(
- "\n",
- List.of(
- testRecipe.name(),
- String.join("\n", testRecipe.ingredients()),
- String.join("\n", testRecipe.instructions())));
-
- var similar = searcher.findSimilar(recipeText, 10);
+ var similar = searcher.findSimilar(recipeText(testRecipe), 10);

assertTrue(similar.totalHits() > 0);

@@ -410,5 +402,36
// });
// }
});
+ }
+
+ String recipeText(Recipe testRecipe) {
+ return String.join(
+ "\n",
+ List.of(
+ testRecipe.name(),
+ String.join("\n", testRecipe.ingredients()),
+ String.join("\n", testRecipe.instructions())));
+ }
+
+ @Test
+ void rewriteParsedSimilarityQuery() {
+ var policyMock = mock(SearchPolicy.class);
+
+ given(policyMock.rewriteParsedSimilarityQuery(any())).willReturn(new MatchNoDocsQuery());
+
+ var searcherWithPolicy =
+ new Searcher.Builder()
+ .searchPolicy(policyMock)
+ .dataDirectory(Util.getTestDataDir())
+ .build();
+
+ var text = recipeText(Util.getSampleRecipes().skip(10).findFirst().get());
+
+ // Searching without policy should yield some results
+ assertTrue(searcher.findSimilar(text, 10).totalHits() > 0);
+
+ // But with a policy that rewrites it all to a MatchNoDocsQuery
+ // it should be zero
+ assertEquals(0, searcherWithPolicy.findSimilar(text, 10).totalHits());
}
}