aboutsummaryrefslogtreecommitdiffstats
path: root/streamingvisitors
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@online.no>2023-04-26 15:44:12 +0200
committerTor Egge <Tor.Egge@online.no>2023-04-26 15:53:51 +0200
commit9792400f4465d839de3987c70f0cc88cd74fdf49 (patch)
tree742e09b0a68446f0a7634a00227bd0f0703b1c98 /streamingvisitors
parentc4dacaddf9bd2aff43db43180b389488be7b9fc0 (diff)
Consolidate feature extraction between indexed and streaming search.
Diffstat (limited to 'streamingvisitors')
-rw-r--r--streamingvisitors/src/vespa/searchvisitor/hitcollector.cpp35
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;
}