From 09233bf4f3c9a3fc771004f988d177c015b87b2f Mon Sep 17 00:00:00 2001 From: Veloman Yunkan Date: Wed, 10 Mar 2021 16:18:43 +0400 Subject: [PATCH] Support for partial queries in catalog search The search text in the catalog query is interpreted as partial by default, but partial query mode can be disabled in C++. The latter possibility is not exposed via the /catalog/search kiwix-serve endpoint, though. --- include/library.h | 4 +++- src/library.cpp | 9 +++++++-- test/library.cpp | 2 +- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/include/library.h b/include/library.h index fb2d8aad4..97e5f236e 100644 --- a/include/library.h +++ b/include/library.h @@ -59,6 +59,7 @@ class Filter { std::string _creator; size_t _maxSize; std::string _query; + bool _queryIsPartial; std::string _name; public: @@ -103,11 +104,12 @@ class Filter { Filter& publisher(std::string publisher); Filter& creator(std::string creator); Filter& maxSize(size_t size); - Filter& query(std::string query); + Filter& query(std::string query, bool partial=true); Filter& name(std::string name); bool hasQuery() const; const std::string& getQuery() const { return _query; } + bool queryIsPartial() const { return _queryIsPartial; } bool accept(const Book& book) const; bool acceptByQueryOnly(const Book& book) const; diff --git a/src/library.cpp b/src/library.cpp index 7cbfd08a1..52ca72670 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -296,6 +296,9 @@ Library::BookIdCollection Library::getBooksByTitleOrDescription(const Filter& fi queryParser.set_default_op(Xapian::Query::OP_AND); queryParser.add_prefix("title", "S"); queryParser.add_prefix("description", "XD"); + const auto partialQueryFlag = filter.queryIsPartial() + ? Xapian::QueryParser::FLAG_PARTIAL + : 0; // Language assumed for the query is not known for sure so stemming // is not applied //queryParser.set_stemmer(Xapian::Stem(iso639_3ToXapian.at(???))); @@ -303,7 +306,8 @@ Library::BookIdCollection Library::getBooksByTitleOrDescription(const Filter& fi const auto flags = Xapian::QueryParser::FLAG_PHRASE | Xapian::QueryParser::FLAG_BOOLEAN | Xapian::QueryParser::FLAG_LOVEHATE - | Xapian::QueryParser::FLAG_WILDCARD; + | Xapian::QueryParser::FLAG_WILDCARD + | partialQueryFlag; const auto query = queryParser.parse_query(filter.getQuery(), flags); Xapian::Enquire enquire(m_bookDB); enquire.set_query(query); @@ -561,9 +565,10 @@ Filter& Filter::maxSize(size_t maxSize) return *this; } -Filter& Filter::query(std::string query) +Filter& Filter::query(std::string query, bool partial) { _query = query; + _queryIsPartial = partial; activeFilters |= QUERY; return *this; } diff --git a/test/library.cpp b/test/library.cpp index 0501124df..7f34e008b 100644 --- a/test/library.cpp +++ b/test/library.cpp @@ -263,7 +263,7 @@ TEST_F(LibraryTest, filterCheck) bookIds = lib.filter(kiwix::Filter().query("folklore")); EXPECT_EQ(bookIds.size(), 1U); - bookIds = lib.filter(kiwix::Filter().query("Wiki*")); + bookIds = lib.filter(kiwix::Filter().query("Wiki")); EXPECT_EQ(bookIds.size(), 4U); bookIds = lib.filter(kiwix::Filter().query("Wiki").creator("Wiki"));