Exemple #1
0
void IndexWriter::close()
{
    if (m_pDocConsumer.isNotNull())
    {
        FX_TRACE("Close index writer");

        m_pDocConsumer->stop();
        m_pDocConsumer.reset();

        m_pKeeper->waitCommit();

        ///perform last merge
        if (m_pIndexMerger.isNotNull())
        {
            CommittablePtr pCommitObj = m_pIndexMerger.cast<Committable>();
            m_pCommitScheduler->commit(pCommitObj);
            m_pCommitScheduler->waitCommit();
            m_pIndexMerger.reset();
        }

        m_pCommitScheduler->close();
        m_pCommitScheduler.reset();
    }

    if (m_pAutoCommitTask.isNotNull())
    {
        m_pAutoCommitTask->stop();
        m_autoCommitThread.join();
        m_pAutoCommitTask.reset();
    }
}
void EvHttpSyncClient::get(const std::string& sURI)
{
    struct evhttp_request* pReq = newReqest();
    if (!pReq)
    {
        setError(ST_ERROR, "new request FAILED");
        return ;
    }

    int rv = evhttp_make_request(m_pConn, pReq, EVHTTP_REQ_GET, sURI.c_str());
    if (rv != 0) 
    {
        FX_LOG(ERROR, "evhttp_make_request FAILED");
        setError(ST_ERROR, "evhttp_make_request FAILED");
        return;
    }

    rv = event_base_dispatch(m_evbase);
    if (rv != 0)
    {
        setError(ST_ERROR, "event loop failed");
        FX_LOG(ERROR, "event loop failed: [%d]", rv);
    }

    FX_TRACE("made request: [%s]", sURI.c_str());
    return ;
}
Exemple #3
0
void DocPostingMerger::doMerge(const MergingTerm* pTerm)
{
    docid_t docBuffer[RECORD_SIZE];
    docid_t tfBuffer[RECORD_SIZE];

    PostingDecoderPtr pDecoder = pTerm->getPostingIterator()->getPostingDecoder();
    const DocIdRecycling* pDocIdRecycle = pTerm->getDocIdRecycling();
    if (pDocIdRecycle->hasDeletions())
    {
        docid_t baseDocId = pTerm->getNewBaseDocId();
        uint32_t nDecoded = 0;
        docid_t lastDocId = 0;
        while ((nDecoded = pDecoder->decodeDocRecord(docBuffer, lastDocId)) > 0)
        {
            if (pDecoder->decodeTfRecord(tfBuffer) != nDecoded)
            {
                FIRTEX_THROW(IndexCollapseException,
                             "Doc and Tf record is inconsistant.");
            }

            lastDocId = docBuffer[nDecoded - 1] + 1;

            size_t i, j;
            for (i = 0, j = 0; j < nDecoded; ++j)
            {
                docid_t docId = docBuffer[j];
                docid_t newDocId = pDocIdRecycle->remap(docId);
                if (newDocId != INVALID_DOCID)
                {
                    docBuffer[i] = newDocId;
                    tfBuffer[i] = tfBuffer[j];
                    ++i;
                }
            }
            if (i > 0)
            {
                commitDocuments(baseDocId, docBuffer, tfBuffer, (uint32_t)i);
            }
        }
    }
    else
    {
        docid_t baseDocId = pTerm->getNewBaseDocId();
        uint32_t nDecoded = 0;
        docid_t lastDocId = 0;
        FX_TRACE("Merge doc list: base doc id: %d", baseDocId);

        while ((nDecoded = pDecoder->decodeDocRecord(docBuffer, lastDocId)) > 0)
        {
            if (pDecoder->decodeTfRecord(tfBuffer) != nDecoded)
            {
                FIRTEX_THROW(IndexCollapseException,
                             "Doc and Tf record is inconsistant.");
            }
            commitDocuments(baseDocId, docBuffer, tfBuffer, nDecoded);
            lastDocId = docBuffer[nDecoded - 1] + 1;
        }
    }
}
bool IndexBarrelKeeper::deleteOnDiskDocument(const char* szPrimKey)
{
    ScopedRWLock lock(m_lock, false);
    if (!m_pOnDiskPrimKeyIndex)
    {
        return false;
    }

    docid_t docId = m_pOnDiskPrimKeyIndex->lookup(szPrimKey);
    if (docId != INVALID_DOCID)
    {
        FX_TRACE("Delete on-disk document: [%s]->[%d]", szPrimKey, docId);
        return m_pOnDiskDocFilter->deleteDocument(docId);
    }
    return false;
}
Exemple #5
0
void DocPostingMerger::commitDocuments(docid_t baseDocId, docid_t* docBuffer,
                                       tf_t* tfBuffer, uint32_t nSize)
{
    FX_TRACE("commit documents: last committed doc: %d, base doc id: %d, "
             "first doc: %d, length: %d",
             m_lastDocId, baseDocId, docBuffer[0], (int32_t)nSize);

    if (m_nUpTo == RECORD_SIZE)
    {
        flushBuffer(false);
    }

    m_pDocBuffer[m_nUpTo] = docBuffer[0] + baseDocId - m_lastDocId;
    m_lastDocId = docBuffer[0] + baseDocId;

    ctf_t totalTf = tfBuffer[0];
    m_pTfBuffer[m_nUpTo] = (tf_t)totalTf;
    ++m_nUpTo;

    tf_t tf;
    for (uint32_t i = 1; i < nSize; ++i)
    {
        if (m_nUpTo == RECORD_SIZE)
        {
            getTermMeta().getCTF() += totalTf;
            flushBuffer(false);
            totalTf = 0;
        }
        m_pDocBuffer[m_nUpTo] = docBuffer[i] - docBuffer[i - 1];
        tf = tfBuffer[i];
        m_pTfBuffer[m_nUpTo] = tf;
        totalTf += tf;
        m_lastDocId = docBuffer[i] + baseDocId;
        ++m_nUpTo;
    }

    TermMeta& termMeta = getTermMeta();
    termMeta.getDocFreq() += nSize;
    termMeta.getCTF() += totalTf;

    m_curTermFreq = 0;
}
Exemple #6
0
void QueryExecutor::execute(HitCollectorPtr& pCollector,
                            ScorerPtr& pScorer,
                            const QueryTracerPtr& pTracer)
{
    //TODO: allocate from mempool
    MatchedDocSet machedDocs(m_pPool, DEFAULT_MATCHED_DOC_BUFFER_SIZE, size());
    machedDocs.setTracer(pTracer);

    QueryFeature queryFeature;
    queryFeature.reserve(size());
    extractFeature(queryFeature);

    pScorer->beginQuery(m_pFeatureProvider, queryFeature);
    while (advance(machedDocs) > 0)
    {
        FX_TRACE("Matched doc count: [%u]", (uint32_t)machedDocs.size());
        pScorer->score(machedDocs);
        pCollector->collect(machedDocs);
        machedDocs.reset();
    }
    pScorer->endQuery();
}