From 9792400f4465d839de3987c70f0cc88cd74fdf49 Mon Sep 17 00:00:00 2001 From: Tor Egge Date: Wed, 26 Apr 2023 15:44:12 +0200 Subject: Consolidate feature extraction between indexed and streaming search. --- searchlib/src/vespa/searchlib/fef/utils.cpp | 38 +++++++++++++++++++++++++++++ searchlib/src/vespa/searchlib/fef/utils.h | 13 ++++++++++ 2 files changed, 51 insertions(+) (limited to 'searchlib') 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 #include #include +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 +Utils::extract_feature_names(const FeatureResolver& resolver, const StringStringMap& renames) +{ + std::vector 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 +#include #include +#include #include namespace search::fef { +class FeatureResolver; class RankProgram; struct Utils @@ -32,6 +35,16 @@ struct Utils **/ static std::map getAllFeatures(const RankProgram &rankProgram, uint32_t docid); + /* + * Extract features names for the given feature resolver. + */ + std::vector + 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); }; } -- cgit v1.2.3