diff options
author | tomglk <> | 2024-01-08 08:44:10 +0100 |
---|---|---|
committer | tomglk <> | 2024-01-08 08:44:10 +0100 |
commit | 154b1da4d31969fe05c53275fb3ac1c451b7fa9a (patch) | |
tree | 94bb7e08d42646c897db4a0bf2e8d73ae08c41e5 /container-search/src/test | |
parent | d33f2119651360228f52baa6c174d8f3e1e8bcb4 (diff) |
Keep hits from previous searches
Add hits to result instead of overwriting the result.
Nest loop over collapsefields inside loop over hits to consider all fieldvalues before adding a new hit.
And test for multi-field collapsing with multiple searches necessary.
Diffstat (limited to 'container-search/src/test')
-rw-r--r-- | container-search/src/test/java/com/yahoo/prelude/searcher/test/FieldCollapsingSearcherTestCase.java | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/container-search/src/test/java/com/yahoo/prelude/searcher/test/FieldCollapsingSearcherTestCase.java b/container-search/src/test/java/com/yahoo/prelude/searcher/test/FieldCollapsingSearcherTestCase.java index 4c34a2fdb4c..52a344f647e 100644 --- a/container-search/src/test/java/com/yahoo/prelude/searcher/test/FieldCollapsingSearcherTestCase.java +++ b/container-search/src/test/java/com/yahoo/prelude/searcher/test/FieldCollapsingSearcherTestCase.java @@ -407,6 +407,56 @@ public class FieldCollapsingSearcherTestCase { } /** + * Tests that collapsing on multiple fields works if we have to search multiple + * time to get enough hits + */ + @Test + void testCollapsingOnMoreFieldsWithManySimilarFieldValues() { + // Set up + Map<Searcher, Searcher> chained = new HashMap<>(); + FieldCollapsingSearcher collapse = new FieldCollapsingSearcher(4, 1.0); + DocumentSourceSearcher docsource = new DocumentSourceSearcher(); + chained.put(collapse, docsource); + + Query q = new Query("?query=test_collapse"); + // The searcher turns off collapsing further on in the chain + q.properties().set("collapse", "0"); + Result r = new Result(q); + r.hits().add(createHit("http://acme.org/a.html", 10, 0, 1, 1)); // first hit + r.hits().add(createHit("http://acme.org/b.html", 9, 0, 1, 2)); + r.hits().add(createHit("http://acme.org/c.html", 9, 0, 6, 2)); // - - 1. search: 1 + r.hits().add(createHit("http://acme.org/d.html", 8, 0, 6, 3)); + r.hits().add(createHit("http://acme.org/e.html", 8, 0, 6, 3)); + r.hits().add(createHit("http://acme.org/f.html", 7, 0, 6, 3)); // - - 1. search: 2 + r.hits().add(createHit("http://acme.org/g.html", 7, 0, 1, 1)); + r.hits().add(createHit("http://acme.org/h.html", 6, 1, 1, 1)); + r.hits().add(createHit("http://acme.org/i.html", 5, 2, 2, 1)); // - - 1. search: 3 + r.hits().add(createHit("http://acme.org/j.html", 4, 3, 3, 2)); // 3rd hit, cmid new + r.hits().add(createHit("http://acme.org/k.html", 4, 3, 4, 3)); + r.hits().add(createHit("http://acme.org/l.html", 4, 3, 5, 3)); // - - 1. search: 4 + r.hits().add(createHit("http://acme.org/m.html", 4, 4, 6, 3)); // 4th hit, amid new + r.hits().add(createHit("http://acme.org/n.html", 4, 4, 7, 4)); + r.setTotalHitCount(14); + docsource.addResult(q, r); + + // Test collapsing + q = new Query("?query=test_collapse&collapsesize=1&collapsefield=amid,bmid,cmid"); + r = doSearch(collapse, q, 0, 2, chained); + + assertEquals(2, r.getHitCount()); + assertEquals(4, docsource.getQueryCount()); + assertHit("http://acme.org/a.html", 10, 0, 1, 1, r.hits().get(0)); + assertHit("http://acme.org/j.html", 4, 3, 3, 2, r.hits().get(1)); + + // Next results + docsource.resetQueryCount(); + r = doSearch(collapse, q, 2, 2, chained); + assertEquals(1, r.getHitCount()); + assertEquals(3, docsource.getQueryCount()); + assertHit("http://acme.org/m.html", 4, 4, 6, 3, r.hits().get(0)); + } + + /** * Tests collapsing of "messy" data */ @Test @@ -650,6 +700,14 @@ public class FieldCollapsingSearcherTestCase { return hit; } + private FastHit createHit(String uri,int relevancy,int amid,int bmid,int cmid) { + FastHit hit = new FastHit(uri,relevancy); + hit.setField("amid", String.valueOf(amid)); + hit.setField("bmid", String.valueOf(bmid)); + hit.setField("cmid", String.valueOf(cmid)); + return hit; + } + private void assertHitWithoutFields(String uri,int relevancy,Hit hit) { assertEquals(uri,hit.getId().toString()); assertEquals(relevancy, ((int) hit.getRelevance().getScore())); @@ -673,6 +731,12 @@ public class FieldCollapsingSearcherTestCase { assertEquals(bmid,Integer.parseInt((String) hit.getField("bmid"))); } + private void assertHit(String uri,int relevancy,int amid,int bmid,int cmid,Hit hit) { + assertHitAmid(uri,relevancy,amid,hit); + assertHitBmid(uri,relevancy,bmid,hit); + assertEquals(cmid,Integer.parseInt((String) hit.getField("cmid"))); + } + private static class ZeroHitsControl extends com.yahoo.search.Searcher { public int queryCount = 0; |