QMap< int, float > FuzzyIndex::search( const Tomahawk::query_ptr& query ) { // QMutexLocker lock( &m_mutex ); QMap< int, float > resultsmap; if ( !m_luceneReader || !m_luceneSearcher ) return resultsmap; try { // float minScore = 0.00; Collection<String> fields; // = newCollection<String>(); MultiFieldQueryParserPtr parser = newLucene<MultiFieldQueryParser>( LuceneVersion::LUCENE_CURRENT, fields, m_analyzer ); BooleanQueryPtr qry = newLucene<BooleanQuery>(); if ( query->isFullTextQuery() ) { const QString q = Tomahawk::DatabaseImpl::sortname( query->fullTextQuery() ); FuzzyQueryPtr fqry = newLucene<FuzzyQuery>( newLucene<Term>( L"track", q.toStdWString() ) ); qry->add( boost::dynamic_pointer_cast<Query>( fqry ), BooleanClause::SHOULD ); FuzzyQueryPtr fqry2 = newLucene<FuzzyQuery>( newLucene<Term>( L"artist", q.toStdWString() ) ); qry->add( boost::dynamic_pointer_cast<Query>( fqry2 ), BooleanClause::SHOULD ); FuzzyQueryPtr fqry3 = newLucene<FuzzyQuery>( newLucene<Term>( L"fulltext", q.toStdWString() ) ); qry->add( boost::dynamic_pointer_cast<Query>( fqry3 ), BooleanClause::SHOULD ); } else { const QString track = Tomahawk::DatabaseImpl::sortname( query->queryTrack()->track() ); const QString artist = Tomahawk::DatabaseImpl::sortname( query->queryTrack()->artist() ); //QString album = Tomahawk::DatabaseImpl::sortname( query->queryTrack()->album() ); FuzzyQueryPtr fqry = newLucene<FuzzyQuery>( newLucene<Term>( L"track", track.toStdWString() ), 0.5, 3 ); qry->add( boost::dynamic_pointer_cast<Query>( fqry ), BooleanClause::MUST ); FuzzyQueryPtr fqry2 = newLucene<FuzzyQuery>( newLucene<Term>( L"artist", artist.toStdWString() ), 0.5, 3 ); qry->add( boost::dynamic_pointer_cast<Query>( fqry2 ), BooleanClause::MUST ); } TopScoreDocCollectorPtr collector = TopScoreDocCollector::create( 20, true ); m_luceneSearcher->search( qry, collector ); Collection<ScoreDocPtr> hits = collector->topDocs()->scoreDocs; for ( int i = 0; i < collector->getTotalHits() && i < 20; i++ ) { DocumentPtr d = m_luceneSearcher->doc( hits[i]->doc ); const float score = hits[i]->score; const int id = QString::fromStdWString( d->get( L"trackid" ) ).toInt(); // if ( score > minScore ) { resultsmap.insert( id, score ); // tDebug() << "Index hit:" << id << score << QString::fromWCharArray( ((Query*)qry)->toString() ); } } } catch( LuceneException& error ) { tDebug() << "Caught Lucene error:" << QString::fromWCharArray( error.getError().c_str() ) << query->toString(); } return resultsmap; }
TEST_F(SimpleExplanationsOfNonMatchesTest, testBQ17) { BooleanQueryPtr q = newLucene<BooleanQuery>(true); q->add(qp->parse(L"w2"), BooleanClause::SHOULD); q->add(qp->parse(L"w1 -xx"), BooleanClause::SHOULD); qtest(q, newCollection<int32_t>(0, 1, 2, 3)); }