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
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
@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);
}
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
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
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);
// });
// }
});
+ }
+
+ 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());
}
}