protected override DriverResult Display(RelatedContentPart part, string displayType, dynamic shapeHelper) { // Put all your driver logic inside this method so that if your part is not being displayed no logic is run. Yay efficiency return(ContentShape("Parts_RelatedContentPart", () => { var settings = part.TypePartDefinition.Settings.GetModel <RelatedContentPartSettings>(); var context = new RelatedContentContext { ContentType = settings.ContentType }; if (!String.IsNullOrWhiteSpace(settings.Fields)) { context.FieldNames = settings.Fields.Split(','); } if (!String.IsNullOrWhiteSpace(settings.Index)) { context.Index = settings.Index; } if (settings.NoOfItems != 0) { context.Count = settings.NoOfItems; } var related = _relatedSerive.GetRelatedItems(part.ContentItem.Id, context); var content = _contentManger.GetMany <IContent>(related.Select(e => e.ContentItemId), VersionOptions.Published, QueryHints.Empty); return shapeHelper.Parts_RelatedContentPart(RelatedContent: content); })); }
public IEnumerable <ISearchHit> GetRelatedItems(int id, RelatedContentContext context) { IndexReader reader = IndexReader.Open(GetDirectory(context.Index), true); var indexSearcher = new IndexSearcher(reader); var analyzer = _analyzerProvider.GetAnalyzer(context.Index); var mlt = new MoreLikeThis(reader) { Boost = true, MinTermFreq = 1, Analyzer = analyzer, MinDocFreq = 1 }; if (context.FieldNames.Length > 0) { mlt.SetFieldNames(context.FieldNames); } var docid = GetDocumentId(id, indexSearcher); Filter filter; BooleanQuery query = (BooleanQuery)mlt.Like(docid); if (!String.IsNullOrWhiteSpace(context.ContentType)) { var contentTypeQuery = new TermQuery(new Term("type", context.ContentType)); query.Add(new BooleanClause(contentTypeQuery, Occur.MUST)); } // exclude same doc var exclude = new TermQuery(new Term("id", id.ToString())); query.Add(new BooleanClause(exclude, Occur.MUST_NOT)); TopDocs simDocs = indexSearcher.Search(query, context.Count); var results = simDocs.ScoreDocs .Select(scoreDoc => new LuceneSearchHit(indexSearcher.Doc(scoreDoc.Doc), scoreDoc.Score)); return(results); }