コード例 #1
0
            public WeightedPhraseInfo(LinkedList <TermInfo> terms, float boost, int number)
            {
                this.boost   = boost;
                this.seqnum  = number;
                termsOffsets = new List <Toffs>(terms.Count);
                TermInfo ti = terms.First.Value;

                termsOffsets.Add(new Toffs(ti.GetStartOffset(), ti.GetEndOffset()));
                if (terms.Count == 1)
                {
                    text = ti.GetText();
                    return;
                }
                StringBuilder sb = new StringBuilder();

                sb.Append(ti.GetText());
                int pos = ti.GetPosition();

                bool dummy = true;

                foreach (TermInfo ti2 in terms)
                //for (int i = 1; i < terms.Count; i++)
                {
                    if (dummy)
                    {
                        dummy = false; continue;
                    }                                       //Skip First Item {{DIGY}}
                    ti = ti2;
                    //ti = terms.get(i);
                    sb.Append(ti.GetText());
                    if (ti.GetPosition() - pos == 1)
                    {
                        Toffs to = termsOffsets[termsOffsets.Count - 1];
                        to.SetEndOffset(ti.GetEndOffset());
                    }
                    else
                    {
                        termsOffsets.Add(new Toffs(ti.GetStartOffset(), ti.GetEndOffset()));
                    }
                    pos = ti.GetPosition();
                }
                text = sb.ToString();
            }
コード例 #2
0
        /// <summary>
        /// a constructor.
        /// </summary>
        /// <param name="fieldTermStack">FieldTermStack object</param>
        /// <param name="fieldQuery">FieldQuery object</param>
        public FieldPhraseList(FieldTermStack fieldTermStack, FieldQuery fieldQuery)
        {
            String field = fieldTermStack.GetFieldName();

            LinkedList <TermInfo> phraseCandidate = new LinkedList <TermInfo>();
            QueryPhraseMap        currMap         = null;
            QueryPhraseMap        nextMap         = null;

            while (!fieldTermStack.IsEmpty())
            {
                phraseCandidate.Clear();

                TermInfo ti = fieldTermStack.Pop();
                currMap = fieldQuery.GetFieldTermMap(field, ti.GetText());

                // if not found, discard top TermInfo from stack, then try next element
                if (currMap == null)
                {
                    continue;
                }

                // if found, search the longest phrase
                phraseCandidate.AddLast(ti);
                while (true)
                {
                    ti      = fieldTermStack.Pop();
                    nextMap = null;
                    if (ti != null)
                    {
                        nextMap = currMap.GetTermMap(ti.GetText());
                    }
                    if (ti == null || nextMap == null)
                    {
                        if (ti != null)
                        {
                            fieldTermStack.Push(ti);
                        }
                        if (currMap.IsValidTermOrPhrase(new List <TermInfo>(phraseCandidate)))
                        {
                            AddIfNoOverlap(new WeightedPhraseInfo(phraseCandidate, currMap.GetBoost(), currMap.GetTermOrPhraseNumber()));
                        }
                        else
                        {
                            while (phraseCandidate.Count > 1)
                            {
                                TermInfo last = phraseCandidate.Last.Value;
                                phraseCandidate.RemoveLast();
                                fieldTermStack.Push(last);
                                currMap = fieldQuery.SearchPhrase(field, new List <TermInfo>(phraseCandidate));
                                if (currMap != null)
                                {
                                    AddIfNoOverlap(new WeightedPhraseInfo(phraseCandidate, currMap.GetBoost(), currMap.GetTermOrPhraseNumber()));
                                    break;
                                }
                            }
                        }
                        break;
                    }
                    else
                    {
                        phraseCandidate.AddLast(ti);
                        currMap = nextMap;
                    }
                }
            }
        }