diff options
4 files changed, 23 insertions, 4 deletions
diff --git a/searchsummary/src/vespa/searchsummary/docsummary/getdocsumargs.cpp b/searchsummary/src/vespa/searchsummary/docsummary/getdocsumargs.cpp index 739a6fae548..becaa6d1ab0 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/getdocsumargs.cpp +++ b/searchsummary/src/vespa/searchsummary/docsummary/getdocsumargs.cpp @@ -43,4 +43,9 @@ GetDocsumArgs::needField(vespalib::stringref field) const { return _fields.empty() || _fields.contains(field); } +void +GetDocsumArgs::add_field(vespalib::stringref field) { + _fields.insert(field); +} + } diff --git a/searchsummary/src/vespa/searchsummary/docsummary/getdocsumargs.h b/searchsummary/src/vespa/searchsummary/docsummary/getdocsumargs.h index ff410fb298c..89816977290 100644 --- a/searchsummary/src/vespa/searchsummary/docsummary/getdocsumargs.h +++ b/searchsummary/src/vespa/searchsummary/docsummary/getdocsumargs.h @@ -19,7 +19,7 @@ private: vespalib::string _location; vespalib::duration _timeout; fef::Properties _highlightTerms; - FieldSet _fields; + FieldSet _fields; public: GetDocsumArgs(); GetDocsumArgs(const GetDocsumArgs &) = delete; @@ -47,6 +47,7 @@ public: const fef::Properties &highlightTerms() const { return _highlightTerms; } bool needField(vespalib::stringref field) const; + void add_field(vespalib::stringref field); }; } diff --git a/streamingvisitors/src/vespa/searchvisitor/searchvisitor.cpp b/streamingvisitors/src/vespa/searchvisitor/searchvisitor.cpp index b04f09ff70a..9c39d929e4c 100644 --- a/streamingvisitors/src/vespa/searchvisitor/searchvisitor.cpp +++ b/streamingvisitors/src/vespa/searchvisitor/searchvisitor.cpp @@ -20,6 +20,7 @@ #include <vespa/vespalib/util/exceptions.h> #include <vespa/vespalib/util/size_literals.h> #include <vespa/vespalib/data/slime/slime.h> +#include <vespa/vespalib/text/stringtokenizer.h> #include <vespa/fnet/databuffer.h> #include <vespa/log/log.h> @@ -125,6 +126,7 @@ SearchVisitor::SummaryGenerator::SummaryGenerator(const search::IAttributeManage : HitsAggregationResult::SummaryGenerator(), _callback(), _docsum_states(), + _summaryFields(), _docsumFilter(), _docsumWriter(nullptr), _buf(4_Ki), @@ -138,8 +140,7 @@ SearchVisitor::SummaryGenerator::SummaryGenerator(const search::IAttributeManage SearchVisitor::SummaryGenerator::~SummaryGenerator() = default; SearchVisitor::StreamingDocsumsState& -SearchVisitor::SummaryGenerator::get_streaming_docsums_state(const vespalib::string& summary_class) -{ +SearchVisitor::SummaryGenerator::get_streaming_docsums_state(const vespalib::string& summary_class) { auto itr = _docsum_states.find(summary_class); if (itr != _docsum_states.end()) { return *itr->second; @@ -148,6 +149,9 @@ SearchVisitor::SummaryGenerator::get_streaming_docsums_state(const vespalib::str auto state = std::make_unique<StreamingDocsumsState>(_callback, rci); auto &ds = state->get_state(); ds._args.setResultClassName(summary_class); + for (const auto &field: _summaryFields) { + ds._args.add_field(field); + } if (_dump_features.has_value()) { ds._args.dumpFeatures(_dump_features.value()); } @@ -263,6 +267,13 @@ void SearchVisitor::init(const Parameters & params) _summaryClass = vespalib::string(valueRef.data(), valueRef.size()); LOG(debug, "Received summary class: %s", _summaryClass.c_str()); } + if ( params.lookup("summary-fields", valueRef) ) { + vespalib::StringTokenizer fieldTokenizer(valueRef, " "); + for (const auto & field : fieldTokenizer) { + _summaryGenerator.add_summary_field(field); + LOG(debug, "Received field: %s", vespalib::string(field).c_str()); + } + } size_t wantedSummaryCount(10); if (params.lookup("summarycount", valueRef) ) { diff --git a/streamingvisitors/src/vespa/searchvisitor/searchvisitor.h b/streamingvisitors/src/vespa/searchvisitor/searchvisitor.h index 37ec6352b5a..7dbf1cd521b 100644 --- a/streamingvisitors/src/vespa/searchvisitor/searchvisitor.h +++ b/streamingvisitors/src/vespa/searchvisitor/searchvisitor.h @@ -398,7 +398,7 @@ private: class SummaryGenerator : public HitsAggregationResult::SummaryGenerator { public: - SummaryGenerator(const search::IAttributeManager& attr_manager); + explicit SummaryGenerator(const search::IAttributeManager& attr_manager); ~SummaryGenerator() override; vsm::GetDocsumsStateCallback & getDocsumCallback() { return _callback; } void setFilter(std::unique_ptr<vsm::DocsumFilter> filter) { _docsumFilter = std::move(filter); } @@ -408,10 +408,12 @@ private: void set_dump_features(bool dump_features) { _dump_features = dump_features; } void set_location(const vespalib::string& location) { _location = location; } void set_stack_dump(std::vector<char> stack_dump) { _stack_dump = std::move(stack_dump); } + void add_summary_field(vespalib::stringref field) { _summaryFields.emplace_back(field); } private: StreamingDocsumsState& get_streaming_docsums_state(const vespalib::string& summary_class); vsm::GetDocsumsStateCallback _callback; vespalib::hash_map<vespalib::string, std::unique_ptr<StreamingDocsumsState>> _docsum_states; + std::vector<vespalib::string> _summaryFields; std::unique_ptr<vsm::DocsumFilter> _docsumFilter; search::docsummary::IDocsumWriter * _docsumWriter; vespalib::SmartBuffer _buf; |