diff options
author | Jon Bratseth <bratseth@gmail.com> | 2024-06-13 21:26:52 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-06-13 21:26:52 +0200 |
commit | a1b180a2b921466fdea7518f3227e12532c20b49 (patch) | |
tree | bb488fb5b3292bef92fa94f85b3d740e1d6c7cde | |
parent | 330492ceac848f8db614e8a00c064a58a9f39c81 (diff) | |
parent | 9599da2303115a036dbd2635be470a25c131f165 (diff) |
Merge pull request #31560 from vespa-engine/balder/no-opportunism-if-single-term
Balder/no opportunism if single term
2 files changed, 15 insertions, 2 deletions
diff --git a/container-search/src/main/java/com/yahoo/search/searchers/OpportunisticWeakAndSearcher.java b/container-search/src/main/java/com/yahoo/search/searchers/OpportunisticWeakAndSearcher.java index 2995b9e830e..c56b161edeb 100644 --- a/container-search/src/main/java/com/yahoo/search/searchers/OpportunisticWeakAndSearcher.java +++ b/container-search/src/main/java/com/yahoo/search/searchers/OpportunisticWeakAndSearcher.java @@ -18,6 +18,9 @@ import com.yahoo.search.searchchain.Execution; /** * Will opportunistically replace the WeakAND with an AND as it is faster. * If enough hits are returned all is good and we return. If not we fall back to the original query. + * It is default off, and is enabled with weakAnd.opportunistic.and=true. + * It can be tuned with weakAnd.opportunistic.factor. Higher value than 1 might increase quality, lower value will + * improve performance. Default is 1.0. This factor is multiplied with the heap size of the wand(default 100) as target hits. * * @author baldersheim */ @@ -52,7 +55,9 @@ public class OpportunisticWeakAndSearcher extends Searcher { // returns targetHits for the first WeakAndItem found, -1 if none found. static int targetHits(Item item) { if (!(item instanceof CompositeItem compositeItem)) return -1; - if (item instanceof WeakAndItem weakAndItem) return weakAndItem.getN(); + if (item instanceof WeakAndItem weakAndItem) { + return (weakAndItem.getItemCount() >= 2) ? weakAndItem.getN() : -1; + } for (int i = 0; i < compositeItem.getItemCount(); i++) { int targetHits = targetHits(compositeItem.getItem(i)); if (targetHits >= 0) return targetHits; diff --git a/container-search/src/test/java/com/yahoo/search/searchers/OpportunisticWeakAndSearcherTestCase.java b/container-search/src/test/java/com/yahoo/search/searchers/OpportunisticWeakAndSearcherTestCase.java index c099cf437f8..f41c74a4b8e 100644 --- a/container-search/src/test/java/com/yahoo/search/searchers/OpportunisticWeakAndSearcherTestCase.java +++ b/container-search/src/test/java/com/yahoo/search/searchers/OpportunisticWeakAndSearcherTestCase.java @@ -6,6 +6,7 @@ import com.yahoo.prelude.query.AndItem; import com.yahoo.prelude.query.CompositeItem; import com.yahoo.prelude.query.Item; import com.yahoo.prelude.query.OrItem; +import com.yahoo.prelude.query.TrueItem; import com.yahoo.prelude.query.WeakAndItem; import com.yahoo.prelude.query.WordItem; import org.junit.jupiter.api.Test; @@ -22,10 +23,17 @@ public class OpportunisticWeakAndSearcherTestCase { return root; } + private static CompositeItem addItem(CompositeItem composite, Item item) { + composite.addItem(item); + return composite; + } + @Test public void requireThatWeakAndIsDetected() { assertEquals(-1, OpportunisticWeakAndSearcher.targetHits(new OrItem())); - assertEquals(33, OpportunisticWeakAndSearcher.targetHits(new WeakAndItem(33))); + assertEquals(-1, OpportunisticWeakAndSearcher.targetHits(new WeakAndItem(33))); + assertEquals(-1, OpportunisticWeakAndSearcher.targetHits(addItem(new WeakAndItem(33), new TrueItem()))); + assertEquals(33, OpportunisticWeakAndSearcher.targetHits(addItem(addItem(new WeakAndItem(33), new TrueItem()), new TrueItem()))); assertEquals(77, OpportunisticWeakAndSearcher.targetHits(buildQueryItem(new OrItem(), new WeakAndItem(77)))); assertEquals(77, OpportunisticWeakAndSearcher.targetHits(buildQueryItem(new AndItem(), new WeakAndItem(77)))); assertEquals(-1, OpportunisticWeakAndSearcher.targetHits(buildQueryItem(new OrItem(), new AndItem()))); |