diff options
author | Tor Egge <Tor.Egge@online.no> | 2023-04-26 15:44:12 +0200 |
---|---|---|
committer | Tor Egge <Tor.Egge@online.no> | 2023-04-26 15:53:51 +0200 |
commit | 9792400f4465d839de3987c70f0cc88cd74fdf49 (patch) | |
tree | 742e09b0a68446f0a7634a00227bd0f0703b1c98 /streamingvisitors | |
parent | c4dacaddf9bd2aff43db43180b389488be7b9fc0 (diff) |
Consolidate feature extraction between indexed and streaming search.
Diffstat (limited to 'streamingvisitors')
-rw-r--r-- | streamingvisitors/src/vespa/searchvisitor/hitcollector.cpp | 35 |
1 files changed, 7 insertions, 28 deletions
diff --git a/streamingvisitors/src/vespa/searchvisitor/hitcollector.cpp b/streamingvisitors/src/vespa/searchvisitor/hitcollector.cpp index 7b4e3cb0208..362d5a26611 100644 --- a/streamingvisitors/src/vespa/searchvisitor/hitcollector.cpp +++ b/streamingvisitors/src/vespa/searchvisitor/hitcollector.cpp @@ -2,6 +2,7 @@ #include "hitcollector.h" #include <vespa/searchlib/fef/feature_resolver.h> +#include <vespa/searchlib/fef/utils.h> #include <vespa/vespalib/util/stringfmt.h> #include <algorithm> #include <vespa/eval/eval/value_codec.h> @@ -14,6 +15,8 @@ using search::fef::MatchData; using vespalib::FeatureSet; using vdslib::SearchResult; +using FefUtils = search::fef::Utils; + namespace streaming { HitCollector::Hit::Hit(const vsm::StorageDocument * doc, uint32_t docId, const search::fef::MatchData & matchData, @@ -147,40 +150,16 @@ HitCollector::getFeatureSet(IRankProgram &rankProgram, const search::StringStringMap &feature_rename_map) { if (resolver.num_features() == 0 || _hits.empty()) { - return FeatureSet::SP(new FeatureSet()); + return std::make_shared<FeatureSet>(); } sortByDocId(); - std::vector<vespalib::string> names; - names.reserve(resolver.num_features()); - for (size_t i = 0; i < resolver.num_features(); ++i) { - vespalib::string name = resolver.name_of(i); - auto iter = feature_rename_map.find(name); - if (iter != feature_rename_map.end()) { - name = iter->second; - } - names.emplace_back(name); - } - FeatureSet::SP retval = FeatureSet::SP(new FeatureSet(names, _hits.size())); + auto names = FefUtils::extract_feature_names(resolver, feature_rename_map); + FeatureSet::SP retval = std::make_shared<FeatureSet>(names, _hits.size()); for (const Hit & hit : _hits) { rankProgram.run(hit.getDocId(), hit.getMatchData()); uint32_t docId = hit.getDocId(); auto * f = retval->getFeaturesByIndex(retval->addDocId(docId)); - for (uint32_t j = 0; j < names.size(); ++j) { - if (resolver.is_object(j)) { - auto obj = resolver.resolve(j).as_object(docId); - if (! obj.get().type().is_double()) { - vespalib::nbostream buf; - encode_value(obj.get(), buf); - f[j].set_data(vespalib::Memory(buf.peek(), buf.size())); - } else { - f[j].set_double(obj.get().as_double()); - } - } else { - f[j].set_double(resolver.resolve(j).as_number(docId)); - } - LOG(debug, "getFeatureSet: lDocId(%u), '%s': %f %s", docId, names[j].c_str(), f[j].as_double(), - f[j].is_data() ? "[tensor]" : ""); - } + FefUtils::extract_feature_values(resolver, docId, f); } return retval; } |