diff options
author | Geir Storli <geirst@yahooinc.com> | 2022-07-08 13:14:25 +0000 |
---|---|---|
committer | Geir Storli <geirst@yahooinc.com> | 2022-07-08 13:14:25 +0000 |
commit | 500035b80ff1176d2e43cb7211a9f3b879da5d20 (patch) | |
tree | 88d8b6d3b7308d32531aa42f921199c9643ac7b2 | |
parent | 2a601ec4acee4ef3bdd9dece2d098b004d9420b3 (diff) |
Calculate distance raw score lazily in rank feature if not calculated during matching.
3 files changed, 14 insertions, 0 deletions
diff --git a/searchlib/src/vespa/searchlib/features/closenessfeature.cpp b/searchlib/src/vespa/searchlib/features/closenessfeature.cpp index dfeeebf3584..e44c94dbb2d 100644 --- a/searchlib/src/vespa/searchlib/features/closenessfeature.cpp +++ b/searchlib/src/vespa/searchlib/features/closenessfeature.cpp @@ -5,6 +5,7 @@ #include "utils.h" #include <vespa/searchcommon/common/schema.h> #include <vespa/searchlib/fef/properties.h> +#include <vespa/searchlib/tensor/distance_calculator.h> #include <vespa/vespalib/util/stash.h> #include <vespa/log/log.h> @@ -50,6 +51,9 @@ ConvertRawScoreToCloseness::execute(uint32_t docId) if (tfmd->getDocId() == docId) { feature_t converted = tfmd->getRawScore(); max_closeness = std::max(max_closeness, converted); + } else if (elem.calc) { + feature_t converted = elem.calc->calc_raw_score(docId); + max_closeness = std::max(max_closeness, converted); } } outputs().set_number(0, max_closeness); diff --git a/searchlib/src/vespa/searchlib/features/distancefeature.cpp b/searchlib/src/vespa/searchlib/features/distancefeature.cpp index 260d78cf7a1..6add65054ac 100644 --- a/searchlib/src/vespa/searchlib/features/distancefeature.cpp +++ b/searchlib/src/vespa/searchlib/features/distancefeature.cpp @@ -7,6 +7,7 @@ #include <vespa/searchcommon/common/schema.h> #include <vespa/searchlib/common/geo_location_spec.h> #include <vespa/searchlib/fef/matchdata.h> +#include <vespa/searchlib/tensor/distance_calculator.h> #include <vespa/vespalib/geo/zcurve.h> #include <vespa/vespalib/util/issue.h> #include <vespa/vespalib/util/stash.h> @@ -59,6 +60,10 @@ ConvertRawscoreToDistance::execute(uint32_t docId) feature_t invdist = tfmd->getRawScore(); feature_t converted = (1.0 / invdist) - 1.0; min_distance = std::min(min_distance, converted); + } else if (elem.calc) { + feature_t invdist = elem.calc->calc_raw_score(docId); + feature_t converted = (1.0 / invdist) - 1.0; + min_distance = std::min(min_distance, converted); } } outputs().set_number(0, min_distance); diff --git a/searchlib/src/vespa/searchlib/tensor/distance_calculator.h b/searchlib/src/vespa/searchlib/tensor/distance_calculator.h index 1bd9586a2bb..3ef41906b92 100644 --- a/searchlib/src/vespa/searchlib/tensor/distance_calculator.h +++ b/searchlib/src/vespa/searchlib/tensor/distance_calculator.h @@ -42,6 +42,11 @@ public: const vespalib::eval::Value& query_tensor() const { return *_query_tensor; } const DistanceFunction& function() const { return *_dist_fun; } + double calc_raw_score(uint32_t docid) const { + double distance = _dist_fun->calc(_query_tensor_cells, _attr_tensor.extract_cells_ref(docid)); + return _dist_fun->to_rawscore(distance); + } + double calc_with_limit(uint32_t docid, double limit) const { return _dist_fun->calc_with_limit(_query_tensor_cells, _attr_tensor.extract_cells_ref(docid), limit); } |