コード例 #1
0
            private void ExportIndexSchema(string str)
            {
                //Load xml
                XDocument xdoc  = XDocument.Load(path + @"\sitecore modules\Shell\Sitecore\ItemBuckets\Services\schema_template.xml");
                var       index = SearchManager.GetIndex(str);

                if (index != null)
                {
                    using (var context = new SortableIndexSearchContext(index))
                    {
                        //Run query
                        foreach (var field in context.Searcher.GetIndexReader().GetFieldNames(IndexReader.FieldOption.ALL))
                        {
                            xdoc.Element("schema").Element("fields").Add(new XElement("field", new XAttribute("name", field),
                                                                                      new XAttribute("type", "string"),
                                                                                      new XAttribute("indexed", "true"),
                                                                                      new XAttribute("stored", "true")));
                        }
                    }
                }
                var WriteFileStream = new XmlTextWriter(path + @"\sitecore modules\Shell\Sitecore\ItemBuckets\Services\schema.xml", Encoding.UTF8);

                xdoc.Save(WriteFileStream);
                WriteFileStream.Close();
            }
コード例 #2
0
        public static List <List <FacetReturn> > GetFacets(List <SearchStringModel> _searchQuery)
        {
            var ret    = new List <List <FacetReturn> >();
            var facets = Context.ContentDatabase.GetItem(Constants.FacetFolder).Children;

            foreach (Item facet in facets)
            {
                if (facet.Fields["Enabled"].Value == "1")
                {
                    dynamic type = Activator.CreateInstance(Type.GetType(facet.Fields["Type"].Value));
                    if ((type as IFacet).IsNotNull())
                    {
                        var locationOverride = GetLocationOverride(_searchQuery);
                        using (var context = new SortableIndexSearchContext(SearchManager.GetIndex(BucketManager.GetContextIndex(Context.ContentDatabase.GetItem(locationOverride)))))
                        {
                            var query          = SearchHelper.GetBaseQuery(_searchQuery, locationOverride);
                            var queryBase      = IndexSearcher.ContructQuery(query);
                            var searchBitArray = new QueryFilter(queryBase).Bits(context.Searcher.GetIndexReader());
                            var res            = ((IFacet)type).Filter(queryBase, _searchQuery, locationOverride, searchBitArray);
                            ret.Add(res);
                        }
                    }
                }
            }

            return(ret);
        }
コード例 #3
0
        /// <summary>
        /// Performs a search in the WeBlog search index, with a sort
        /// </summary>
        /// <typeparam name="T">The type of the items to be returned from the search</typeparam>
        /// <param name="query">The query to execute</param>
        /// <param name="maximumResults">The maximum number of results</param>
        /// <param name="sortField">The index field to sort on</param>
        /// <returns>An array of search results, or an empty array if there was an issue</returns>
        public T[] Execute <T>(QueryBase query, int maximumResults, Action <List <T>, Item> func, string sortField, bool reverseSort)
        {
            if (query is CombinedQuery)
            {
                // Add on database
                (query as CombinedQuery).Add(new FieldQuery(Sitecore.Search.BuiltinFields.Database, Sitecore.Context.Database.Name), QueryOccurance.Must);

                // Add language
                var langCode = DatabaseCrawler.TransformLanguageCode(Sitecore.Context.Language.Name);
                (query as CombinedQuery).Add(new FieldQuery(Constants.Index.Fields.Language, langCode), QueryOccurance.Must);
            }

            // I have to use Action<T> cause the compiler can't work out how to use implicit operators when T is one of the items classes (generated by CIG)
            var items = new List <T>();

            if (maximumResults > 0)
            {
                var index = GetSearchIndex();
                if (index != null && index.GetDocumentCount() > 0)
                {
                    using (var searchContext = new SortableIndexSearchContext(index))
                    {
                        SearchHits hits;
                        if (!string.IsNullOrEmpty(sortField))
                        {
#if FEATURE_CONTENT_SEARCH
                            var sort = new Lucene.Net.Search.Sort(new SortField(sortField, SortField.STRING, reverseSort));
#else
                            var sort = new Lucene.Net.Search.Sort(sortField, reverseSort);
#endif
                            hits = searchContext.Search(query, sort);
                        }
                        else
                        {
                            hits = searchContext.Search(query);
                        }

                        if (hits != null)
                        {
                            foreach (var result in hits.FetchResults(0, maximumResults))
                            {
                                var item = SearchManager.GetObject(result);
                                if (item != null)
                                {
                                    func(items, (Item)item);
                                }
                            }
                        }
                    }
                }
                else
                {
                    Log.Warn("WeBlog index was not found or didn't contain any documents", this);
                }
            }

            return(items.ToArray());
        }
コード例 #4
0
        public virtual KeyValuePair <int, List <SitecoreItem> > RunQuery(Query query, int pageSize, int pageNumber, string sortField, string sortDirection)
        {
            var items = new List <SitecoreItem>();
            int hitCount;

            if (Config.EnableBucketDebug || Constants.EnableTemporaryBucketDebug)
            {
                Log.Info("Bucket Debug Query: " + query, this);
            }

            if (Config.SOLREnabled == "true")
            {
                GetValue(query, items);
                return(new KeyValuePair <int, List <SitecoreItem> >(items.Count, items));
            }
            else
            {
                if (Index is Index)
                {
                    (Index as Index).Analyzer = new StandardAnalyzer(Consts.StopWords);
                }
                using (var context = new SortableIndexSearchContext(Index))
                {
                    BooleanQuery.SetMaxClauseCount(Config.LuceneMaxClauseCount);
                    var sortingDir = sortDirection == "asc" ? false : true;
                    var searchHits = string.IsNullOrWhiteSpace(sortField)
                                         ? context.Search(query)
                                         : context.Search(query, new Sort(sortField, sortingDir));
                    if (searchHits.IsNull())
                    {
                        return(new KeyValuePair <int, List <SitecoreItem> >());
                    }

                    hitCount = searchHits.Length;
                    if (pageSize == 0)
                    {
                        pageSize = searchHits.Length;
                    }

                    if (pageNumber == 1)
                    {
                        pageNumber = 1;
                    }


                    var resultCollection = new SearchResultCollection();

                    resultCollection = searchHits.FetchResults((pageNumber - 1) * pageSize, pageSize);


                    SearchHelper.GetItemsFromSearchResult(resultCollection, items);
                }
                return(new KeyValuePair <int, List <SitecoreItem> >(hitCount, items));
            }
        }
コード例 #5
0
        private static IEnumerable <string> GetAllIndexFields()
        {
            var terms = new List <string>();

            using (var context = new SortableIndexSearchContext(SearchManager.GetIndex(Constants.Index.Name)))
            {
                var fieldsInIndex = context.Searcher.GetIndexReader().GetFieldNames(IndexReader.FieldOption.ALL).OfType <string>();
                terms.AddRange(fieldsInIndex);
            }
            return(terms);
        }
コード例 #6
0
        private static List<string> SuggestSimilar(string term)
        {
            var similarWordsList = new List<string>();
            using (var context = new SortableIndexSearchContext(SearchManager.GetIndex(Constants.Index.Name)))
            {
                // create the spell checker
                /*var spell = new SpellChecker.Net.Search.Spell.SpellChecker(context.Searcher.GetIndexReader().Directory());

                // get 2 similar words
                string[] similarWords = spell.SuggestSimilar(term, 2);

                // show the similar words
                for (int wordIndex = 0; wordIndex < similarWords.Length; wordIndex++)
                {
                    similarWordsList.Add(similarWords[wordIndex]);
                }*/
            }
            return similarWordsList;
        }
コード例 #7
0
        private static List <string> SuggestSimilar(string term)
        {
            var similarWordsList = new List <string>();

            using (var context = new SortableIndexSearchContext(SearchManager.GetIndex(Constants.Index.Name)))
            {
                // create the spell checker

                /*var spell = new SpellChecker.Net.Search.Spell.SpellChecker(context.Searcher.GetIndexReader().Directory());
                 *
                 * // get 2 similar words
                 * string[] similarWords = spell.SuggestSimilar(term, 2);
                 *
                 * // show the similar words
                 * for (int wordIndex = 0; wordIndex < similarWords.Length; wordIndex++)
                 * {
                 *  similarWordsList.Add(similarWords[wordIndex]);
                 * }*/
            }
            return(similarWordsList);
        }
コード例 #8
0
        private static IEnumerable <string> GetAuthorsFromIndex()
        {
            var terms = new List <string>();

            using (var context = new SortableIndexSearchContext(SearchManager.GetIndex(Constants.Index.Name)))
            {
                var termsByField = context.Searcher.GetIndexReader().Terms(new Term("__created by", string.Empty));
                while (termsByField.Next())
                {
                    if (termsByField.Term().Field() == "__created by")
                    {
                        terms.Add(termsByField.Term().Text());
                    }
                    else
                    {
                        break;
                    }
                }
            }

            return(terms);
        }
コード例 #9
0
        private static IEnumerable <string> GetExtensionsFromIndex()
        {
            var terms = new List <string>();

            using (var context = new SortableIndexSearchContext(SearchManager.GetIndex("itembuckets_medialibrary")))
            {
                var termsByField = context.Searcher.GetIndexReader().Terms(new Term("extension", string.Empty));
                while (termsByField.Next())
                {
                    if (termsByField.Term().Field() == "extension")
                    {
                        terms.Add(termsByField.Term().Text());
                    }
                    else
                    {
                        break;
                    }
                }
            }

            return(terms);
        }
コード例 #10
0
        private List <List <FacetReturn> > GetFacets()
        {
            var ret    = new List <List <FacetReturn> >();
            var facets = Context.ContentDatabase.GetItem(Constants.FacetFolder).Children;

            foreach (Item facet in facets)
            {
                if (facet.Fields["Enabled"].Value == "1")
                {
                    // pull the type off of the Sitecore item
                    string typeName = facet.Fields["Type"].Value;
                    object type     = Sitecore.Reflection.ReflectionUtil.CreateObject(typeName);

                    // pull any parameters out of the Sitecore item
                    string typeParameters = facet.Fields["Parameters"].Value;
                    if (!string.IsNullOrEmpty(typeParameters))
                    {
                        Sitecore.Reflection.ReflectionUtil.SetProperties(type, typeParameters);
                    }

                    if ((type as IFacet).IsNotNull())
                    {
                        var locationOverride = GetLocationOverride();
                        using (var context = new SortableIndexSearchContext(SearchManager.GetIndex(BucketManager.GetContextIndex(Context.ContentDatabase.GetItem(locationOverride)))))
                        {
                            var query          = SearchHelper.GetBaseQuery(this._searchQuery, locationOverride);
                            var queryBase      = IndexSearcher.ContructQuery(query);
                            var searchBitArray = new QueryFilter(queryBase).Bits(context.Searcher.GetIndexReader());
                            var res            = ((IFacet)type).Filter(queryBase, this._searchQuery, locationOverride, searchBitArray);
                            ret.Add(res);
                        }
                    }
                }
            }

            return(ret);
        }
コード例 #11
0
        public virtual Dictionary <string, int> RunFacet(Query query, bool showAllVersions, bool isFacet, bool isIdLookup, int pageSize, int pageNumber, string termName, List <string> termValue, BitArray queryBase, string locationFilter)
        {
            var runningCOunt = new Dictionary <string, int>();
            var db           = Context.ContentDatabase ?? Sitecore.Context.Database;
            var indexName    = BucketManager.GetContextIndex(db.GetItem(locationFilter));

            if (indexName.EndsWith("_remote"))
            {
                Index = RemoteSearchManager.GetIndex(indexName) as RemoteIndex;
            }
            else if (indexName.EndsWith("_inmemory"))
            {
                Index = InMemorySearchManager.GetIndex(indexName) as InMemoryIndex;
            }
            else
            {
                Index = SearchManager.GetIndex(indexName) as Index;
            }
            using (var context = new SortableIndexSearchContext(Index))
            {
                if (Config.EnableBucketDebug || Constants.EnableTemporaryBucketDebug)
                {
                    Log.Info("Using: " + indexName, this);
                    Log.Info("Bucket Facet Original Debug Query: " + query, this);
                }

                foreach (var terms in termValue)
                {
                    var genreQueryFilter = GenreQueryFilter(query, isFacet, isIdLookup, termName, terms);
                    var tempSearchArray  = queryBase.Clone() as BitArray;
                    if (Config.EnableBucketDebug || Constants.EnableTemporaryBucketDebug)
                    {
                        Log.Info("Bucket Facet Debug Query: " + genreQueryFilter, this);
                    }

                    BitArray genreBitArray = genreQueryFilter.Bits(context.Searcher.GetIndexReader());
                    if (tempSearchArray.Length == genreBitArray.Length)
                    {
                        BitArray combinedResults = tempSearchArray.And(genreBitArray);

                        var cardinality = SearchHelper.GetCardinality(combinedResults);

                        if (cardinality > 0)
                        {
                            if (!isFacet)
                            {
                                if (!runningCOunt.ContainsKey(terms))
                                {
                                    runningCOunt.Add(terms, cardinality);
                                }
                            }
                            else
                            {
                                if (!runningCOunt.ContainsKey(terms))
                                {
                                    runningCOunt.Add(terms, cardinality);
                                }
                            }
                        }
                    }
                }
            }

            return(runningCOunt);
        }