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