aboutsummaryrefslogtreecommitdiffstats
path: root/streamingvisitors/src/vespa/searchvisitor/rankprocessor.cpp
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@online.no>2024-02-05 13:42:12 +0100
committerTor Egge <Tor.Egge@online.no>2024-02-05 13:42:12 +0100
commitc490ded9e1d40b68b2b167896d754459e5d9d7de (patch)
treef5e888483539d4a4298177c8d2e06f261878a6cb /streamingvisitors/src/vespa/searchvisitor/rankprocessor.cpp
parentd45399e3ab1d07781f71473e4a8fe2b67b197941 (diff)
Add unpack_match_data member function to search::streaming::QueryTerm.
Diffstat (limited to 'streamingvisitors/src/vespa/searchvisitor/rankprocessor.cpp')
-rw-r--r--streamingvisitors/src/vespa/searchvisitor/rankprocessor.cpp71
1 files changed, 4 insertions, 67 deletions
diff --git a/streamingvisitors/src/vespa/searchvisitor/rankprocessor.cpp b/streamingvisitors/src/vespa/searchvisitor/rankprocessor.cpp
index 96e8ca89a04..09699f79427 100644
--- a/streamingvisitors/src/vespa/searchvisitor/rankprocessor.cpp
+++ b/streamingvisitors/src/vespa/searchvisitor/rankprocessor.cpp
@@ -53,11 +53,6 @@ getFeature(const RankProgram &rankProgram) {
return resolver.resolve(0);
}
-uint16_t
-cap_16_bits(uint32_t value) {
- return std::min(value, static_cast<uint32_t>(std::numeric_limits<uint16_t>::max()));
-}
-
}
void
@@ -285,68 +280,10 @@ RankProcessor::unpack_match_data(uint32_t docid, MatchData &matchData, QueryWrap
QueryTermData & qtd = static_cast<QueryTermData &>(term.getTerm()->getQueryItem());
const ITermData &td = qtd.getTermData();
- HitList list;
- const HitList & hitList = isPhrase
- ? term.getParent()->evaluateHits(list)
- : term.getTerm()->evaluateHits(list);
-
- if (hitList.size() > 0) { // only unpack if we have a hit
- LOG(debug, "Unpack match data for query term '%s:%s' (%s)",
- term.getTerm()->index().c_str(), term.getTerm()->getTerm(), isPhrase ? "phrase" : "term");
-
- uint32_t lastFieldId = -1;
- TermFieldMatchData *tmd = nullptr;
- uint32_t fieldLen = search::fef::FieldPositionsIterator::UNKNOWN_LENGTH;
- uint32_t num_occs = 0;
-
- // optimize for hitlist giving all hits for a single field in one chunk
- for (const Hit & hit : hitList) {
- uint32_t fieldId = hit.field_id();
- if (fieldId != lastFieldId) {
- // reset to notfound/unknown values
- tmd = nullptr;
- fieldLen = search::fef::FieldPositionsIterator::UNKNOWN_LENGTH;
- num_occs = 0;
-
- // setup for new field that had a hit
- const ITermFieldData *tfd = td.lookupField(fieldId);
- if (tfd != nullptr) {
- tmd = matchData.resolveTermField(tfd->getHandle());
- tmd->setFieldId(fieldId);
- // reset field match data, but only once per docId
- if (tmd->getDocId() != docid) {
- tmd->reset(docid);
- }
- }
- // find fieldLen for new field
- if (isPhrase) {
- if (fieldId < term.getParent()->getFieldInfoSize()) {
- auto& field_info = term.getParent()->getFieldInfo(fieldId);
- fieldLen = field_info.getFieldLength();
- num_occs = field_info.getHitCount();
- }
- } else {
- if (fieldId < term.getTerm()->getFieldInfoSize()) {
- auto& field_info = term.getTerm()->getFieldInfo(fieldId);
- fieldLen = field_info.getFieldLength();
- num_occs = field_info.getHitCount();
- }
- }
- lastFieldId = fieldId;
- }
- if (tmd != nullptr) {
- // adjust so that the position for phrase terms equals the match for the first term
- TermFieldMatchDataPosition pos(hit.element_id(), hit.position() - term.getPosAdjust(),
- hit.element_weight(), hit.element_length());
- tmd->appendPosition(pos);
- LOG(debug, "Append elemId(%u),position(%u), weight(%d), tfmd.weight(%d)",
- pos.getElementId(), pos.getPosition(), pos.getElementWeight(), tmd->getWeight());
- if (tmd->needs_interleaved_features()) {
- tmd->setFieldLength(cap_16_bits(fieldLen));
- tmd->setNumOccs(cap_16_bits(num_occs));
- }
- }
- }
+ if (isPhrase) {
+ term.getParent()->unpack_match_data(docid, td, matchData);
+ } else {
+ term.getTerm()->unpack_match_data(docid, td, matchData);
}
}
}