aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@oath.com>2018-05-08 10:37:00 +0200
committerHenning Baldersheim <balder@oath.com>2018-05-08 10:40:07 +0200
commitf47f0a86044148032f2a3b5e874ce6aa5aa5cc24 (patch)
tree58ae893e33e8269660a36de9792df9232dd8f7e7
parent166a0dc167b0fa87cd62d74b5b77ece472e68bce (diff)
Require termwise to be at the top.
-rw-r--r--searchcore/src/vespa/searchcore/proton/matching/match_phase_limit_calculator.h2
-rw-r--r--searchcore/src/vespa/searchcore/proton/matching/match_phase_limiter.cpp32
2 files changed, 19 insertions, 15 deletions
diff --git a/searchcore/src/vespa/searchcore/proton/matching/match_phase_limit_calculator.h b/searchcore/src/vespa/searchcore/proton/matching/match_phase_limit_calculator.h
index 2fe131e1d9e..806f135f433 100644
--- a/searchcore/src/vespa/searchcore/proton/matching/match_phase_limit_calculator.h
+++ b/searchcore/src/vespa/searchcore/proton/matching/match_phase_limit_calculator.h
@@ -43,6 +43,8 @@ public:
size_t max_group_size(size_t wanted_num_docs_in) const {
return (wanted_num_docs_in / _min_groups);
}
+
+ size_t max_hits() const { return _max_hits; }
};
}
diff --git a/searchcore/src/vespa/searchcore/proton/matching/match_phase_limiter.cpp b/searchcore/src/vespa/searchcore/proton/matching/match_phase_limiter.cpp
index 354cfb69f00..6b861d74d79 100644
--- a/searchcore/src/vespa/searchcore/proton/matching/match_phase_limiter.cpp
+++ b/searchcore/src/vespa/searchcore/proton/matching/match_phase_limiter.cpp
@@ -2,6 +2,8 @@
#include "match_phase_limiter.h"
#include <vespa/searchlib/queryeval/andsearchstrict.h>
+#include <vespa/searchlib/queryeval/andnotsearch.h>
+#include <vespa/searchlib/queryeval/ranksearch.h>
#include <vespa/log/log.h>
LOG_SETUP(".proton.matching.match_phase_limiter");
@@ -91,30 +93,28 @@ MatchPhaseLimiter::MatchPhaseLimiter(uint32_t docIdLimit,
namespace {
const search::BitVector *
-preFilterUnderAnd(const SearchIterator & search) {
+findPotentialPreFilter(const SearchIterator &search) {
const search::BitVector *filter = search.precomputedBitVector();
if (filter != nullptr) {
return filter;
}
- const search::queryeval::AndSearch * andSearch = dynamic_cast<const search::queryeval::AndSearch *>(&search);
- if (andSearch) {
- for (const SearchIterator * child : andSearch->getChildren()) {
- filter = preFilterUnderAnd(*child);
- if (filter != nullptr) {
- return filter;
- }
- }
+ const search::queryeval::MultiSearch * multiSearch = dynamic_cast<const search::queryeval::MultiSearch *>(&search);
+ if (multiSearch) {
+ if (multiSearch->isAndNot()) {
+ return findPotentialPreFilter(*static_cast<const search::queryeval::AndNotSearch *>(multiSearch)->positive());
+ } else if (multiSearch->isRank()) {
+ return findPotentialPreFilter(*static_cast<const search::queryeval::RankSearch *>(multiSearch)->mandatory());
}
+ }
- return filter;
+ return nullptr;
}
template <bool PRE_FILTER>
SearchIterator::UP
-do_limit(bool enablePreFilter, AttributeLimiter &limiter_factory, SearchIterator::UP search,
+do_limit(const search::BitVector * filter, AttributeLimiter &limiter_factory, SearchIterator::UP search,
size_t wanted_num_docs, size_t max_group_size, uint32_t current_id, uint32_t end_id)
{
- const search::BitVector * filter = enablePreFilter ? preFilterUnderAnd(*search) : nullptr;
SearchIterator::UP limiter = limiter_factory.create_search(filter, wanted_num_docs, max_group_size, PRE_FILTER);
limiter = search->andWith(std::move(limiter), wanted_num_docs);
if (limiter) {
@@ -130,7 +130,8 @@ SearchIterator::UP
MatchPhaseLimiter::maybe_limit(SearchIterator::UP search,
double match_freq, size_t num_docs)
{
- size_t wanted_num_docs = _calculator.wanted_num_docs(match_freq);
+ const search::BitVector * filter = _enablePreFilter ? findPotentialPreFilter(*search) : nullptr;
+ size_t wanted_num_docs = filter ? _calculator.max_hits() : _calculator.wanted_num_docs(match_freq);
size_t max_filter_docs = static_cast<size_t>(num_docs * _maxFilterCoverage);
size_t upper_limited_corpus_size = std::min(num_docs, max_filter_docs);
if (upper_limited_corpus_size <= wanted_num_docs) {
@@ -147,9 +148,10 @@ MatchPhaseLimiter::maybe_limit(SearchIterator::UP search,
" max_group_size=%zu, current_docid=%u, end_docid=%u, total_query_hits=%ld",
use_pre_filter ? "pre" : "post", match_freq, num_docs, max_filter_docs, wanted_num_docs,
max_group_size, current_id, end_id, total_query_hits);
+
return (use_pre_filter)
- ? do_limit<true>(_enablePreFilter, _limiter_factory, std::move(search), wanted_num_docs, max_group_size, current_id, end_id)
- : do_limit<false>(_enablePreFilter, _limiter_factory, std::move(search), wanted_num_docs, max_group_size, current_id, end_id);
+ ? do_limit<true>(filter, _limiter_factory, std::move(search), wanted_num_docs, max_group_size, current_id, end_id)
+ : do_limit<false>(filter, _limiter_factory, std::move(search), wanted_num_docs, max_group_size, current_id, end_id);
}
void