summaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorGeir Storli <geirst@yahooinc.com>2022-07-08 13:14:25 +0000
committerGeir Storli <geirst@yahooinc.com>2022-07-08 13:14:25 +0000
commit500035b80ff1176d2e43cb7211a9f3b879da5d20 (patch)
tree88d8b6d3b7308d32531aa42f921199c9643ac7b2 /searchlib
parent2a601ec4acee4ef3bdd9dece2d098b004d9420b3 (diff)
Calculate distance raw score lazily in rank feature if not calculated during matching.
Diffstat (limited to 'searchlib')
-rw-r--r--searchlib/src/vespa/searchlib/features/closenessfeature.cpp4
-rw-r--r--searchlib/src/vespa/searchlib/features/distancefeature.cpp5
-rw-r--r--searchlib/src/vespa/searchlib/tensor/distance_calculator.h5
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);
}