summaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@broadpark.no>2020-05-27 17:52:37 +0200
committerGitHub <noreply@github.com>2020-05-27 17:52:37 +0200
commit5a628aa443a9b720ab483e669f558f6f0693bbb6 (patch)
treec5c064fe260dfe29cdaa1adce0a5a75f78fd8b68 /searchlib
parentd6715b90581ddd67b92c5cf85e06d11059e2f844 (diff)
parent41d59df8ad9287915e6de02b4671eec94b79c92a (diff)
Merge pull request #13390 from vespa-engine/toregge/setup-field-match-executor-shared-state-try-2
Setup field match executor shared state.
Diffstat (limited to 'searchlib')
-rw-r--r--searchlib/src/vespa/searchlib/features/fieldmatch/computer.cpp6
-rw-r--r--searchlib/src/vespa/searchlib/features/fieldmatch/computer.h2
-rw-r--r--searchlib/src/vespa/searchlib/features/fieldmatchfeature.cpp60
-rw-r--r--searchlib/src/vespa/searchlib/features/fieldmatchfeature.h1
4 files changed, 48 insertions, 21 deletions
diff --git a/searchlib/src/vespa/searchlib/features/fieldmatch/computer.cpp b/searchlib/src/vespa/searchlib/features/fieldmatch/computer.cpp
index 7c3c0c5d638..ab36f18bfa5 100644
--- a/searchlib/src/vespa/searchlib/features/fieldmatch/computer.cpp
+++ b/searchlib/src/vespa/searchlib/features/fieldmatch/computer.cpp
@@ -35,6 +35,10 @@ Computer::Computer(const ComputerSharedState& shared_state, const PhraseSplitter
_alternativeSegmentationsTried(0),
_cachedHits(_queryTerms.size())
{
+ for (const auto &qt : _queryTerms) {
+ // Record that we need normal term field match data
+ (void) qt.termData()->lookupField(_fieldId)->getHandle(MatchDataDetails::Normal);
+ }
// num query terms searching in this field + 1
_segments.reserve(getNumQueryTerms() + 1);
for (uint32_t i = 0; i < (getNumQueryTerms() + 1); ++i) {
@@ -42,6 +46,8 @@ Computer::Computer(const ComputerSharedState& shared_state, const PhraseSplitter
}
}
+Computer::~Computer() = default;
+
void
Computer::reset(uint32_t docId)
{
diff --git a/searchlib/src/vespa/searchlib/features/fieldmatch/computer.h b/searchlib/src/vespa/searchlib/features/fieldmatch/computer.h
index f684f42708a..e4dbde1248a 100644
--- a/searchlib/src/vespa/searchlib/features/fieldmatch/computer.h
+++ b/searchlib/src/vespa/searchlib/features/fieldmatch/computer.h
@@ -68,6 +68,8 @@ public:
*/
Computer(const ComputerSharedState& shared_state, const fef::PhraseSplitter& splitter);
+ ~Computer();
+
/**
* Resets this object according to the given document id
*
diff --git a/searchlib/src/vespa/searchlib/features/fieldmatchfeature.cpp b/searchlib/src/vespa/searchlib/features/fieldmatchfeature.cpp
index 9e4aa0d96ab..191df116012 100644
--- a/searchlib/src/vespa/searchlib/features/fieldmatchfeature.cpp
+++ b/searchlib/src/vespa/searchlib/features/fieldmatchfeature.cpp
@@ -18,37 +18,50 @@ using CollectionType = FieldInfo::CollectionType;
namespace search::features {
+class FieldMatchExecutorSharedState : public Anything {
+private:
+ PhraseSplitterQueryEnv _splitter_env;
+ fieldmatch::ComputerSharedState _cmp_shared_state;
+public:
+ FieldMatchExecutorSharedState(const fef::IQueryEnvironment& query_env,
+ const fef::FieldInfo& field,
+ const fieldmatch::Params& params);
+ ~FieldMatchExecutorSharedState() override;
+ const PhraseSplitterQueryEnv& get_phrase_splitter_query_env() const { return _splitter_env; }
+ const fieldmatch::ComputerSharedState &get_computer_shared_state() const { return _cmp_shared_state; }
+};
+
+FieldMatchExecutorSharedState::FieldMatchExecutorSharedState(const IQueryEnvironment& query_env,
+ const FieldInfo& field,
+ const fieldmatch::Params& params)
+ : Anything(),
+ _splitter_env(query_env, field.id()),
+ _cmp_shared_state(vespalib::make_string("fieldMatch(%s)", field.name().c_str()), _splitter_env, field, params)
+{
+}
+
+FieldMatchExecutorSharedState::~FieldMatchExecutorSharedState() = default;
+
/**
* Implements the executor for THE field match feature.
*/
class FieldMatchExecutor : public fef::FeatureExecutor {
private:
- PhraseSplitterQueryEnv _splitter_env;
fef::PhraseSplitter _splitter;
- const fef::FieldInfo & _field;
- fieldmatch::ComputerSharedState _cmp_shared_state;
fieldmatch::Computer _cmp;
void handle_bind_match_data(const fef::MatchData &md) override;
public:
- FieldMatchExecutor(const fef::IQueryEnvironment & queryEnv,
- const fef::FieldInfo & field,
- const fieldmatch::Params & params);
+ FieldMatchExecutor(const FieldMatchExecutorSharedState& shared_state);
void execute(uint32_t docId) override;
};
-FieldMatchExecutor::FieldMatchExecutor(const IQueryEnvironment & queryEnv,
- const FieldInfo & field,
- [[maybe_unused]] const fieldmatch::Params & params) :
- FeatureExecutor(),
- _splitter_env(queryEnv, field.id()),
- _splitter(_splitter_env),
- _field(field),
- _cmp_shared_state(vespalib::make_string("fieldMatch(%s)", _field.name().c_str()), _splitter_env, field, params),
- _cmp(_cmp_shared_state, _splitter)
+FieldMatchExecutor::FieldMatchExecutor(const FieldMatchExecutorSharedState& shared_state)
+ : FeatureExecutor(),
+ _splitter(shared_state.get_phrase_splitter_query_env()),
+ _cmp(shared_state.get_computer_shared_state(), _splitter)
{
- // empty
}
void
@@ -118,6 +131,7 @@ FieldMatchExecutor::handle_bind_match_data(const fef::MatchData &md)
FieldMatchBlueprint::FieldMatchBlueprint() :
Blueprint("fieldMatch"),
_field(nullptr),
+ _shared_state_key(),
_params()
{
}
@@ -189,6 +203,7 @@ FieldMatchBlueprint::setup(const IIndexEnvironment & env,
const ParameterList & params)
{
_field = params[0].asField();
+ _shared_state_key = "fef.fieldmatch." + _field->name();
const Properties & lst = env.getProperties();
Property obj;
@@ -326,14 +341,17 @@ FieldMatchBlueprint::setup(const IIndexEnvironment & env,
FeatureExecutor &
FieldMatchBlueprint::createExecutor(const IQueryEnvironment & env, vespalib::Stash &stash) const
{
- return stash.create<FieldMatchExecutor>(env, *_field, _params);
+ auto *shared_state = dynamic_cast<const FieldMatchExecutorSharedState *>(env.getObjectStore().get(_shared_state_key));
+ if (shared_state == nullptr) {
+ shared_state = &stash.create<FieldMatchExecutorSharedState>(env, *_field, _params);
+ }
+ return stash.create<FieldMatchExecutor>(*shared_state);
}
void FieldMatchBlueprint::prepareSharedState(const IQueryEnvironment &env, IObjectStore & store) const {
- (void) env;
- (void) store;
- //TODO WE need too extract the const and costly parts from PhraseSpiltter and Computer
- // and initialize it here for later reuse in the multiple search threads.
+ if (store.get(_shared_state_key) == nullptr) {
+ store.add(_shared_state_key, std::make_unique<FieldMatchExecutorSharedState>(env, *_field, _params));
+ }
}
}
diff --git a/searchlib/src/vespa/searchlib/features/fieldmatchfeature.h b/searchlib/src/vespa/searchlib/features/fieldmatchfeature.h
index 0e5f873005d..f203574e588 100644
--- a/searchlib/src/vespa/searchlib/features/fieldmatchfeature.h
+++ b/searchlib/src/vespa/searchlib/features/fieldmatchfeature.h
@@ -13,6 +13,7 @@ namespace search::features {
class FieldMatchBlueprint : public fef::Blueprint {
private:
const fef::FieldInfo * _field;
+ vespalib::string _shared_state_key;
fieldmatch::Params _params;
public: