void IndexTestCase::testTextIndex() { DocumentSchema schema; schema.addUnIndexedField("PATH"); schema.addTextField("CONTENT"); buildIndex(schema, "file1.txt, hello world."); tstring str = getTestPath(); Index index; index.open(str, Index::READ, NULL); IndexReaderPtr pReader = index.acquireReader(); CPPUNIT_ASSERT(pReader != NULL); TermReaderPtr pTermReader = pReader->termReader(); CPPUNIT_ASSERT(pTermReader); TermIteratorPtr pTermIterator = pTermReader->termIterator("CONTENT"); CPPUNIT_ASSERT(pTermIterator != NULL); while (pTermIterator->hasNext()) { TermIterator::TermEntry entry = pTermIterator->next(); const TermMeta& termMeta = entry.postingIterator->getTermMeta(); CPPUNIT_ASSERT_EQUAL((df_t)1, termMeta.getDocFreq()); CPPUNIT_ASSERT_EQUAL((ctf_t)1, termMeta.getCTF()); } Term term("CONTENT", "hello"); TermPostingIteratorPtr pPost = pTermReader->seek(&term); CPPUNIT_ASSERT(pPost); docid_t docId = pPost->skipTo(0); CPPUNIT_ASSERT_EQUAL((docid_t)0, docId); docId = pPost->skipTo(++docId); CPPUNIT_ASSERT_EQUAL((docid_t)INVALID_DOCID, docId); StoredFieldsReaderPtr pDocReader = pReader->createStoredFieldsReader(); CPPUNIT_ASSERT(pDocReader); FieldSelector selector(pReader->getDocSchema(), true, false); ResultDoc resultDoc(0); bool ret = pDocReader->getDocument(selector, resultDoc); CPPUNIT_ASSERT(ret); CPPUNIT_ASSERT(resultDoc.size() > 0); }
void QueryResult::init(const IndexReaderPtr& pIndexReader, const QueryHits& hits) { FieldSelector selector(pIndexReader->getDocSchema(), true, false); init(selector, pIndexReader, hits); }
void HTTPSearchService::handleQuery(const Statement& state, EvHttpRequestContext* pCtx) const { IndexReaderPtr pIndexReader = m_searchRes.getIndexReader(); FIRTEX_ASSERT2(pIndexReader.isNotNull()); try { TimeProbe probe; probe.start(); QueryParser parser(pIndexReader->getAnalyzerMapper(), m_searchRes.getDefaultField()); IndexSearcher searcher(pIndexReader); QueryHitsPtr pHits = searcher.search(state, parser); QueryResult result; if (pHits.isNotNull()) { FieldSelectClausePtr pFieldClause = state.getFieldSelectClause(); QueryClausePtr pQueryClause = state.getQueryClause(); if (pFieldClause.isNotNull() && pQueryClause.isNotNull()) { QueryPtr pQuery = parser.parse(pQueryClause->getQueryString()); FIRTEX_ASSERT2(pQuery.isNotNull()); FieldSelector selector(pIndexReader->getDocSchema()); for (size_t i = 0; i < pFieldClause->getFieldCount(); ++i) { const FieldSelectClause::SnippetParam& param = pFieldClause->getField(i); FieldFilterPtr pFieldFilter; if (param.snippet) { SnippetGenerator* pSnippetGen = new SnippetGenerator(); pFieldFilter.reset(pSnippetGen); if (!pSnippetGen->init(pQuery, parser.getAnalyzerMapper(), param.field, param.preTag, param.postTag, param.separator)) { FX_LOG(ERROR, "Init snippet generator for field: [%s] FAILED", param.field.c_str()); sendErrorMessage("Init snippet generator for field: " + param.field + " FAILED", pCtx); return; } } if (!selector.addField(param.field, pFieldFilter)) { FX_LOG(ERROR, "Invalid field: [%s]", param.field.c_str()); } } result.init(selector, pIndexReader, *pHits); } else { result.init(pIndexReader, *pHits); } } probe.stop(); result.setTimeCost(probe.elapsed() / 1000); FX_QUERY_TRACE(INFO, result.getTracer(), "search phase time [%d]", (int32_t)result.getTimeCost()); stringstream ss; XMLResultFormatter formatter; formatter.format(result, ss); sendResponse(ss.str(), pCtx); } catch(const FirteXException& e) { FX_LOG(ERROR, "Handle request FAILED: [%s], reason: [%s]", pCtx->getQuery().c_str(), e.what().c_str()); sendErrorMessage("Handle request failed", pCtx); } }