Beispiel #1
0
        private void ReindexVariations(IEnumerable <string> variantCodes)
        {
            var clients = _vulcanHandler.GetClients();

            if (clients?.Any() != true)
            {
                return;
            }

            var codes = variantCodes as IList <string> ?? variantCodes.ToList();

            foreach (var client in clients)
            {
                foreach (var variantCode in codes)
                {
                    var variantLink = _referenceConverter.GetContentLink(variantCode);

                    if (ContentReference.IsNullOrEmpty(variantLink))
                    {
                        continue;
                    }

                    var variant = _contentLoader.Get <IContent>(variantLink, client.Language);

                    if (variant == null)
                    {
                        continue;
                    }

                    var existing = client.SearchContent <VariationContent>(s => s.Query(q => q.Term(v => v.Code, variantCode)));

                    if (existing.Total > 0)
                    {
                        client.IndexContent(variant);
                    }
                }
            }
        }
        /// <summary>
        /// Search
        /// </summary>
        /// <param name="query"></param>
        /// <returns></returns>
        public virtual IEnumerable <SearchResult> Search(Query query)
        {
            List <ContentReference> searchRoots = null;
            var searchText = query.SearchQuery;

            if (query.SearchRoots?.Any() == true)
            {
                searchRoots = new List <ContentReference>();

                foreach (var item in query.SearchRoots)
                {
                    if (ContentReference.TryParse(item, out var c))
                    {
                        searchRoots.Add(c);
                    }
                }
            }

            var typeRestriction = typeof(TContent).GetSearchTypesFor(VulcanFieldConstants.DefaultFilter);

            // Special condition for BlockData since it doesn't derive from BlockData
            if (typeof(TContent) == typeof(VulcanContentHit))
            {
                typeRestriction = typeof(BlockData).GetSearchTypesFor(VulcanFieldConstants.DefaultFilter);
            }

            var hits = new List <ISearchResponse <IContent> >();

            var clients = VulcanHandler.GetClients();

            if (clients != null)
            {
                // ReSharper disable once LoopCanBeConvertedToQuery
                foreach (var client in clients)
                {
                    if (client.Language.Equals(CultureInfo.InvariantCulture) && !IncludeInvariant)
                    {
                        continue;
                    }

                    var clientHits = client.SearchContent <IContent>(d => d
                                                                     .Take(query.MaxResults)
                                                                     .FielddataFields(fs => fs.Field(p => p.ContentLink)) // only return id for performance
                                                                     .Query(x =>
                                                                            x.SimpleQueryString(sqs =>
                                                                                                sqs.Fields(f => f
                                                                                                           .AllAnalyzed()
                                                                                                           .Field($"{VulcanFieldConstants.MediaContents}.content")
                                                                                                           .Field($"{VulcanFieldConstants.MediaContents}.content_type"))
                                                                                                .Query(searchText))
                                                                            ),
                                                                     typeFilter: typeRestriction,
                                                                     includeNeutralLanguage: client.Language.Equals(CultureInfo.InvariantCulture),
                                                                     rootReferences: searchRoots,
                                                                     principleReadFilter: UserExtensions.GetUser()
                                                                     );

                    if (clientHits?.Total > 0)
                    {
                        hits.Add(clientHits);
                    }
                }
            }

            var results = hits.SelectMany(h => h.Hits.Select(CreateSearchResult));

            return(results);
        }