public override void Add(K key, WeightedSpanTerm value) { base.Add(key, value); WeightedSpanTerm prev = this[key]; if (prev == null) { return; } WeightedSpanTerm prevTerm = prev; WeightedSpanTerm newTerm = value; if (!prevTerm.IsPositionSensitive()) { newTerm.SetPositionSensitive(false); } }
/// <summary> /// Extracts the weighted span terms. /// </summary> /// <param name="terms">The terms.</param> /// <param name="spanQuery">The span query.</param> private void ExtractWeightedSpanTerms(IDictionary <String, WeightedSpanTerm> terms, SpanQuery spanQuery) { HashSet <String> fieldNames; if (fieldName == null) { fieldNames = new HashSet <String>(); CollectSpanQueryFields(spanQuery, fieldNames); } else { fieldNames = new HashSet <String>(); fieldNames.Add(fieldName); } // To support the use of the default field name if (defaultField != null) { fieldNames.Add(defaultField); } IDictionary <String, SpanQuery> queries = new HashMap <String, SpanQuery>(); var nonWeightedTerms = new HashSet <Term>(); bool mustRewriteQuery = MustRewriteQuery(spanQuery); if (mustRewriteQuery) { foreach (String field in fieldNames) { SpanQuery rewrittenQuery = (SpanQuery)spanQuery.Rewrite(GetReaderForField(field)); queries[field] = rewrittenQuery; rewrittenQuery.ExtractTerms(nonWeightedTerms); } } else { spanQuery.ExtractTerms(nonWeightedTerms); } List <PositionSpan> spanPositions = new List <PositionSpan>(); foreach (String field in fieldNames) { IndexReader reader = GetReaderForField(field); Spans spans; if (mustRewriteQuery) { spans = queries[field].GetSpans(reader); } else { spans = spanQuery.GetSpans(reader); } // collect span positions while (spans.Next()) { spanPositions.Add(new PositionSpan(spans.Start(), spans.End() - 1)); } } if (spanPositions.Count == 0) { // no spans found return; } foreach (Term queryTerm in nonWeightedTerms) { if (FieldNameComparator(queryTerm.Field)) { WeightedSpanTerm weightedSpanTerm = terms[queryTerm.Text]; if (weightedSpanTerm == null) { weightedSpanTerm = new WeightedSpanTerm(spanQuery.Boost, queryTerm.Text); weightedSpanTerm.AddPositionSpans(spanPositions); weightedSpanTerm.SetPositionSensitive(true); terms[queryTerm.Text] = weightedSpanTerm; } else { if (spanPositions.Count > 0) { weightedSpanTerm.AddPositionSpans(spanPositions); } } } } }