diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2023-11-16 13:54:15 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-11-16 13:54:15 +0100 |
commit | 9dc1c4fd4e421663d34715ad045355746325745a (patch) | |
tree | 134ee1cfccdc97f6e0b57a2f7f059cc5f6b6408f | |
parent | c635dd4bbee09353915e81fbf2dfd82dfec45cef (diff) | |
parent | 6c0a9f6c372af76f6dcd07adae98f4051a87f7ad (diff) |
Merge pull request #29350 from vespa-engine/balder/handle-executeinfo-in-or
Balder/handle executeinfo in or
3 files changed, 34 insertions, 0 deletions
diff --git a/searchlib/src/tests/queryeval/blueprint/intermediate_blueprints_test.cpp b/searchlib/src/tests/queryeval/blueprint/intermediate_blueprints_test.cpp index a663944938c..db68625840c 100644 --- a/searchlib/src/tests/queryeval/blueprint/intermediate_blueprints_test.cpp +++ b/searchlib/src/tests/queryeval/blueprint/intermediate_blueprints_test.cpp @@ -133,6 +133,27 @@ TEST("test And propagates updated histestimate") { EXPECT_EQUAL(1.0f/(250*25), dynamic_cast<const RememberExecuteInfo &>(bp.getChild(2)).executeInfo.hitRate()); } +TEST("test Or propagates updated histestimate") { + OrBlueprint bp; + bp.setSourceId(2); + bp.addChild(ap(MyLeafSpec(5000).create<RememberExecuteInfo>()->setSourceId(2))); + bp.addChild(ap(MyLeafSpec(2000).create<RememberExecuteInfo>()->setSourceId(2))); + bp.addChild(ap(MyLeafSpec(800).create<RememberExecuteInfo>()->setSourceId(2))); + bp.addChild(ap(MyLeafSpec(20).create<RememberExecuteInfo>()->setSourceId(2))); + bp.optimize_self(); + bp.setDocIdLimit(5000); + bp.fetchPostings(ExecuteInfo::TRUE); + EXPECT_EQUAL(4u, bp.childCnt()); + for (uint32_t i = 0; i < bp.childCnt(); i++) { + const auto & child = dynamic_cast<const RememberExecuteInfo &>(bp.getChild(i)); + EXPECT_TRUE(child.executeInfo.isStrict()); + } + EXPECT_EQUAL(1.0f, dynamic_cast<const RememberExecuteInfo &>(bp.getChild(0)).executeInfo.hitRate()); + EXPECT_EQUAL(1.0f, dynamic_cast<const RememberExecuteInfo &>(bp.getChild(1)).executeInfo.hitRate()); + EXPECT_EQUAL(3.0f/5.0f, dynamic_cast<const RememberExecuteInfo &>(bp.getChild(2)).executeInfo.hitRate()); + EXPECT_EQUAL(3.0f*42.0f/(5.0f*50.0f), dynamic_cast<const RememberExecuteInfo &>(bp.getChild(3)).executeInfo.hitRate()); +} + TEST("test And Blueprint") { AndBlueprint b; { // combine diff --git a/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp b/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp index 6e0bc695fe3..95c1c05c8d0 100644 --- a/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp +++ b/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp @@ -263,6 +263,17 @@ AndBlueprint::computeNextHitRate(const Blueprint & child, double hitRate) const return hitRate * child.hit_ratio(); } +double +OrBlueprint::computeNextHitRate(const Blueprint & child, double hitRate) const { + // Avoid dropping hitRate to zero when meeting a conservatively high hitrate in a child. + // Happens at least when using non fast-search attributes, and with AND nodes. + constexpr double MIN_INVERSE_HIT_RATIO = 0.10; + double inverse_child_hit_ratio = 1.0 - child.hit_ratio(); + return (inverse_child_hit_ratio > MIN_INVERSE_HIT_RATIO) + ? hitRate * inverse_child_hit_ratio + : hitRate; +} + //----------------------------------------------------------------------------- OrBlueprint::~OrBlueprint() = default; diff --git a/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.h b/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.h index b8ca46f7549..02803877c19 100644 --- a/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.h +++ b/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.h @@ -74,6 +74,8 @@ public: bool strict, fef::MatchData &md) const override; SearchIterator::UP createFilterSearch(bool strict, FilterConstraint constraint) const override; +private: + double computeNextHitRate(const Blueprint & child, double hitRate) const override; }; //----------------------------------------------------------------------------- |