diff options
-rw-r--r-- | searchlib/src/tests/nearsearch/nearsearch_test.cpp | 7 | ||||
-rw-r--r-- | searchlib/src/vespa/searchlib/queryeval/nearsearch.cpp | 18 |
2 files changed, 14 insertions, 11 deletions
diff --git a/searchlib/src/tests/nearsearch/nearsearch_test.cpp b/searchlib/src/tests/nearsearch/nearsearch_test.cpp index 3751fc93cea..95701e59444 100644 --- a/searchlib/src/tests/nearsearch/nearsearch_test.cpp +++ b/searchlib/src/tests/nearsearch/nearsearch_test.cpp @@ -215,7 +215,7 @@ bool Test::testNearSearch(MyQuery &query, uint32_t matchId) { LOG(info, "testNearSearch(%d)", matchId); - search::queryeval::IntermediateBlueprint *near_b = 0; + search::queryeval::IntermediateBlueprint *near_b = nullptr; if (query.isOrdered()) { near_b = new search::queryeval::ONearBlueprint(query.getWindow()); } else { @@ -228,9 +228,10 @@ Test::testNearSearch(MyQuery &query, uint32_t matchId) layout.allocTermField(fieldId); near_b->addChild(query.getTerm(i).make_blueprint(fieldId, i)); } - search::fef::MatchData::UP md(layout.createMatchData()); - + bp->setDocIdLimit(1000); + bp = search::queryeval::Blueprint::optimize_and_sort(std::move(bp), true, true); bp->fetchPostings(search::queryeval::ExecuteInfo::TRUE); + search::fef::MatchData::UP md(layout.createMatchData()); search::queryeval::SearchIterator::UP near = bp->createSearch(*md, true); near->initFullRange(); bool foundMatch = false; diff --git a/searchlib/src/vespa/searchlib/queryeval/nearsearch.cpp b/searchlib/src/vespa/searchlib/queryeval/nearsearch.cpp index 1f83075b9fc..8fc7733f279 100644 --- a/searchlib/src/vespa/searchlib/queryeval/nearsearch.cpp +++ b/searchlib/src/vespa/searchlib/queryeval/nearsearch.cpp @@ -3,7 +3,7 @@ #include <vespa/vespalib/objects/visit.h> #include <vespa/vespalib/util/priority_queue.h> #include <limits> -#include <set> +#include <map> #include <vespa/log/log.h> LOG_SETUP(".nearsearch"); @@ -16,13 +16,15 @@ using search::fef::TermFieldMatchDataArray; using search::fef::TermFieldMatchDataPositionKey; template<typename T> -void setup_fields(uint32_t window, std::vector<T> &matchers, const TermFieldMatchDataArray &in) { - std::set<uint32_t> fields; +void setup_fields(uint32_t window, std::vector<T> &matchers, const TermFieldMatchDataArray &in, uint32_t terms) { + std::map<uint32_t,uint32_t> fields; for (size_t i = 0; i < in.size(); ++i) { - fields.insert(in[i]->getFieldId()); + ++fields[in[i]->getFieldId()]; } - for (const auto& elem : fields) { - matchers.push_back(T(window, elem, in)); + for (auto [field, cnt]: fields) { + if (cnt == terms) { + matchers.push_back(T(window, field, in)); + } } } @@ -126,7 +128,7 @@ NearSearch::NearSearch(Children terms, : NearSearchBase(std::move(terms), data, window, strict), _matchers() { - setup_fields(window, _matchers, data); + setup_fields(window, _matchers, data, getChildren().size()); } namespace { @@ -227,7 +229,7 @@ ONearSearch::ONearSearch(Children terms, : NearSearchBase(std::move(terms), data, window, strict), _matchers() { - setup_fields(window, _matchers, data); + setup_fields(window, _matchers, data, getChildren().size()); } bool |