void WordMatchSearchImpl::prepare() { // Build inverted index typedef QMap<QString, QSet<Service::Item*>> InvertedIndexMap; InvertedIndexMap invertedIndexMap; for (Service::Item *i : _indexRef) { QStringList words = i->title().split(QRegExp("\\W+"), QString::SkipEmptyParts); for (QString &w : words) invertedIndexMap[w].insert(i); } // Convert back to vector for fast random access search algorithms for (InvertedIndexMap::const_iterator i = invertedIndexMap.cbegin(); i != invertedIndexMap.cend(); ++i) _invertedIndex.push_back(QPair<QString, QSet<Service::Item*>>(i.key(), i.value())); std::sort(_invertedIndex.begin(), _invertedIndex.end(), CaseInsensitiveCompare()); _invertedIndex.squeeze(); }