sql >> Databáze >  >> NoSQL >> MongoDB

Jak MongoDB zpracovává délku dokumentu v textovém indexu a textovém skóre?

Bodování je založeno na počtu odložených zápasů, ale je zde také vestavěný koeficient, který upravuje skóre zápasů vzhledem k celkové délce pole (s odstraněnými stopwords). Pokud váš delší text obsahuje více relevantních slov k dotazu, přidá se skóre. Delší text, který neodpovídá dotazu, sníží skóre.

Úryvek ze zdrojového kódu MongoDB 3.2 na GitHubu (src/mongo/db/fts/fts_spec.cpp ):

   for (ScoreHelperMap::const_iterator i = terms.begin(); i != terms.end(); ++i) {
        const string& term = i->first;
        const ScoreHelperStruct& data = i->second;

        // in order to adjust weights as a function of term count as it
        // relates to total field length. ie. is this the only word or
        // a frequently occuring term? or does it only show up once in
        // a long block of text?

        double coeff = (0.5 * data.count / numTokens) + 0.5;

        // if term is identical to the raw form of the
        // field (untokenized) give it a small boost.
        double adjustment = 1;
        if (raw.size() == term.length() && raw.equalCaseInsensitive(term))
            adjustment += 0.1;

        double& score = (*docScores)[term];
        score += (weight * data.freq * coeff * adjustment);
        verify(score <= MAX_WEIGHT);
    }
}

Nastavení některých testovacích dat, abyste viděli účinek délkového koeficientu na velmi jednoduchém příkladu:

db.articles.insert([
    { headline: "Rock" },
    { headline: "Rocks" },
    { headline: "Rock paper" },
    { headline: "Rock paper scissors" },
])

db.articles.createIndex({ "headline": "text"})

db.articles.find(
    { $text: { $search: "rock" }},
    { _id:0, headline:1, score: { $meta: "textScore" }}
).sort({ score: { $meta: "textScore" }})

Výsledky s poznámkami:

// Exact match of raw term to indexed field
// Coefficent is 1, plus 0.1 bonus for identical match of raw term
{
  "headline": "Rock",
  "score": 1.1
}

// Match of stemmed term to indexed field ("rocks" stems to "rock")
// Coefficent is 1
{
  "headline": "Rocks",
  "score": 1
}

// Two terms, one matching
// Coefficient is 0.75: (0.5 * 1 match / 2 terms) + 0.5
{
  "headline": "Rock paper",
  "score": 0.75
}

// Three terms, one matching
// Coefficient is 0.66: (0.5 * 1 match / 3 terms) + 0.5
{
  "headline": "Rock paper scissors",
  "score": 0.6666666666666666
}


  1. Duplikování funkcí okna PostgreSQL, jako je lag, lead, over

  2. Jak používat agregaci MongoDB pro stránkování?

  3. show dbs dává Not Authorized to error error

  4. Catbox-redis zobrazuje chybu odpojení v mé aplikaci hapijs