Пример #1
0
        public FieldTermStack(IndexReader reader, int docId, String fieldName, FieldQuery fieldQuery)
        {
            this.fieldName = fieldName;

            TermFreqVector tfv = reader.GetTermFreqVector(docId, fieldName);

            if (tfv == null)
            {
                return;              // just return to make null snippets
            }
            TermPositionVector tpv = null;

            try
            {
                tpv = (TermPositionVector)tfv;
            }
            catch (InvalidCastException e)
            {
                return; // just return to make null snippets
            }

            List <String> termSet = fieldQuery.getTermSet(fieldName);

            // just return to make null snippet if un-matched fieldName specified when fieldMatch == true
            if (termSet == null)
            {
                return;
            }

            foreach (String term in tpv.GetTerms())
            {
                if (!termSet.Contains(term))
                {
                    continue;
                }
                int index = tpv.IndexOf(term);
                TermVectorOffsetInfo[] tvois = tpv.GetOffsets(index);
                if (tvois == null)
                {
                    return;                // just return to make null snippets
                }
                int[] poss = tpv.GetTermPositions(index);
                if (poss == null)
                {
                    return;               // just return to make null snippets
                }
                for (int i = 0; i < tvois.Length; i++)
                {
                    termList.AddLast(new TermInfo(term, tvois[i].GetStartOffset(), tvois[i].GetEndOffset(), poss[i]));
                }
            }

            // sort by position
            //Collections.sort(termList);
            Sort(termList);
        }
Пример #2
0
        private static List <DataForIndex> getResult(List <DataForIndex> dfi, ScoreDoc[] hits, string term, IndexSearcher searcher, Query query, MultiFieldQueryParser parser)
        {
            if (hits.Length == 0)
            {
                term  = searchByPartialWords(term);
                query = parseQuery(term, parser);
                hits  = searcher.Search(query, 100).ScoreDocs;
            }
            foreach (var scoreDoc in hits)
            {
                var          doc      = searcher.Doc(scoreDoc.Doc);
                var          score    = scoreDoc.Score;
                DataForIndex listdata = new DataForIndex();
                listdata.ID            = int.Parse(doc.Get("ID"));
                listdata.FileName      = doc.Get("FileName");
                listdata.SearchWord    = term;
                listdata.FileExtension = doc.Get("FileExtension");
                listdata.AudioGenre    = doc.Get("AudioGenre");
                listdata.AudioAlbum    = doc.Get("AudioAlbum");
                listdata.AudioBitrate  = doc.Get("AudioBitrate");
                listdata.AudioDuration = doc.Get("AudioDuration");
                listdata.Label         = doc.Get("Label");
                if (isFarsiArabic)
                {
                    listdata.IsFarsiArabic = true;
                    listdata.HarfArabic    = HarfArabic;
                    listdata.HarfFarsi     = HarfFarsi;
                }
                listdata.Score = score;
                TermPositionVector obj_vector =
                    (TermPositionVector)searcher.IndexReader.GetTermFreqVector(scoreDoc.Doc, "Body");
                int int_phraseIndex = obj_vector.IndexOf(term.Split(' ').FirstOrDefault());
                TermVectorOffsetInfo[] obj_offsetInfo = obj_vector.GetOffsets(int_phraseIndex);
                StringBuilder          text           = new StringBuilder();
                for (int i = 0; i < obj_offsetInfo.Length; i++)
                {
                    string body  = doc.Get("Body");
                    int    start = obj_offsetInfo[i].StartOffset;
                    int    end   = body.Length;
                    int    count = 100;
                    if (start + count <= end)
                    {
                        end = start + count;
                    }

                    if (start > count)
                    {
                        start = start - count;
                    }
                    else
                    {
                        start = 0;
                    }
                    text.Append(body.Substring(start, end - start) + " # ");
                }
                listdata.ResultText = text.ToString();
                if (dfi.FirstOrDefault(x => x.FileName == listdata.FileName) == null)
                {
                    dfi.Add(listdata);
                }
                else
                {
                    var del = dfi.FirstOrDefault(x => x.FileName == listdata.FileName);
                    dfi.Remove(del);
                    del.SearchWord = del.SearchWord + " + " + listdata.SearchWord;
                    del.ResultText = del.ResultText + " " + listdata.ResultText;
                    dfi.Add(del);
                }
            }
            return(dfi);
        }
Пример #3
0
        public FieldTermStack(IndexReader reader, int docId, String fieldName, FieldQuery fieldQuery, IState state)
        {
            this.fieldName = fieldName;

            var tfv = reader.GetTermFreqVector(docId, fieldName, state);

            if (tfv == null)
            {
                return; // just return to make null snippets
            }
            TermPositionVector tpv = null;

            try
            {
                tpv = (TermPositionVector)tfv;
            }
            catch (InvalidCastException)
            {
                return; // just return to make null snippets
            }

            List <String> termSet = fieldQuery.getTermSet(fieldName);

            // just return to make null snippet if un-matched fieldName specified when fieldMatch == true
            if (termSet == null)
            {
                return;
            }
            var needwildcard = termSet.Any(x => x.IndexOfAny(new char[] { '*', '?' }) != -1);

            foreach (String term in tpv.GetTerms())
            {
                if (needwildcard)
                {
                    if (termSet.Any(ts => WildcardMatcher.Matches(ts, term)) == false)
                    {
                        continue;
                    }
                }
                else if (!termSet.Contains(term))
                {
                    continue;
                }

                int index = tpv.IndexOf(term);
                TermVectorOffsetInfo[] tvois = tpv.GetOffsets(index);
                if (tvois == null)
                {
                    return; // just return to make null snippets
                }
                int[] poss = tpv.GetTermPositions(index);
                if (poss == null)
                {
                    return; // just return to make null snippets
                }
                for (int i = 0; i < tvois.Length; i++)
                {
                    termList.AddLast(new TermInfo(term, tvois[i].StartOffset, tvois[i].EndOffset, poss[i]));
                }
            }

            // sort by position
            //Collections.sort(termList);
            Sort(termList);
        }