aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@gmail.com>2024-06-13 21:26:52 +0200
committerGitHub <noreply@github.com>2024-06-13 21:26:52 +0200
commita1b180a2b921466fdea7518f3227e12532c20b49 (patch)
treebb488fb5b3292bef92fa94f85b3d740e1d6c7cde
parent330492ceac848f8db614e8a00c064a58a9f39c81 (diff)
parent9599da2303115a036dbd2635be470a25c131f165 (diff)
Merge pull request #31560 from vespa-engine/balder/no-opportunism-if-single-term
Balder/no opportunism if single term
-rw-r--r--container-search/src/main/java/com/yahoo/search/searchers/OpportunisticWeakAndSearcher.java7
-rw-r--r--container-search/src/test/java/com/yahoo/search/searchers/OpportunisticWeakAndSearcherTestCase.java10
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())));