diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2017-02-12 12:13:12 +0100 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2017-02-13 11:20:49 +0000 |
commit | dc6d487dfe2917c1a44317bce967d368da04424a (patch) | |
tree | 65e27a2cfda686e8f21d14e05036afaec215ae3c /searchlib | |
parent | 0aaff2abd821f79e1ea0d01bfcfb6c5325ae9a93 (diff) |
Optimise the single query item dotproduct.
Diffstat (limited to 'searchlib')
-rw-r--r-- | searchlib/src/vespa/searchlib/features/rankingexpressionfeature.cpp | 16 | ||||
-rw-r--r-- | searchlib/src/vespa/searchlib/queryeval/dot_product_search.cpp | 64 |
2 files changed, 55 insertions, 25 deletions
diff --git a/searchlib/src/vespa/searchlib/features/rankingexpressionfeature.cpp b/searchlib/src/vespa/searchlib/features/rankingexpressionfeature.cpp index cc8238a50a1..bef4c748034 100644 --- a/searchlib/src/vespa/searchlib/features/rankingexpressionfeature.cpp +++ b/searchlib/src/vespa/searchlib/features/rankingexpressionfeature.cpp @@ -1,24 +1,18 @@ // Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -#include <vespa/fastos/fastos.h> -#include <vespa/log/log.h> -LOG_SETUP(".features.rankingexpression"); +#include "rankingexpressionfeature.h" +#include "utils.h" #include <vespa/searchlib/fef/properties.h> #include <vespa/searchlib/fef/indexproperties.h> #include <vespa/searchlib/features/rankingexpression/feature_name_extractor.h> -#include <vespa/vespalib/util/stringfmt.h> -#include <vespa/eval/eval/function.h> #include <vespa/eval/eval/interpreted_function.h> #include <vespa/eval/eval/llvm/compiled_function.h> #include <vespa/eval/eval/llvm/compile_cache.h> -#include <vespa/eval/eval/node_types.h> -#include "rankingexpressionfeature.h" -#include "utils.h" -#include <stdexcept> -#include <vespa/eval/eval/value_type.h> -#include <vespa/searchlib/fef/feature_type.h> #include <vespa/eval/tensor/default_tensor_engine.h> +#include <vespa/log/log.h> +LOG_SETUP(".features.rankingexpression"); + using vespalib::eval::Function; using vespalib::eval::PassParams; using vespalib::eval::CompileCache; diff --git a/searchlib/src/vespa/searchlib/queryeval/dot_product_search.cpp b/searchlib/src/vespa/searchlib/queryeval/dot_product_search.cpp index f23b23f7a6b..b37f49113e7 100644 --- a/searchlib/src/vespa/searchlib/queryeval/dot_product_search.cpp +++ b/searchlib/src/vespa/searchlib/queryeval/dot_product_search.cpp @@ -6,6 +6,7 @@ using search::fef::TermFieldMatchData; +using search::fef::MatchData; using vespalib::ObjectVisitor; namespace search { @@ -26,22 +27,22 @@ private: } }; - fef::TermFieldMatchData &_tmd; - std::vector<int32_t> _weights; - std::vector<uint32_t> _termPos; - CmpDocId _cmpDocId; - std::vector<ref_t> _data_space; - ref_t *_data_begin; - ref_t *_data_stash; - ref_t *_data_end; - IteratorPack _children; + TermFieldMatchData &_tmd; + std::vector<int32_t> _weights; + std::vector<uint32_t> _termPos; + CmpDocId _cmpDocId; + std::vector<ref_t> _data_space; + ref_t *_data_begin; + ref_t *_data_stash; + ref_t *_data_end; + IteratorPack _children; void seek_child(ref_t child, uint32_t docId) { _termPos[child] = _children.seek(child, docId); } public: - DotProductSearchImpl(search::fef::TermFieldMatchData &tmd, + DotProductSearchImpl(TermFieldMatchData &tmd, const std::vector<int32_t> &weights, IteratorPack &&iteratorPack) : _tmd(tmd), @@ -107,19 +108,54 @@ public: void visitMembers(vespalib::ObjectVisitor &) const override {} }; +class SingleQueryDotProductSearch : public SearchIterator { +public: + SingleQueryDotProductSearch(TermFieldMatchData &tmd, SearchIterator::UP child, + const TermFieldMatchData &childTmd, feature_t weight, MatchData::UP md) + : _child(std::move(child)), + _childTmd(childTmd), + _tmd(tmd), + _weight(weight), + _md(std::move(md)) + { } +private: + void doSeek(uint32_t docid) override { + _child->doSeek(docid); + setDocId(_child->getDocId()); + } + + void doUnpack(uint32_t docid) override { + _tmd.setRawScore(docid, _weight*_childTmd.getWeight()); + } + + void initRange(uint32_t beginId, uint32_t endId) override { + SearchIterator::initRange(beginId, endId); + _child->initRange(beginId, endId); + } + SearchIterator::UP _child; + const TermFieldMatchData &_childTmd; + TermFieldMatchData &_tmd; + feature_t _weight; + MatchData::UP _md; +}; + //----------------------------------------------------------------------------- SearchIterator::UP DotProductSearch::create(const std::vector<SearchIterator*> &children, - search::fef::TermFieldMatchData &tmd, - const std::vector<fef::TermFieldMatchData*> &childMatch, + TermFieldMatchData &tmd, + const std::vector<TermFieldMatchData*> &childMatch, const std::vector<int32_t> &weights, - fef::MatchData::UP md) + MatchData::UP md) { typedef DotProductSearchImpl<vespalib::LeftArrayHeap, SearchIteratorPack> ArrayHeapImpl; typedef DotProductSearchImpl<vespalib::LeftHeap, SearchIteratorPack> HeapImpl; + if (childMatch.size() == 1) { + return std::make_unique<SingleQueryDotProductSearch>(tmd, SearchIterator::UP(children[0]), + *childMatch[0], weights[0], std::move(md)); + } if (childMatch.size() < 128) { return SearchIterator::UP(new ArrayHeapImpl(tmd, weights, SearchIteratorPack(children, childMatch, std::move(md)))); } @@ -129,7 +165,7 @@ DotProductSearch::create(const std::vector<SearchIterator*> &children, //----------------------------------------------------------------------------- SearchIterator::UP -DotProductSearch::create(search::fef::TermFieldMatchData &tmd, +DotProductSearch::create(TermFieldMatchData &tmd, const std::vector<int32_t> &weights, std::vector<DocumentWeightIterator> &&iterators) { |