private static string FormatHit(BrowseHit hit) { var sb = new StringBuilder(); var fields = hit.FieldValues; var keys = fields.Keys; foreach (string key in keys) { sb.Append("\t" + key + " :"); string[] values = fields[key]; foreach (var value in values) { sb.Append(" " + value); } sb.AppendLine(); } return sb.ToString(); }
private static string FormatHit(BrowseHit hit) { var sb = new StringBuilder(); var fields = hit.FieldValues; var keys = fields.Keys; foreach (string key in keys) { sb.Append("\t" + key + " :"); string[] values = fields[key]; foreach (var value in values) { sb.Append(" " + value); } sb.AppendLine(); } return(sb.ToString()); }
protected static BrowseHit[] BuildHits(MyScoreDoc[] scoreDocs, SortField[] sortFields, IDictionary <string, IFacetHandler> facetHandlerMap, bool fetchStoredFields, IEnumerable <string> termVectorsToFetch, IFacetHandler groupBy, CombinedFacetAccessible[] groupAccessibles) { BrowseHit[] hits = new BrowseHit[scoreDocs.Length]; IEnumerable <IFacetHandler> facetHandlers = facetHandlerMap.Values; for (int i = scoreDocs.Length - 1; i >= 0; i--) { MyScoreDoc fdoc = scoreDocs[i]; BoboIndexReader reader = fdoc.reader; BrowseHit hit = new BrowseHit(); if (fetchStoredFields) { hit.StoredFields = reader.Document(fdoc.Doc); } if (termVectorsToFetch != null && termVectorsToFetch.Count() > 0) { var tvMap = new Dictionary <string, BrowseHit.TermFrequencyVector>(); hit.TermFreqMap = tvMap; foreach (string field in termVectorsToFetch) { ITermFreqVector tv = reader.GetTermFreqVector(fdoc.Doc, field); if (tv != null) { int[] freqs = tv.GetTermFrequencies(); string[] terms = tv.GetTerms(); tvMap[field] = new BrowseHit.TermFrequencyVector(terms, freqs); } } } var map = new Dictionary <string, string[]>(); var rawMap = new Dictionary <string, object[]>(); foreach (var facetHandler in facetHandlers) { map[facetHandler.Name] = facetHandler.GetFieldValues(reader, fdoc.Doc); rawMap[facetHandler.Name] = facetHandler.GetRawFieldValues(reader, fdoc.Doc); } hit.FieldValues = map; hit.RawFieldValues = rawMap; hit.DocId = fdoc.Doc + fdoc.queue.@base; hit.Score = fdoc.Score; hit.Comparable = fdoc.Value; if (groupBy != null) { hit.GroupField = groupBy.Name; hit.GroupValue = hit.GetField(groupBy.Name); hit.RawGroupValue = hit.GetRawField(groupBy.Name); if (groupAccessibles != null && hit.GroupValue != null && groupAccessibles != null && groupAccessibles.Length > 0) { BrowseFacet facet = groupAccessibles[0].GetFacet(hit.GroupValue); hit.GroupHitsCount = facet.FacetValueHitCount; } } hits[i] = hit; } return(hits); }
protected static BrowseHit[] BuildHits(MyScoreDoc[] scoreDocs, SortField[] sortFields, IDictionary <string, IFacetHandler> facetHandlerMap, bool fetchStoredFields, ICollection <string> termVectorsToFetch, IFacetHandler groupBy, CombinedFacetAccessible[] groupAccessibles) { BrowseHit[] hits = new BrowseHit[scoreDocs.Length]; IEnumerable <IFacetHandler> facetHandlers = facetHandlerMap.Values; for (int i = scoreDocs.Length - 1; i >= 0; i--) { MyScoreDoc fdoc = scoreDocs[i]; BoboSegmentReader reader = fdoc.m_reader; BrowseHit hit = new BrowseHit(); if (fetchStoredFields) { hit.SetStoredFields(reader.Document(fdoc.Doc)); } if (termVectorsToFetch != null && termVectorsToFetch.Count > 0) { var tvMap = new Dictionary <string, IList <BrowseHit.BoboTerm> >(); hit.TermVectorMap = tvMap; Fields fds = reader.GetTermVectors(fdoc.Doc); foreach (string field in termVectorsToFetch) { Terms terms = fds.GetTerms(field); if (terms == null) { continue; } TermsEnum termsEnum = terms.GetIterator(null); BytesRef text; DocsAndPositionsEnum docsAndPositions = null; List <BrowseHit.BoboTerm> boboTermList = new List <BrowseHit.BoboTerm>(); while ((text = termsEnum.Next()) != null) { BrowseHit.BoboTerm boboTerm = new BrowseHit.BoboTerm(); boboTerm.Term = text.Utf8ToString(); boboTerm.Freq = (int)termsEnum.TotalTermFreq; docsAndPositions = termsEnum.DocsAndPositions(null, docsAndPositions); if (docsAndPositions != null) { docsAndPositions.NextDoc(); boboTerm.Positions = new List <int>(); boboTerm.StartOffsets = new List <int>(); boboTerm.EndOffsets = new List <int>(); for (int t = 0; t < boboTerm.Freq; ++t) { boboTerm.Positions.Add(docsAndPositions.NextPosition()); boboTerm.StartOffsets.Add(docsAndPositions.StartOffset); boboTerm.EndOffsets.Add(docsAndPositions.EndOffset); } } boboTermList.Add(boboTerm); } tvMap.Put(field, boboTermList); } } var map = new Dictionary <string, string[]>(); var rawMap = new Dictionary <string, object[]>(); foreach (var facetHandler in facetHandlers) { map[facetHandler.Name] = facetHandler.GetFieldValues(reader, fdoc.Doc); rawMap[facetHandler.Name] = facetHandler.GetRawFieldValues(reader, fdoc.Doc); } hit.FieldValues = map; hit.RawFieldValues = rawMap; hit.DocId = fdoc.Doc + fdoc.m_queue.m_base; hit.Score = fdoc.Score; hit.Comparable = fdoc.Value; if (groupBy != null) { hit.GroupField = groupBy.Name; hit.GroupValue = hit.GetField(groupBy.Name); hit.RawGroupValue = hit.GetRawField(groupBy.Name); if (groupAccessibles != null && hit.GroupValue != null && groupAccessibles != null && groupAccessibles.Length > 0) { BrowseFacet facet = groupAccessibles[0].GetFacet(hit.GroupValue); hit.GroupHitsCount = facet.FacetValueHitCount; } } hits[i] = hit; } return(hits); }
static void Main(string[] args) { Lucene.Net.Util.Version version = Lucene.Net.Util.Version.LUCENE_29; var dir = new RAMDirectory(); Analyzer analyzer = new PerFieldAnalyzerWrapper(new StandardAnalyzer(version), new Dictionary <string, Analyzer> { { "organization", new KeywordAnalyzer() } }); // Add content to the index var indexWriter = new IndexWriter(dir, analyzer, IndexWriter.MaxFieldLength.UNLIMITED); foreach (var document in CreateDocuments(CreateTestData())) { indexWriter.AddDocument(document); } indexWriter.Commit(); indexWriter.Dispose(); var orgFieldName = "organization"; var titleFieldName = "title"; var createdAtName = "created_at"; var rangeFacetName = "rangeFacet"; //var orgFacetHandler = new PathFacetHandler(orgFieldName); //orgFacetHandler.SetSeparator("/"); var orgFacetHandler = new MultiValueFacetHandler(orgFieldName); FacetHandler titleFacetHandler = new MultiValueFacetHandler(titleFieldName); var createdAtFacetHandler = new SimpleFacetHandler(createdAtName); //var ranges = new List<string> { "[2000/01/01 TO 2000/12/30]", "[2001/01/01 TO 2007/12/30]" }; var ranges = new List <string> { "[20000101 TO 20001230]", "[20040101 TO *]" }; var rangeFacetHandler = new RangeFacetHandler(rangeFacetName, createdAtName, ranges); IndexReader reader = IndexReader.Open(dir, true); // decorate it with a bobo index reader BoboIndexReader boboReader = BoboIndexReader.GetInstance(reader, new[] { orgFacetHandler, titleFacetHandler, createdAtFacetHandler, rangeFacetHandler }); // creating a browse request var browseRequest = new BrowseRequest { Count = 10, Offset = 0, FetchStoredFields = true }; // add a selection //var orgSelection = new BrowseSelection(orgFieldName); //orgSelection.AddValue("A/B"); //browseRequest.AddSelection(orgSelection); var titleSelction = new BrowseSelection(titleFieldName); //titleSelction.AddValue("Læge"); browseRequest.AddSelection(titleSelction); browseRequest.AddSelection(new BrowseSelection(rangeFacetName)); // parse a query var parser = new QueryParser(Lucene.Net.Util.Version.LUCENE_29, "name", new KeywordAnalyzer()); Query q = parser.Parse("an*"); browseRequest.Query = q; // add the facet output specs var orgSpec = new FacetSpec { OrderBy = FacetSpec.FacetSortSpec.OrderValueAsc }; browseRequest.SetFacetSpec(orgFieldName, orgSpec); var titleSpec = new FacetSpec { MinHitCount = 1, OrderBy = FacetSpec.FacetSortSpec.OrderHitsDesc }; browseRequest.SetFacetSpec(titleFieldName, titleSpec); //var createdAtSpec = new FacetSpec { MinHitCount = 1, OrderBy = FacetSpec.FacetSortSpec.OrderHitsDesc }; //browseRequest.SetFacetSpec(createdAtName, createdAtSpec); var rangeSpec = new FacetSpec { MinHitCount = 1, OrderBy = FacetSpec.FacetSortSpec.OrderHitsDesc }; browseRequest.SetFacetSpec(rangeFacetName, rangeSpec); // perform browse IBrowsable browser = new BoboBrowser(boboReader); BrowseResult result = browser.Browse(browseRequest); // Showing results now int totalHits = result.NumHits; BrowseHit[] hits = result.Hits; Dictionary <String, IFacetAccessible> facetMap = result.FacetMap; IFacetAccessible orgFacets = facetMap[orgFieldName]; Console.WriteLine("Facets {0}:", orgFieldName); foreach (BrowseFacet facet in orgFacets.GetFacets()) { Console.WriteLine(facet.ToString()); } IFacetAccessible titleFacets = facetMap[titleFieldName]; Console.WriteLine("Facets {0}:", titleFieldName); foreach (BrowseFacet facet in titleFacets.GetFacets()) { Console.WriteLine(facet.ToString()); } if (facetMap.ContainsKey(createdAtName)) { IFacetAccessible createdAtFacets = facetMap[createdAtName]; Console.WriteLine("Facets {0}:", createdAtName); foreach (BrowseFacet facet in createdAtFacets.GetFacets()) { Console.WriteLine(facet.ToString()); } } if (facetMap.ContainsKey(rangeFacetName)) { Console.WriteLine("-------------------------------------"); IFacetAccessible rangeFacets = facetMap[rangeFacetName]; Console.WriteLine("Facets {0}:", rangeFacets); foreach (BrowseFacet facet in rangeFacets.GetFacets()) { Console.WriteLine(facet.ToString()); } Console.WriteLine("-------------------------------------"); } Console.WriteLine("Actual items (total: {0}) query: {1}:", totalHits, q); for (int i = 0; i < hits.Length; ++i) { BrowseHit browseHit = hits[i]; Console.WriteLine("id = {0}, Name = {1}, Organizations = {{{2}}}, Titles = {{{3}}}, Created at = {4}", browseHit.StoredFields.Get("id"), browseHit.StoredFields.Get("name"), string.Join(", ", browseHit.StoredFields.GetValues("organization").Distinct()), string.Join(", ", browseHit.StoredFields.GetValues("title").Distinct()), browseHit.StoredFields.Get("created_at")); } }
public virtual BrowseHit[] BuildHits(FieldDocEntry[] fdocs) { BrowseHit[] hits = new BrowseHit[fdocs.Length]; int i = 0; ICollection<FacetHandler> facetHandlers = reader.GetFacetHandlerMap().Values; foreach (FieldDocEntry fdoc in fdocs) { BrowseHit hit = new BrowseHit(); if (fetchStoredFields) { hit.StoredFields = reader.Document(fdoc.Doc); } Dictionary<string, string[]> map = new Dictionary<string, string[]>(); foreach (FacetHandler facetHandler in facetHandlers) { map.Add(facetHandler.Name, facetHandler.GetFieldValues(fdoc.Doc)); } hit.FieldValues = map; hit.DocId = fdoc.Doc; hit.Score = fdoc.Score; foreach (SortField f in sortFields) { if (f.Type != SortField.SCORE && f.Type != SortField.DOC) { string fieldName = f.Field; FieldComparator comparator; hitQueue.comparatorMap.TryGetValue(fieldName, out comparator); if (comparator != null) { hit.AddComparable(fieldName, comparator[fdoc.Slot]); } } } hits[i++] = hit; } FillInRuntimeFacetValues(hits); return hits; }
private void FillInRuntimeFacetValues(BrowseHit[] hits) { ICollection<FacetHandler> runtimeFacetHandlers = boboBrowser.GetRuntimeFacetHandlerMap().Values; foreach (BrowseHit hit in hits) { Dictionary<string, string[]> map = hit.FieldValues; int docid = hit.DocId; foreach (FacetHandler facetHandler in runtimeFacetHandlers) { string[] values = facetHandler.GetFieldValues(docid); if (values != null) { map.Add(facetHandler.Name, values); } } } }