From c5cd82292b0c24439e02646288771707d9e93e4a Mon Sep 17 00:00:00 2001 From: Balazs Perlaki-Horvath Date: Sun, 15 Sep 2024 20:18:12 +0200 Subject: [PATCH] Archive fault tolerant search, preferring title results --- .../Model/SearchOperation/SearchOperation.mm | 94 +++++++++---------- 1 file changed, 46 insertions(+), 48 deletions(-) diff --git a/SwiftUI/Model/SearchOperation/SearchOperation.mm b/SwiftUI/Model/SearchOperation/SearchOperation.mm index e39bd654..7f520c5d 100644 --- a/SwiftUI/Model/SearchOperation/SearchOperation.mm +++ b/SwiftUI/Model/SearchOperation/SearchOperation.mm @@ -72,74 +72,70 @@ - (void)performSearch { typedef std::unordered_map archives_map; auto *allArchives = static_cast([[ZimFileService sharedInstance] getArchives]); - std::vector indexSearchArchives = std::vector(); - std::vector titleSearchArchives = std::vector(); for (NSUUID *zimFileID in self.zimFileIDs) { std::string zimFileID_C = [[[zimFileID UUIDString] lowercaseString] cStringUsingEncoding:NSUTF8StringEncoding]; try { auto archive = allArchives->at(zimFileID_C); + [self addTitleSearchResults:archive count: 25]; if (archive.hasFulltextIndex()) { - indexSearchArchives.push_back(archive); + [self addIndexSearchResults:archive count: 25]; } - titleSearchArchives.push_back(archive); - } catch (std::exception) { } - } - - // perform index and title search - try { - [self addIndexSearchResults:indexSearchArchives]; - } catch (std::exception) { } - if (titleSearchArchives.size() > 0) { - int count = std::max((35 - (int)[self.results count]) / (int)titleSearchArchives.size(), 5); - [self addTitleSearchResults:titleSearchArchives count:(int)count]; + } catch (std::exception &e) { + NSLog(@"perform search exception: %s", e.what()); + } } } /// Add search results based on search index. -/// @param archives archives to retrieve search results from -- (void)addIndexSearchResults:(std::vector)archives { +/// @param archive to retrieve search results from +/// @param count number of articles to retrieve +- (void)addIndexSearchResults:(zim::Archive)archive count:(int)count { // initialize and start full text search if (self.isCancelled) { return; } - if (archives.empty()) { return; } - zim::Searcher searcher = zim::Searcher(archives); - zim::SearchResultSet resultSet = searcher.search(zim::Query(self.searchText_C)).getResults(0, 25); - - // retrieve full text search results - for (auto result = resultSet.begin(); result != resultSet.end(); result++) { - if (self.isCancelled) { break; } - - zim::Item item = result->getItem(result->isRedirect()); - NSUUID *zimFileID = [[NSUUID alloc] initWithUUIDBytes:(unsigned char *)result.getZimId().data]; - NSString *path = [NSString stringWithCString:item.getPath().c_str() encoding:NSUTF8StringEncoding]; - NSString *title = [NSString stringWithCString:item.getTitle().c_str() encoding:NSUTF8StringEncoding]; - if (title.length == 0) { - title = path; // display the path as a fallback - } - SearchResult *searchResult = [[SearchResult alloc] initWithZimFileID:zimFileID path:path title:title]; - searchResult.probability = [[NSNumber alloc] initWithFloat:result.getScore() / 100]; - - // optionally, add snippet - if (self.extractMatchingSnippet) { - NSString *html = [NSString stringWithCString:result.getSnippet().c_str() encoding:NSUTF8StringEncoding]; - searchResult.htmlSnippet = html; - } - if (searchResult != nil) { - [self addResult: searchResult]; + try { + std::vector archives = std::vector(); + archives.push_back(archive); + zim::Searcher searcher = zim::Searcher(archives); + zim::SearchResultSet resultSet = searcher.search(zim::Query(self.searchText_C)).getResults(0, count); + + // retrieve full text search results + for (auto result = resultSet.begin(); result != resultSet.end(); result++) { + if (self.isCancelled) { break; } + + zim::Item item = result->getItem(result->isRedirect()); + NSUUID *zimFileID = [[NSUUID alloc] initWithUUIDBytes:(unsigned char *)result.getZimId().data]; + NSString *path = [NSString stringWithCString:item.getPath().c_str() encoding:NSUTF8StringEncoding]; + NSString *title = [NSString stringWithCString:item.getTitle().c_str() encoding:NSUTF8StringEncoding]; + if (title.length == 0) { + title = path; // display the path as a fallback + } + SearchResult *searchResult = [[SearchResult alloc] initWithZimFileID:zimFileID path:path title:title]; + searchResult.probability = [[NSNumber alloc] initWithFloat:result.getScore() / 100]; + + // optionally, add snippet + if (self.extractMatchingSnippet) { + NSString *html = [NSString stringWithCString:result.getSnippet().c_str() encoding:NSUTF8StringEncoding]; + searchResult.htmlSnippet = html; + } + if (searchResult != nil) { + [self addResult: searchResult]; + } } + } catch (std::exception &e) { + NSLog(@"index search error: %s", e.what()); } } /// Add search results based on matching article titles with search text. -/// @param archives archives to retrieve search results from -/// @param count number of articles to retrieve for each archive -- (void)addTitleSearchResults:(std::vector)archives count:(int)count { - for (zim::Archive archive: archives) { - if (self.isCancelled) { break; } - +/// @param archive to retrieve search results from +/// @param count number of articles to retrieve +- (void)addTitleSearchResults:(zim::Archive) archive count:(int)count { + if (self.isCancelled) { return; } + try { NSUUID *zimFileID = [[NSUUID alloc] initWithUUIDBytes:(unsigned char *)archive.getUuid().data]; auto results = zim::SuggestionSearcher(archive).suggest(self.searchText_C).getResults(0, count); for (auto result = results.begin(); result != results.end(); result++) { - if (self.isCancelled) { break; } + if (self.isCancelled) { return; } NSString *path = [NSString stringWithCString:result->getPath().c_str() encoding:NSUTF8StringEncoding]; NSString *title = [NSString stringWithCString:result->getTitle().c_str() encoding:NSUTF8StringEncoding]; if (title.length > 0) { @@ -149,6 +145,8 @@ - (void)addTitleSearchResults:(std::vector)archives count:(int)cou } } } + } catch (std::exception &e) { + NSLog(@"title search error: %s", e.what()); } }