aboutsummaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorHåvard Pettersen <havardpe@yahooinc.com>2024-01-23 12:50:54 +0000
committerHåvard Pettersen <havardpe@yahooinc.com>2024-01-23 12:50:54 +0000
commit2d219dd6fb9b6dd2602a99b19c32da96aa81d0fc (patch)
treec9f6d82211375729551634a9e3874fe81ae48fa3 /searchlib
parent056a486a55fd66c39b9b30065865d29655f338f7 (diff)
only allow matching fields searched by all children
this is needed since we now optimize children of near/onear which might lead to dropping non-matcing children of OR (when searching multiple fields at once).
Diffstat (limited to 'searchlib')
-rw-r--r--searchlib/src/tests/nearsearch/nearsearch_test.cpp7
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/nearsearch.cpp18
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