aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@online.no>2023-01-05 15:54:29 +0100
committerTor Egge <Tor.Egge@online.no>2023-01-05 15:54:29 +0100
commite529812763b6c4efe2b8dbd9b4b87f581d7bec7a (patch)
tree61322da69619c961200770437c6f39cec9afdf32
parent6cbf34743397d5039dcff4c19893401cfd471cd1 (diff)
Add interface class IKeywordExtractorFactory.
Move ownership of IKeywordExtractor to JuniperDFW.
-rw-r--r--searchcore/src/vespa/searchcore/proton/docsummary/summarymanager.cpp6
-rw-r--r--searchsummary/src/tests/docsummary/slime_summary/slime_summary_test.cpp3
-rw-r--r--searchsummary/src/vespa/searchsummary/docsummary/CMakeLists.txt1
-rw-r--r--searchsummary/src/vespa/searchsummary/docsummary/docsum_field_writer_factory.cpp5
-rw-r--r--searchsummary/src/vespa/searchsummary/docsummary/docsum_field_writer_factory.h4
-rw-r--r--searchsummary/src/vespa/searchsummary/docsummary/docsumstate.cpp1
-rw-r--r--searchsummary/src/vespa/searchsummary/docsummary/docsumstate.h2
-rw-r--r--searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.cpp6
-rw-r--r--searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.h5
-rw-r--r--searchsummary/src/vespa/searchsummary/docsummary/dynamicteaserdfw.cpp15
-rw-r--r--searchsummary/src/vespa/searchsummary/docsummary/i_keyword_extractor_factory.h24
-rw-r--r--searchsummary/src/vespa/searchsummary/docsummary/juniper_query_adapter.cpp2
-rw-r--r--searchsummary/src/vespa/searchsummary/docsummary/juniper_query_adapter.h4
-rw-r--r--searchsummary/src/vespa/searchsummary/docsummary/juniperdfw.h10
-rw-r--r--searchsummary/src/vespa/searchsummary/docsummary/legacy_keyword_extractor_factory.cpp21
-rw-r--r--searchsummary/src/vespa/searchsummary/docsummary/legacy_keyword_extractor_factory.h21
-rw-r--r--streamingvisitors/src/vespa/vsm/vsm/docsum_field_writer_factory.cpp5
-rw-r--r--streamingvisitors/src/vespa/vsm/vsm/docsum_field_writer_factory.h2
-rw-r--r--streamingvisitors/src/vespa/vsm/vsm/vsm-adapter.cpp21
19 files changed, 119 insertions, 39 deletions
diff --git a/searchcore/src/vespa/searchcore/proton/docsummary/summarymanager.cpp b/searchcore/src/vespa/searchcore/proton/docsummary/summarymanager.cpp
index ab0732d1fec..34ba0e70c25 100644
--- a/searchcore/src/vespa/searchcore/proton/docsummary/summarymanager.cpp
+++ b/searchcore/src/vespa/searchcore/proton/docsummary/summarymanager.cpp
@@ -11,6 +11,7 @@
#include <vespa/vespalib/util/lambdatask.h>
#include <vespa/searchsummary/docsummary/docsum_field_writer_factory.h>
#include <vespa/searchsummary/docsummary/i_keyword_extractor.h>
+#include <vespa/searchsummary/docsummary/legacy_keyword_extractor_factory.h>
#include <vespa/vespalib/util/exceptions.h>
#include <vespa/fastlib/text/normwordfolder.h>
#include <vespa/config-summary.h>
@@ -93,7 +94,8 @@ SummarySetup(const vespalib::string & baseDir, const SummaryConfig & summaryCfg,
{
_juniperConfig = std::make_unique<juniper::Juniper>(&_juniperProps, _wordFolder.get());
auto resultConfig = std::make_unique<ResultConfig>();
- auto docsum_field_writer_factory = std::make_unique<DocsumFieldWriterFactory>(summaryCfg.usev8geopositions, *this);
+ std::unique_ptr<IKeywordExtractorFactory> keyword_extractor_factory = std::make_unique<LegacyKeywordExtractorFactory>(std::shared_ptr<IKeywordExtractor>());
+ auto docsum_field_writer_factory = std::make_unique<DocsumFieldWriterFactory>(summaryCfg.usev8geopositions, *this, *keyword_extractor_factory);
if (!resultConfig->readConfig(summaryCfg, make_string("SummaryManager(%s)", baseDir.c_str()).c_str(),
*docsum_field_writer_factory)) {
std::ostringstream oss;
@@ -105,7 +107,7 @@ SummarySetup(const vespalib::string & baseDir, const SummaryConfig & summaryCfg,
}
docsum_field_writer_factory.reset();
- _docsumWriter = std::make_unique<DynamicDocsumWriter>(std::move(resultConfig), std::unique_ptr<IKeywordExtractor>());
+ _docsumWriter = std::make_unique<DynamicDocsumWriter>(std::move(resultConfig));
}
IDocsumStore::UP
diff --git a/searchsummary/src/tests/docsummary/slime_summary/slime_summary_test.cpp b/searchsummary/src/tests/docsummary/slime_summary/slime_summary_test.cpp
index 3240dd43c00..93f87d9c5be 100644
--- a/searchsummary/src/tests/docsummary/slime_summary/slime_summary_test.cpp
+++ b/searchsummary/src/tests/docsummary/slime_summary/slime_summary_test.cpp
@@ -15,7 +15,6 @@
#include <vespa/searchsummary/docsummary/docsum_store_document.h>
#include <vespa/searchsummary/docsummary/docsumstate.h>
#include <vespa/searchsummary/docsummary/docsumwriter.h>
-#include <vespa/searchsummary/docsummary/i_keyword_extractor.h>
#include <vespa/vespalib/data/slime/slime.h>
#include <vespa/vespalib/data/smart_buffer.h>
#include <vespa/vespalib/gtest/gtest.h>
@@ -117,7 +116,7 @@ SlimeSummaryTest::SlimeSummaryTest()
EXPECT_TRUE(cfg->addConfigEntry("longdata_field"));
EXPECT_TRUE(cfg->addConfigEntry("int_pair_field"));
config->set_default_result_class_id(0);
- writer = std::make_unique<DynamicDocsumWriter>(std::move(config), std::unique_ptr<IKeywordExtractor>());
+ writer = std::make_unique<DynamicDocsumWriter>(std::move(config));
int_pair_type.addField(Field("foo", *DataType::INT));
int_pair_type.addField(Field("bar", *DataType::INT));
doc_type.addField(Field("int_field", *DataType::INT));
diff --git a/searchsummary/src/vespa/searchsummary/docsummary/CMakeLists.txt b/searchsummary/src/vespa/searchsummary/docsummary/CMakeLists.txt
index 142fdfd8a28..1e328a275a9 100644
--- a/searchsummary/src/vespa/searchsummary/docsummary/CMakeLists.txt
+++ b/searchsummary/src/vespa/searchsummary/docsummary/CMakeLists.txt
@@ -24,6 +24,7 @@ vespa_add_library(searchsummary_docsummary OBJECT
juniper_query_adapter.cpp
juniperproperties.cpp
keywordextractor.cpp
+ legacy_keyword_extractor_factory.cpp
linguisticsannotation.cpp
matched_elements_filter_dfw.cpp
positionsdfw.cpp
diff --git a/searchsummary/src/vespa/searchsummary/docsummary/docsum_field_writer_factory.cpp b/searchsummary/src/vespa/searchsummary/docsummary/docsum_field_writer_factory.cpp
index dc215d9c2ba..ee94b0d452d 100644
--- a/searchsummary/src/vespa/searchsummary/docsummary/docsum_field_writer_factory.cpp
+++ b/searchsummary/src/vespa/searchsummary/docsummary/docsum_field_writer_factory.cpp
@@ -20,9 +20,10 @@ using vespalib::IllegalArgumentException;
namespace search::docsummary {
-DocsumFieldWriterFactory::DocsumFieldWriterFactory(bool use_v8_geo_positions, const IDocsumEnvironment& env)
+DocsumFieldWriterFactory::DocsumFieldWriterFactory(bool use_v8_geo_positions, const IDocsumEnvironment& env, const IKeywordExtractorFactory& keyword_extractor_factory)
: _use_v8_geo_positions(use_v8_geo_positions),
_env(env),
+ _keyword_extractor_factory(keyword_extractor_factory),
_matching_elems_fields(std::make_shared<MatchingElementsFields>())
{
}
@@ -65,7 +66,7 @@ DocsumFieldWriterFactory::create_docsum_field_writer(const vespalib::string& fie
auto fw = std::make_unique<DynamicTeaserDFW>(getEnvironment().getJuniper());
auto fw_ptr = fw.get();
fieldWriter = std::move(fw);
- if (!fw_ptr->Init(field_name.c_str(), source)) {
+ if (!fw_ptr->Init(field_name.c_str(), source, _keyword_extractor_factory)) {
throw IllegalArgumentException("Failed to initialize DynamicTeaserDFW.");
}
} else {
diff --git a/searchsummary/src/vespa/searchsummary/docsummary/docsum_field_writer_factory.h b/searchsummary/src/vespa/searchsummary/docsummary/docsum_field_writer_factory.h
index e341f49c25b..88fe5563193 100644
--- a/searchsummary/src/vespa/searchsummary/docsummary/docsum_field_writer_factory.h
+++ b/searchsummary/src/vespa/searchsummary/docsummary/docsum_field_writer_factory.h
@@ -9,6 +9,7 @@ namespace search { class MatchingElementsFields; }
namespace search::docsummary {
class IDocsumEnvironment;
+class IKeywordExtractorFactory;
/*
* Factory class for creating docsum field writers.
@@ -17,12 +18,13 @@ class DocsumFieldWriterFactory : public IDocsumFieldWriterFactory
{
bool _use_v8_geo_positions;
const IDocsumEnvironment& _env;
+ const IKeywordExtractorFactory& _keyword_extractor_factory;
protected:
std::shared_ptr<MatchingElementsFields> _matching_elems_fields;
const IDocsumEnvironment& getEnvironment() const noexcept { return _env; }
bool has_attribute_manager() const noexcept;
public:
- DocsumFieldWriterFactory(bool use_v8_geo_positions, const IDocsumEnvironment& env);
+ DocsumFieldWriterFactory(bool use_v8_geo_positions, const IDocsumEnvironment& env, const IKeywordExtractorFactory& keyword_extractor_factory);
~DocsumFieldWriterFactory() override;
std::unique_ptr<DocsumFieldWriter> create_docsum_field_writer(const vespalib::string& field_name,
const vespalib::string& command,
diff --git a/searchsummary/src/vespa/searchsummary/docsummary/docsumstate.cpp b/searchsummary/src/vespa/searchsummary/docsummary/docsumstate.cpp
index 9c810386703..2f9f47ed7b7 100644
--- a/searchsummary/src/vespa/searchsummary/docsummary/docsumstate.cpp
+++ b/searchsummary/src/vespa/searchsummary/docsummary/docsumstate.cpp
@@ -23,7 +23,6 @@ namespace search::docsummary {
GetDocsumsState::GetDocsumsState(GetDocsumsStateCallback &callback)
: _args(),
_docsumbuf(),
- _kwExtractor(nullptr),
_callback(callback),
_dynteaser(),
_attrCtx(),
diff --git a/searchsummary/src/vespa/searchsummary/docsummary/docsumstate.h b/searchsummary/src/vespa/searchsummary/docsummary/docsumstate.h
index a228f93e1d4..0aa77b7c71b 100644
--- a/searchsummary/src/vespa/searchsummary/docsummary/docsumstate.h
+++ b/searchsummary/src/vespa/searchsummary/docsummary/docsumstate.h
@@ -26,7 +26,6 @@ namespace search::docsummary {
class GetDocsumsState;
class IDocsumEnvironment;
-class IKeywordExtractor;
class DocsumFieldWriterState;
class GetDocsumsStateCallback
@@ -52,7 +51,6 @@ public:
GetDocsumArgs _args; // from getdocsums request
std::vector<uint32_t> _docsumbuf; // from getdocsums request
- IKeywordExtractor *_kwExtractor;
GetDocsumsStateCallback &_callback;
diff --git a/searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.cpp b/searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.cpp
index 8e12f0c875b..d511fdcd4be 100644
--- a/searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.cpp
+++ b/searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.cpp
@@ -86,9 +86,8 @@ DynamicDocsumWriter::insertDocsum(const ResolveClassInfo & rci, uint32_t docid,
}
}
-DynamicDocsumWriter::DynamicDocsumWriter(std::unique_ptr<ResultConfig> config, std::unique_ptr<IKeywordExtractor> extractor)
- : _resultConfig(std::move(config)),
- _keywordExtractor(std::move(extractor))
+DynamicDocsumWriter::DynamicDocsumWriter(std::unique_ptr<ResultConfig> config)
+ : _resultConfig(std::move(config))
{
}
@@ -98,7 +97,6 @@ DynamicDocsumWriter::~DynamicDocsumWriter() = default;
void
DynamicDocsumWriter::initState(const IAttributeManager & attrMan, GetDocsumsState& state, const ResolveClassInfo& rci)
{
- state._kwExtractor = _keywordExtractor.get();
state._attrCtx = attrMan.createContext();
auto result_class = rci.res_class;
if (result_class == nullptr) {
diff --git a/searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.h b/searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.h
index 65a1d923851..0f5bc6cd204 100644
--- a/searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.h
+++ b/searchsummary/src/vespa/searchsummary/docsummary/docsumwriter.h
@@ -17,8 +17,6 @@ namespace vespalib { class Slime; }
namespace search::docsummary {
-class IKeywordExtractor;
-
static constexpr uint32_t SLIME_MAGIC_ID = 0x55555555;
/**
@@ -51,10 +49,9 @@ class DynamicDocsumWriter : public IDocsumWriter
{
private:
std::unique_ptr<ResultConfig> _resultConfig;
- std::unique_ptr<IKeywordExtractor> _keywordExtractor;
public:
- DynamicDocsumWriter(std::unique_ptr<ResultConfig> config, std::unique_ptr<IKeywordExtractor> extractor);
+ DynamicDocsumWriter(std::unique_ptr<ResultConfig> config);
DynamicDocsumWriter(const DynamicDocsumWriter &) = delete;
DynamicDocsumWriter& operator=(const DynamicDocsumWriter &) = delete;
~DynamicDocsumWriter() override;
diff --git a/searchsummary/src/vespa/searchsummary/docsummary/dynamicteaserdfw.cpp b/searchsummary/src/vespa/searchsummary/docsummary/dynamicteaserdfw.cpp
index 0ea5bc9a604..78324fa4eaa 100644
--- a/searchsummary/src/vespa/searchsummary/docsummary/dynamicteaserdfw.cpp
+++ b/searchsummary/src/vespa/searchsummary/docsummary/dynamicteaserdfw.cpp
@@ -4,6 +4,7 @@
#include "docsumstate.h"
#include "i_docsum_store_document.h"
#include "i_juniper_converter.h"
+#include "i_keyword_extractor_factory.h"
#include "juniper_query_adapter.h"
#include <vespa/document/fieldvalue/stringfieldvalue.h>
#include <vespa/vespalib/objects/hexdump.h>
@@ -21,7 +22,8 @@ namespace search::docsummary {
JuniperDFW::JuniperDFW(const juniper::Juniper * juniper)
: _input_field_name(),
_juniperConfig(),
- _juniper(juniper)
+ _juniper(juniper),
+ _keyword_extractor()
{
}
@@ -31,7 +33,8 @@ JuniperDFW::~JuniperDFW() = default;
bool
JuniperDFW::Init(
const char *fieldName,
- const vespalib::string& inputField)
+ const vespalib::string& inputField,
+ const IKeywordExtractorFactory& keyword_extractor_factory)
{
bool rc = true;
_juniperConfig = _juniper->CreateConfig(fieldName);
@@ -41,22 +44,24 @@ JuniperDFW::Init(
}
_input_field_name = inputField;
+ _keyword_extractor = keyword_extractor_factory.make(_input_field_name);
return rc;
}
bool
JuniperTeaserDFW::Init(
const char *fieldName,
- const vespalib::string& inputField)
+ const vespalib::string& inputField,
+ const IKeywordExtractorFactory& keyword_extractor_factory)
{
- return JuniperDFW::Init(fieldName, inputField);
+ return JuniperDFW::Init(fieldName, inputField, keyword_extractor_factory);
}
void
DynamicTeaserDFW::insert_juniper_field(uint32_t docid, vespalib::stringref input, GetDocsumsState& state, vespalib::slime::Inserter& inserter) const
{
if (!state._dynteaser._query) {
- JuniperQueryAdapter iq(state._kwExtractor,
+ JuniperQueryAdapter iq(_keyword_extractor.get(),
state._args.getStackDump(),
&state._args.highlightTerms());
state._dynteaser._query = _juniper->CreateQueryHandle(iq, nullptr);
diff --git a/searchsummary/src/vespa/searchsummary/docsummary/i_keyword_extractor_factory.h b/searchsummary/src/vespa/searchsummary/docsummary/i_keyword_extractor_factory.h
new file mode 100644
index 00000000000..264af049251
--- /dev/null
+++ b/searchsummary/src/vespa/searchsummary/docsummary/i_keyword_extractor_factory.h
@@ -0,0 +1,24 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vespa/vespalib/stllike/string.h>
+#include <memory>
+
+namespace search::docsummary {
+
+class IKeywordExtractor;
+
+/*
+ * Interface class for creating an instance of IKeywordExtractor for a
+ * specific input field.
+ */
+class IKeywordExtractorFactory
+{
+public:
+ virtual ~IKeywordExtractorFactory() = default;
+
+ virtual std::shared_ptr<const IKeywordExtractor> make(vespalib::stringref input_field) const = 0;
+};
+
+}
diff --git a/searchsummary/src/vespa/searchsummary/docsummary/juniper_query_adapter.cpp b/searchsummary/src/vespa/searchsummary/docsummary/juniper_query_adapter.cpp
index d63c9359aec..360e97e0c04 100644
--- a/searchsummary/src/vespa/searchsummary/docsummary/juniper_query_adapter.cpp
+++ b/searchsummary/src/vespa/searchsummary/docsummary/juniper_query_adapter.cpp
@@ -10,7 +10,7 @@
namespace search::docsummary {
-JuniperQueryAdapter::JuniperQueryAdapter(IKeywordExtractor *kwExtractor, vespalib::stringref buf,
+JuniperQueryAdapter::JuniperQueryAdapter(const IKeywordExtractor *kwExtractor, vespalib::stringref buf,
const search::fef::Properties *highlightTerms)
: _kwExtractor(kwExtractor),
_buf(buf),
diff --git a/searchsummary/src/vespa/searchsummary/docsummary/juniper_query_adapter.h b/searchsummary/src/vespa/searchsummary/docsummary/juniper_query_adapter.h
index 7c975c6120d..851f0d26746 100644
--- a/searchsummary/src/vespa/searchsummary/docsummary/juniper_query_adapter.h
+++ b/searchsummary/src/vespa/searchsummary/docsummary/juniper_query_adapter.h
@@ -19,14 +19,14 @@ class IKeywordExtractor;
class JuniperQueryAdapter : public juniper::IQuery
{
private:
- IKeywordExtractor *_kwExtractor;
+ const IKeywordExtractor *_kwExtractor;
const vespalib::stringref _buf;
const search::fef::Properties *_highlightTerms;
public:
JuniperQueryAdapter(const JuniperQueryAdapter&) = delete;
JuniperQueryAdapter operator= (const JuniperQueryAdapter&) = delete;
- JuniperQueryAdapter(IKeywordExtractor *kwExtractor, vespalib::stringref buf,
+ JuniperQueryAdapter(const IKeywordExtractor *kwExtractor, vespalib::stringref buf,
const search::fef::Properties *highlightTerms = nullptr);
~JuniperQueryAdapter() override;
bool skipItem(search::SimpleQueryStackDumpIterator *iterator) const;
diff --git a/searchsummary/src/vespa/searchsummary/docsummary/juniperdfw.h b/searchsummary/src/vespa/searchsummary/docsummary/juniperdfw.h
index 312c4ece516..528268b8fff 100644
--- a/searchsummary/src/vespa/searchsummary/docsummary/juniperdfw.h
+++ b/searchsummary/src/vespa/searchsummary/docsummary/juniperdfw.h
@@ -13,12 +13,16 @@ namespace vespalib::slime { struct Inserter; }
namespace search::docsummary {
+class IKeywordExtractor;
+class IKeywordExtractorFactory;
+
class JuniperDFW : public DocsumFieldWriter
{
public:
virtual bool Init(
const char *fieldName,
- const vespalib::string& inputField);
+ const vespalib::string& inputField,
+ const IKeywordExtractorFactory& keyword_extractor_factory);
protected:
explicit JuniperDFW(const juniper::Juniper * juniper);
~JuniperDFW() override;
@@ -26,6 +30,7 @@ protected:
vespalib::string _input_field_name;
std::unique_ptr<juniper::Config> _juniperConfig;
const juniper::Juniper *_juniper;
+ std::shared_ptr<const IKeywordExtractor> _keyword_extractor;
private:
bool isGenerated() const override { return false; }
JuniperDFW(const JuniperDFW &);
@@ -37,7 +42,8 @@ class JuniperTeaserDFW : public JuniperDFW
{
public:
bool Init(const char *fieldName,
- const vespalib::string& inputField) override;
+ const vespalib::string& inputField,
+ const IKeywordExtractorFactory& keyword_extractor_factory) override;
protected:
explicit JuniperTeaserDFW(const juniper::Juniper * juniper) : JuniperDFW(juniper) { }
};
diff --git a/searchsummary/src/vespa/searchsummary/docsummary/legacy_keyword_extractor_factory.cpp b/searchsummary/src/vespa/searchsummary/docsummary/legacy_keyword_extractor_factory.cpp
new file mode 100644
index 00000000000..b967f7ffeff
--- /dev/null
+++ b/searchsummary/src/vespa/searchsummary/docsummary/legacy_keyword_extractor_factory.cpp
@@ -0,0 +1,21 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "legacy_keyword_extractor_factory.h"
+
+namespace search::docsummary {
+
+LegacyKeywordExtractorFactory::LegacyKeywordExtractorFactory(std::shared_ptr<const IKeywordExtractor> keyword_extractor)
+ : IKeywordExtractorFactory(),
+ _keyword_extractor(std::move(keyword_extractor))
+{
+}
+
+LegacyKeywordExtractorFactory::~LegacyKeywordExtractorFactory() = default;
+
+std::shared_ptr<const IKeywordExtractor>
+LegacyKeywordExtractorFactory::make(vespalib::stringref) const
+{
+ return _keyword_extractor;
+}
+
+}
diff --git a/searchsummary/src/vespa/searchsummary/docsummary/legacy_keyword_extractor_factory.h b/searchsummary/src/vespa/searchsummary/docsummary/legacy_keyword_extractor_factory.h
new file mode 100644
index 00000000000..630a37cec4d
--- /dev/null
+++ b/searchsummary/src/vespa/searchsummary/docsummary/legacy_keyword_extractor_factory.h
@@ -0,0 +1,21 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "i_keyword_extractor_factory.h"
+
+namespace search::docsummary {
+
+/*
+ * Class for creating an instance of IKeywordExtractor.
+ */
+class LegacyKeywordExtractorFactory : public IKeywordExtractorFactory
+{
+ std::shared_ptr<const IKeywordExtractor> _keyword_extractor;
+public:
+ explicit LegacyKeywordExtractorFactory(std::shared_ptr<const IKeywordExtractor> keyword_extractor);
+ virtual ~LegacyKeywordExtractorFactory();
+ std::shared_ptr<const IKeywordExtractor> make(vespalib::stringref) const override;
+};
+
+}
diff --git a/streamingvisitors/src/vespa/vsm/vsm/docsum_field_writer_factory.cpp b/streamingvisitors/src/vespa/vsm/vsm/docsum_field_writer_factory.cpp
index eaef0846536..f3c383a4ba5 100644
--- a/streamingvisitors/src/vespa/vsm/vsm/docsum_field_writer_factory.cpp
+++ b/streamingvisitors/src/vespa/vsm/vsm/docsum_field_writer_factory.cpp
@@ -14,6 +14,7 @@ using search::docsummary::CopyDFW;
using search::docsummary::DocsumFieldWriter;
using search::docsummary::EmptyDFW;
using search::docsummary::IDocsumEnvironment;
+using search::docsummary::IKeywordExtractorFactory;
using search::docsummary::MatchedElementsFilterDFW;
using vespa::config::search::vsm::VsmfieldsConfig;
@@ -36,8 +37,8 @@ void populate_fields(MatchingElementsFields& fields, VsmfieldsConfig& fields_con
}
-DocsumFieldWriterFactory::DocsumFieldWriterFactory(bool use_v8_geo_positions, const IDocsumEnvironment& env, const vespa::config::search::vsm::VsmfieldsConfig& vsm_fields_config)
- : search::docsummary::DocsumFieldWriterFactory(use_v8_geo_positions, env),
+DocsumFieldWriterFactory::DocsumFieldWriterFactory(bool use_v8_geo_positions, const IDocsumEnvironment& env, const IKeywordExtractorFactory& keyword_extractor_factory, const vespa::config::search::vsm::VsmfieldsConfig& vsm_fields_config)
+ : search::docsummary::DocsumFieldWriterFactory(use_v8_geo_positions, env, keyword_extractor_factory),
_vsm_fields_config(vsm_fields_config)
{
}
diff --git a/streamingvisitors/src/vespa/vsm/vsm/docsum_field_writer_factory.h b/streamingvisitors/src/vespa/vsm/vsm/docsum_field_writer_factory.h
index 17c270292e2..81acd0c7668 100644
--- a/streamingvisitors/src/vespa/vsm/vsm/docsum_field_writer_factory.h
+++ b/streamingvisitors/src/vespa/vsm/vsm/docsum_field_writer_factory.h
@@ -16,7 +16,7 @@ class DocsumFieldWriterFactory : public search::docsummary::DocsumFieldWriterFac
const vespa::config::search::vsm::VsmfieldsConfig& _vsm_fields_config;
public:
- DocsumFieldWriterFactory(bool use_v8_geo_positions, const search::docsummary::IDocsumEnvironment& env, const vespa::config::search::vsm::VsmfieldsConfig& vsm_fields_config);
+ DocsumFieldWriterFactory(bool use_v8_geo_positions, const search::docsummary::IDocsumEnvironment& env, const search::docsummary::IKeywordExtractorFactory& keyword_extractor_factory, const vespa::config::search::vsm::VsmfieldsConfig& vsm_fields_config);
~DocsumFieldWriterFactory() override;
std::unique_ptr<search::docsummary::DocsumFieldWriter>
create_docsum_field_writer(const vespalib::string& field_name,
diff --git a/streamingvisitors/src/vespa/vsm/vsm/vsm-adapter.cpp b/streamingvisitors/src/vespa/vsm/vsm/vsm-adapter.cpp
index 563eda2249c..cbe3f622770 100644
--- a/streamingvisitors/src/vespa/vsm/vsm/vsm-adapter.cpp
+++ b/streamingvisitors/src/vespa/vsm/vsm/vsm-adapter.cpp
@@ -5,13 +5,16 @@
#include "i_matching_elements_filler.h"
#include <vespa/searchlib/common/matching_elements.h>
#include <vespa/searchsummary/docsummary/keywordextractor.h>
+#include <vespa/searchsummary/docsummary/legacy_keyword_extractor_factory.h>
#include <vespa/searchsummary/config/config-juniperrc.h>
#include <vespa/log/log.h>
LOG_SETUP(".vsm.vsm-adapter");
+using search::docsummary::IKeywordExtractorFactory;
using search::docsummary::ResConfigEntry;
using search::docsummary::KeywordExtractor;
+using search::docsummary::LegacyKeywordExtractorFactory;
using search::MatchingElements;
using config::ConfigSnapshot;
using vespa::config::search::SummaryConfig;
@@ -144,22 +147,24 @@ VSMAdapter::configure(const VSMConfigSnapshot & snapshot)
auto juniper = std::make_unique<juniper::Juniper>(_juniperProps.get(), &_wordFolder);
docsumTools->setJuniper(std::move(juniper));
+ // init keyword extractor
+ auto kwExtractor = std::make_unique<KeywordExtractor>();
+ kwExtractor->addLegalIndexSpec(_highlightindexes.c_str());
+ vespalib::string spec = kwExtractor->getLegalIndexSpec();
+ LOG(debug, "index highlight spec: '%s'", spec.c_str());
+
// init result config
auto resCfg = std::make_unique<ResultConfig>();
- auto docsum_field_writer_factory = std::make_unique<DocsumFieldWriterFactory>(summary.get()->usev8geopositions, *docsumTools, *_fieldsCfg.get());
+ std::unique_ptr<IKeywordExtractorFactory> keyword_extractor_factory = std::make_unique<LegacyKeywordExtractorFactory>(std::move(kwExtractor));
+ auto docsum_field_writer_factory = std::make_unique<DocsumFieldWriterFactory>(summary.get()->usev8geopositions, *docsumTools, *keyword_extractor_factory, *_fieldsCfg.get());
if ( !resCfg->readConfig(*summary.get(), _configId.c_str(), *docsum_field_writer_factory)) {
throw std::runtime_error("(re-)configuration of VSM (docsum tools) failed due to bad summary config");
}
docsum_field_writer_factory.reset();
-
- // init keyword extractor
- auto kwExtractor = std::make_unique<KeywordExtractor>();
- kwExtractor->addLegalIndexSpec(_highlightindexes.c_str());
- vespalib::string spec = kwExtractor->getLegalIndexSpec();
- LOG(debug, "index highlight spec: '%s'", spec.c_str());
+ keyword_extractor_factory.reset();
// create dynamic docsum writer
- auto writer = std::make_unique<DynamicDocsumWriter>(std::move(resCfg), std::move(kwExtractor));
+ auto writer = std::make_unique<DynamicDocsumWriter>(std::move(resCfg));
docsumTools->set_writer(std::move(writer));
// configure new docsum tools