func (s *ConjunctionQueryScorer) Score(constituents []*search.DocumentMatch) *search.DocumentMatch { rv := search.DocumentMatch{ ID: constituents[0].ID, } var sum float64 var childrenExplanations []*search.Explanation if s.explain { childrenExplanations = make([]*search.Explanation, len(constituents)) } locations := []search.FieldTermLocationMap{} for i, docMatch := range constituents { sum += docMatch.Score if s.explain { childrenExplanations[i] = docMatch.Expl } if docMatch.Locations != nil { locations = append(locations, docMatch.Locations) } } rv.Score = sum if s.explain { rv.Expl = &search.Explanation{Value: sum, Message: "sum of:", Children: childrenExplanations} } if len(locations) == 1 { rv.Locations = locations[0] } else if len(locations) > 1 { rv.Locations = search.MergeLocations(locations) } return &rv }
func (s *ConstantScorer) Score(id string) *search.DocumentMatch { var scoreExplanation *search.Explanation score := s.constant if s.explain { scoreExplanation = &search.Explanation{ Value: score, Message: fmt.Sprintf("ConstantScore()"), } } // if the query weight isn't 1, multiply if s.queryWeight != 1.0 { score = score * s.queryWeight if s.explain { childExplanations := make([]*search.Explanation, 2) childExplanations[0] = s.queryWeightExplanation childExplanations[1] = scoreExplanation scoreExplanation = &search.Explanation{ Value: score, Message: fmt.Sprintf("weight(^%f), product of:", s.boost), Children: childExplanations, } } } rv := search.DocumentMatch{ ID: id, Score: score, } if s.explain { rv.Expl = scoreExplanation } return &rv }
func (s *TermQueryScorer) Score(termMatch *index.TermFieldDoc) *search.DocumentMatch { var scoreExplanation *search.Explanation // need to compute score var tf float64 if termMatch.Freq < MaxSqrtCache { tf = SqrtCache[int(termMatch.Freq)] } else { tf = math.Sqrt(float64(termMatch.Freq)) } score := tf * termMatch.Norm * s.idf if s.explain { childrenExplanations := make([]*search.Explanation, 3) childrenExplanations[0] = &search.Explanation{ Value: tf, Message: fmt.Sprintf("tf(termFreq(%s:%s)=%d", s.queryField, string(s.queryTerm), termMatch.Freq), } childrenExplanations[1] = &search.Explanation{ Value: termMatch.Norm, Message: fmt.Sprintf("fieldNorm(field=%s, doc=%s)", s.queryField, termMatch.ID), } childrenExplanations[2] = s.idfExplanation scoreExplanation = &search.Explanation{ Value: score, Message: fmt.Sprintf("fieldWeight(%s:%s in %s), product of:", s.queryField, string(s.queryTerm), termMatch.ID), Children: childrenExplanations, } } // if the query weight isn't 1, multiply if s.queryWeight != 1.0 { score = score * s.queryWeight if s.explain { childExplanations := make([]*search.Explanation, 2) childExplanations[0] = s.queryWeightExplanation childExplanations[1] = scoreExplanation scoreExplanation = &search.Explanation{ Value: score, Message: fmt.Sprintf("weight(%s:%s^%f in %s), product of:", s.queryField, string(s.queryTerm), s.queryBoost, termMatch.ID), Children: childExplanations, } } } rv := search.DocumentMatch{ ID: termMatch.ID, Score: score, } if s.explain { rv.Expl = scoreExplanation } if termMatch.Vectors != nil && len(termMatch.Vectors) > 0 { rv.Locations = make(search.FieldTermLocationMap) for _, v := range termMatch.Vectors { tlm := rv.Locations[v.Field] if tlm == nil { tlm = make(search.TermLocationMap) } loc := search.Location{ Pos: float64(v.Pos), Start: float64(v.Start), End: float64(v.End), } locations := tlm[s.queryTerm] if locations == nil { locations = make(search.Locations, 1) locations[0] = &loc } else { locations = append(locations, &loc) } tlm[s.queryTerm] = locations rv.Locations[v.Field] = tlm } } return &rv }