bool TranslationMemoryImpl::Search(const std::wstring& lang, const std::wstring& source, Results& results, int maxHits) { try { if (maxHits <= 0) maxHits = DEFAULT_MAXHITS; results.clear(); Lucene::String fieldName(L"source"); auto boolQ = newLucene<BooleanQuery>(); auto phraseQ = newLucene<PhraseQuery>(); auto stream = m_analyzer->tokenStream(fieldName, newLucene<StringReader>(source)); while (stream->incrementToken()) { auto word = stream->getAttribute<TermAttribute>()->term(); auto term = newLucene<Term>(fieldName, word); boolQ->add(newLucene<TermQuery>(term), BooleanClause::SHOULD); phraseQ->add(term); } auto searcher = newLucene<IndexSearcher>(Reader()); PerformSearch(searcher, lang, phraseQ, results, maxHits); maxHits -= results.size(); if (maxHits > 0) PerformSearch(searcher, lang, boolQ, results, maxHits); return !results.empty(); } catch (LuceneException&) { return false; } }