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 /searchlib | |
parent | c4dacaddf9bd2aff43db43180b389488be7b9fc0 (diff) |
Consolidate feature extraction between indexed and streaming search.
Diffstat (limited to 'searchlib')
-rw-r--r-- | searchlib/src/vespa/searchlib/fef/utils.cpp | 38 | ||||
-rw-r--r-- | searchlib/src/vespa/searchlib/fef/utils.h | 13 |
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); }; } |