summaryrefslogtreecommitdiffstats
path: root/searchlib
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 /searchlib
parentc4dacaddf9bd2aff43db43180b389488be7b9fc0 (diff)
Consolidate feature extraction between indexed and streaming search.
Diffstat (limited to 'searchlib')
-rw-r--r--searchlib/src/vespa/searchlib/fef/utils.cpp38
-rw-r--r--searchlib/src/vespa/searchlib/fef/utils.h13
2 files changed, 51 insertions, 0 deletions
diff --git a/searchlib/src/vespa/searchlib/fef/utils.cpp b/searchlib/src/vespa/searchlib/fef/utils.cpp
index 5a3444a44ee..1eddee88d2b 100644
--- a/searchlib/src/vespa/searchlib/fef/utils.cpp
+++ b/searchlib/src/vespa/searchlib/fef/utils.cpp
@@ -2,9 +2,12 @@
#include "utils.h"
#include "rank_program.h"
+#include <vespa/eval/eval/value_codec.h>
#include <vector>
#include <cassert>
+using vespalib::FeatureSet;
+
namespace search::fef {
feature_t
@@ -56,4 +59,39 @@ Utils::getAllFeatures(const RankProgram &rankProgram, uint32_t docid)
return resolveFeatures(resolver, docid);
}
+std::vector<vespalib::string>
+Utils::extract_feature_names(const FeatureResolver& resolver, const StringStringMap& renames)
+{
+ std::vector<vespalib::string> result;
+ result.reserve(resolver.num_features());
+ for (size_t i = 0; i < resolver.num_features(); ++i) {
+ vespalib::string name = resolver.name_of(i);
+ auto iter = renames.find(name);
+ if (iter != renames.end()) {
+ name = iter->second;
+ }
+ result.emplace_back(name);
+ }
+ return result;
+}
+
+void
+Utils::extract_feature_values(const FeatureResolver& resolver, uint32_t docid, FeatureSet::Value* dst)
+{
+ for (uint32_t i = 0; i < resolver.num_features(); ++i) {
+ if (resolver.is_object(i)) {
+ auto obj = resolver.resolve(i).as_object(docid);
+ if (!obj.get().type().is_double()) {
+ vespalib::nbostream buf;
+ encode_value(obj.get(), buf);
+ dst[i].set_data(vespalib::Memory(buf.peek(), buf.size()));
+ } else {
+ dst[i].set_double(obj.get().as_double());
+ }
+ } else {
+ dst[i].set_double(resolver.resolve(i).as_number(docid));
+ }
+ }
+}
+
}
diff --git a/searchlib/src/vespa/searchlib/fef/utils.h b/searchlib/src/vespa/searchlib/fef/utils.h
index 0db2becde39..868f7ef42d7 100644
--- a/searchlib/src/vespa/searchlib/fef/utils.h
+++ b/searchlib/src/vespa/searchlib/fef/utils.h
@@ -3,11 +3,14 @@
#pragma once
#include <vespa/searchlib/common/feature.h>
+#include <vespa/searchlib/common/stringmap.h>
#include <vespa/eval/eval/value.h>
+#include <vespa/vespalib/util/featureset.h>
#include <map>
namespace search::fef {
+class FeatureResolver;
class RankProgram;
struct Utils
@@ -32,6 +35,16 @@ struct Utils
**/
static std::map<vespalib::string, feature_t> getAllFeatures(const RankProgram &rankProgram, uint32_t docid);
+ /*
+ * Extract features names for the given feature resolver.
+ */
+ std::vector<vespalib::string>
+ static extract_feature_names(const FeatureResolver& resolver, const search::StringStringMap& renames);
+
+ /*
+ * Extract feature values for the given feature resolver.
+ */
+ static void extract_feature_values(const FeatureResolver& resolver, uint32_t docid, vespalib::FeatureSet::Value* dst);
};
}