diff --git a/src/server/internalServer.cpp b/src/server/internalServer.cpp index 8d99b3f8a..9607dd4fd 100644 --- a/src/server/internalServer.cpp +++ b/src/server/internalServer.cpp @@ -541,13 +541,13 @@ std::unique_ptr InternalServer::handle_search(const RequestContext& re } catch(const std::out_of_range&) {} catch(const std::invalid_argument&) {} - std::shared_ptr reader(nullptr); + std::shared_ptr archive; try { - reader = mp_library->getReaderById(bookId); + archive = mp_library->getArchiveById(bookId); } catch (const std::out_of_range&) {} /* Make the search */ - if ( (!reader && !bookName.empty()) + if ( (!archive && !bookName.empty()) || (patternString.empty() && ! has_geo_query) ) { auto data = get_default_data(); data.set("pattern", encodeDiples(patternString)); @@ -557,14 +557,18 @@ std::unique_ptr InternalServer::handle_search(const RequestContext& re return std::move(response); } - Searcher searcher; - if (reader) { - searcher.add_reader(reader.get()); + std::shared_ptr searcher; + if (archive) { + searcher = std::make_shared(*archive); } else { for (auto& bookId: mp_library->filter(kiwix::Filter().local(true).valid(true))) { - auto currentReader = mp_library->getReaderById(bookId); - if (currentReader) { - searcher.add_reader(currentReader.get()); + auto currentArchive = mp_library->getArchiveById(bookId); + if (currentArchive) { + if (! searcher) { + searcher = std::make_shared(*currentArchive); + } else { + searcher->add_archive(*currentArchive); + } } } } @@ -589,14 +593,30 @@ std::unique_ptr InternalServer::handle_search(const RequestContext& re /* Get the results */ try { + zim::Query query; if (patternString.empty()) { - searcher.geo_search(latitude, longitude, distance, - start, end, m_verbose.load()); + // Execute geo-search + if (m_verbose.load()) { + cout << "Performing geo query `" << distance << "&(" << latitude << ";" << longitude << ")'" << endl; + } + + query.setVerbose(m_verbose.load()); + query.setQuery("", false); + query.setGeorange(latitude, longitude, distance); } else { - searcher.search(patternString, - start, end, m_verbose.load()); + // Execute Ft search + if (m_verbose.load()) { + cout << "Performing query `" << patternString << "'" << endl; + } + + std::string queryString = removeAccents(patternString); + query.setQuery(queryString, false); + query.setVerbose(m_verbose.load()); } - SearchRenderer renderer(&searcher, mp_nameMapper); + + zim::Search search = searcher->search(query); + SearchRenderer renderer(search.getResults(start, end), mp_nameMapper, start, + search.getEstimatedMatches()); renderer.setSearchPattern(patternString); renderer.setSearchContent(bookName); renderer.setProtocolPrefix(m_root + "/");