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); }
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); }
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); }