Exemplo n.º 1
0
        /// <summary>
        /// 得到缓存数据
        /// </summary>
        /// <param name="searchQuery"></param>
        protected virtual SearchResultInfo GetSearchResultByCache(SearchQueryInfo searchQuery)
        {
            var name    = string.Format("{0}_{1}_{2}", searchQuery.Key, searchQuery.PageIndex, searchQuery.PageSize);
            var builder = new StringBuilder(name);

            if (searchQuery.Conditions != null)
            {
                foreach (var condition in searchQuery.Conditions)
                {
                    builder.AppendFormat("{0}{1}", condition.Key, condition.Value);
                }
            }
            searchQuery.CacheKey = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(builder.ToString(), "MD5");
            searchQuery.CacheKey = string.Format("{0}{1}_{2}_{3}", CacheTag, searchQuery.Name, searchQuery.Key, searchQuery.CacheKey);
            var result = Cacher.Get <SearchResultInfo>(searchQuery.CacheKey);

            lock (KeyLocker)
            {
                if (result == null)
                {
                    result = GetSearchResultByFind(searchQuery);
                    if (searchQuery.TimeSpan > 0)
                    {
                        Cacher.Set(searchQuery.CacheKey, result, searchQuery.TimeSpan);
                    }
                    else if (searchQuery.CecheTime.HasValue)
                    {
                        Cacher.Set(searchQuery.CacheKey, result, searchQuery.CecheTime.Value);
                    }
                }
            }
            return(result);
        }
Exemplo n.º 2
0
 /// <summary>
 /// 搜索
 /// </summary>
 /// <param name="searchQuery"></param>
 /// <returns></returns>
 public virtual SearchResultInfo Search(SearchQueryInfo searchQuery)
 {
     if (searchQuery == null || string.IsNullOrEmpty(searchQuery.Name) || string.IsNullOrEmpty(searchQuery.Key.Trim()))
     {
         return(null);
     }
     searchQuery.Key = searchQuery.Key.Trim().ToLower();
     if (searchQuery.TimeSpan != 0 || searchQuery.CecheTime != null)
     {
         return(GetSearchResultByCache(searchQuery));
     }
     return(GetSearchResultByFind(searchQuery));
 }
Exemplo n.º 3
0
 /// <summary>
 /// 添加行
 /// </summary>
 /// <param name="storeIndex"></param>
 /// <param name="searchQuery"></param>
 /// <param name="result"></param>
 /// <param name="documentIds"></param>
 protected virtual void AddSearchDocuments(StoreIndexInfo storeIndex, SearchQueryInfo searchQuery, SearchResultInfo result, IList <long> documentIds)
 {
     if (searchQuery.PageSize > 0)
     {
         documentIds = documentIds.Skip(searchQuery.PageIndex * searchQuery.PageSize).Take(searchQuery.PageSize).ToList();
     }
     foreach (var documentId in documentIds)
     {
         var document = Documentor.GetInfo(storeIndex, documentId);
         if (document != null)
         {
             result.Documents.Add(document);
         }
     }
 }
Exemplo n.º 4
0
        /// <summary>
        /// 得到结果
        /// </summary>
        /// <param name="searchQuery"></param>
        /// <returns></returns>
        protected virtual SearchResultInfo GetSearchResultByFind(SearchQueryInfo searchQuery)
        {
            var result = new SearchResultInfo {
                Terms = Analyzer.Resolve(searchQuery.Key)
            };

            if (result.Terms == null)
            {
                return(result);
            }
            if (!StoreIndexs.ContainsKey(searchQuery.Name))
            {
                return(result);
            }
            var storeIndex = StoreIndexs[searchQuery.Name];

            if (storeIndex == null)
            {
                return(result);
            }
            result.Feilds = storeIndex.StoreFields.Select(it => it.Name).ToList();
            result.Words  = new List <WordInfo>();
            foreach (var term in result.Terms)
            {
                if (result.Words.Count(it => it.Name == term.Name) > 0)
                {
                    continue;
                }
                var word = Worder.GetInfo(storeIndex, term.Name);
                if (word != null)
                {
                    result.Words.Add(word);
                }
            }
            var documentIds = GetSearchDocumentIds(storeIndex, result, searchQuery);

            if (documentIds != null)
            {
                result.DocumentCount = documentIds.Count;
                AddSearchDocuments(storeIndex, searchQuery, result, documentIds);
            }
            if (result.Words.Count > 0)
            {
                result.DataCount = result.Words.Sum(it => it.DocumentCount) / result.Words.Count;
            }
            return(result);
        }
Exemplo n.º 5
0
        /// <summary>
        /// 查询得到结果
        /// </summary>
        /// <param name="storeIndex"></param>
        /// <param name="result"></param>
        /// <param name="searchQuery"></param>
        /// <returns></returns>
        protected virtual IList <long> GetSearchDocumentIds(StoreIndexInfo storeIndex, SearchResultInfo result, SearchQueryInfo searchQuery)
        {
            if (result.Words == null || result.Words.Count == 0)
            {
                return(null);
            }
            result.Documents = new List <DocumentInfo>();
            if (result.Words.Count == 1)
            {
                return(result.Words[0].Inversions.Select(it => it.DocumentId).ToList());
            }
            var scQuery = new List <double>();

            foreach (var word in result.Words)
            {
                var weight = word.DocumentCount == 0
                                 ? 0
                                 : ((double)result.Terms.Count(it => it.Name == word.Name) / result.Terms.Count *
                                    Math.Log(storeIndex.StoreDocument.DataCount / (word.DocumentCount / (double)storeIndex.StoreDocument.DataCount)));
                scQuery.Add(weight);
            }
            var scDocuments = GetSeachDocumentVector(result);

            return(GetOrderbySearchDocuments(scQuery, scDocuments));
        }