Exemplo n.º 1
0
        /// <summary>
        /// 二分查找到词并插入词
        /// </summary>
        /// <param name="storeIndex"></param>
        /// <param name="word"></param>
        /// <param name="infos"></param>
        protected virtual bool InsertWord(StoreIndexInfo storeIndex, WordInfo word, IList <WordInfo> infos)
        {
            if (infos == null)
            {
                return(false);
            }
            int low = 0, high = infos.Count - 1;

            while (low <= high)
            {
                int mid = low + ((high - low) / 2);
                if (infos[mid].Name.Equals(word.Name))
                {
                    infos[mid].DocumentCount += word.DocumentCount;
                    foreach (var inversion in word.Inversions)
                    {
                        infos[mid].Inversions.Add(inversion);
                    }
                    return(true);
                }
                if (infos[mid].Name.CompareTo(word.Name) > 0)
                {
                    high = mid - 1;
                }
                else
                {
                    low = mid + 1;
                }
            }
            infos.Insert(low, word);
            return(true);
        }
Exemplo n.º 2
0
 /// <summary>
 /// 计算权重值,密度越接近设置的值,权重越高
 /// </summary>
 /// <param name="storeIndex"></param>
 /// <param name="word"></param>
 /// <returns></returns>
 protected virtual void SetWordWeight(StoreIndexInfo storeIndex, WordInfo word)
 {
     foreach (var inversion in word.Inversions)
     {
         double pr = 0;
         var    defaultPercentage = storeIndex.StoreSequences == null
                                     ? (double)1 / inversion.Feilds.Count
                                     : 1 - storeIndex.StoreSequences.Sum(it => it.Percentage);
         foreach (var frequency in inversion.Feilds)
         {
             var storeSequence = storeIndex.StoreSequences == null
                                     ? null
                                     : storeIndex.StoreSequences.FirstOrDefault(
                 it => it.Index == frequency.FeildIndex);
             if (storeSequence != null)
             {
                 pr += frequency.Frequency * Math.Log(storeIndex.StoreDocument.DataCount / (word.DocumentCount / (double)storeIndex.StoreDocument.DataCount)) *
                       (1 - Math.Abs(frequency.Frequency - storeSequence.Density)) * storeSequence.Percentage;
             }
             else
             {
                 pr += (frequency.Frequency * Math.Log(storeIndex.StoreDocument.DataCount / (word.DocumentCount / (double)storeIndex.StoreDocument.DataCount))) * defaultPercentage;
             }
         }
         inversion.Weight = pr;
     }
 }
Exemplo n.º 3
0
 /// <summary>
 /// 得到Key
 /// </summary>
 protected virtual long GetDocumentId(StoreIndexInfo storeIndex)
 {
     lock (Locker)
     {
         storeIndex.StoreDocument.DataCount++;
         return(storeIndex.StoreDocument.DataCount);
     }
 }
Exemplo n.º 4
0
 /// <summary>
 /// 重写
 /// </summary>
 /// <param name="storeIndex"></param>
 /// <param name="searchQuery"></param>
 /// <param name="result"></param>
 /// <param name="documentIds"></param>
 protected override void AddSearchDocuments(StoreIndexInfo storeIndex, SearchQueryInfo searchQuery, SearchResultInfo result, IList <long> documentIds)
 {
     if (searchQuery.Conditions != null && searchQuery.Conditions.Count(it => _keys.Contains(it.Key)) > 0)
     {
         return;
     }
     base.AddSearchDocuments(storeIndex, searchQuery, result, documentIds);
 }
Exemplo n.º 5
0
        /// <summary>
        /// 得到插入时候的数据集
        /// </summary>
        /// <param name="storeIndex"></param>
        /// <returns></returns>
        protected virtual IList <DocumentInfo> GetDocuments(StoreIndexInfo storeIndex)
        {
            var pageCount = storeIndex.StoreDocument.DataCount % storeIndex.StoreDocument.PageSize == 0 ? storeIndex.StoreDocument.PageCount + 1 : storeIndex.StoreDocument.PageCount;
            IList <DocumentInfo> documents = GetInfos(storeIndex.Name, pageCount);

            documents = documents ?? new List <DocumentInfo>();
            return(documents);
        }
Exemplo n.º 6
0
        /// <summary>
        /// 移除索引库的词
        /// </summary>
        /// <param name="storeIndex"></param>
        /// <param name="word"></param>
        /// <returns></returns>
        public virtual bool Remove(StoreIndexInfo storeIndex, string word)
        {
            if (string.IsNullOrEmpty(word))
            {
                return(false);
            }
            string indexName = GetStoreName(storeIndex.Name, word);
            var    words     = Storer.Read <IList <WordInfo> >(indexName);

            return(RemoveWord(words, word, indexName));
        }
Exemplo n.º 7
0
 /// <summary>
 /// 过滤条件
 /// </summary>
 /// <param name="documentIds"></param>
 /// <param name="storeIndex"></param>
 /// <param name="result"></param>
 /// <param name="searchQuery"></param>
 protected virtual void FilterDocuments(IList <long> documentIds, StoreIndexInfo storeIndex, SearchResultInfo result, SearchQueryInfo searchQuery)
 {
     foreach (var documentId in documentIds)
     {
         var document = Documentor.GetInfo(storeIndex, documentId);
         if (document == null || document.Feilds == null)
         {
             continue;
         }
         if (searchQuery.Conditions.ContainsKey("IsCustom") && document.Feilds.Count > 6 &&
             !document.Feilds[6].Text.Convert <bool>() != searchQuery.Conditions["IsCustom"].Convert <bool>())
         {
             continue;
         }
         if (searchQuery.Conditions.ContainsKey("StartCost") && document.Feilds.Count > 4 &&
             document.Feilds[4].Text.Convert <decimal>() <
             searchQuery.Conditions["StartCost"].Convert <decimal>())
         {
             continue;
         }
         if (searchQuery.Conditions.ContainsKey("EndCost") && document.Feilds.Count > 4 &&
             document.Feilds[4].Text.Convert <decimal>() >
             searchQuery.Conditions["EndCost"].Convert <decimal>())
         {
             continue;
         }
         if (searchQuery.Conditions.ContainsKey("StartPrice") && document.Feilds.Count > 5 &&
             document.Feilds[5].Text.Convert <decimal>() <
             searchQuery.Conditions["StartPrice"].Convert <decimal>())
         {
             continue;
         }
         if (searchQuery.Conditions.ContainsKey("EndPrice") && document.Feilds.Count > 5 &&
             document.Feilds[5].Text.Convert <decimal>() >
             searchQuery.Conditions["EndPrice"].Convert <decimal>())
         {
             continue;
         }
         if (searchQuery.Conditions.ContainsKey("Sku") && document.Feilds.Count > 3 &&
             !string.IsNullOrEmpty(document.Feilds[3].Text))
         {
             var texts  = searchQuery.Conditions["Sku"].ToString().Split(',');
             var values = document.Feilds[3].Text.Split(',');
             var rev    = texts.All(text => CheckValue(values, text));
             if (rev)
             {
                 continue;
             }
         }
         result.Documents.Add(document);
     }
 }
Exemplo n.º 8
0
 /// <summary>
 /// 写入词库
 /// </summary>
 /// <param name="storeIndex"></param>
 public virtual void Write(StoreIndexInfo storeIndex)
 {
     foreach (var word in WordDictionarties)
     {
         foreach (var wd in word.Value)
         {
             SetWordWeight(storeIndex, wd);
             wd.Inversions =
                 wd.Inversions.OrderByDescending(it => it.Weight).Take(storeIndex.TopDocumentCount).ToList();
         }
         Storer.Save(word.Key, word.Value);
     }
     WordDictionarties = null;
 }
Exemplo n.º 9
0
        /// <summary>
        /// 移除行
        /// </summary>
        /// <param name="storeIndex"></param>
        /// <param name="id"></param>
        /// <returns></returns>
        public virtual bool Remove(StoreIndexInfo storeIndex, long id)
        {
            if (storeIndex == null)
            {
                return(false);
            }
            string pageName  = GetStoreName(storeIndex.Name, GetStoreIndex(storeIndex, id));
            var    documents = Storer.Read <IList <DocumentInfo> >(pageName);
            var    index     = GetDocumentIndex(storeIndex, id);

            documents[index].Feilds = null;
            Storer.Save(pageName, documents);
            return(true);
        }
Exemplo n.º 10
0
        /// <summary>
        /// 清空词库
        /// </summary>
        /// <param name="storeIndex"></param>
        /// <returns></returns>
        public virtual bool Clear(StoreIndexInfo storeIndex)
        {
            var names = Storer.GetNames(string.Format(RootName, storeIndex.Name));

            if (names == null)
            {
                return(true);
            }
            foreach (var indexName in names)
            {
                Storer.Delete(indexName);
            }
            return(true);
        }
Exemplo n.º 11
0
        /// <summary>
        /// 录入数据
        /// </summary>
        /// <param name="storeIndex"></param>
        /// <param name="document"></param>
        /// <returns></returns>
        public virtual bool Insert(StoreIndexInfo storeIndex, DocumentInfo document)
        {
            if (storeIndex == null || document == null)
            {
                return(false);
            }
            IList <DocumentInfo> documents = GetDocuments(storeIndex);

            documents   = documents ?? new List <DocumentInfo>();
            document.Id = GetDocumentId(storeIndex);
            documents.Add(document);
            Storer.Save(GetStoreName(storeIndex.Name, GetStoreIndex(storeIndex, document.Id)), documents);
            return(true);
        }
Exemplo n.º 12
0
        /// <summary>
        /// 得到行数据
        /// </summary>
        /// <param name="storeIndex"></param>
        /// <param name="id"></param>
        /// <returns></returns>
        public virtual DocumentInfo GetInfo(StoreIndexInfo storeIndex, long id)
        {
            if (storeIndex == null)
            {
                return(null);
            }
            IList <DocumentInfo> documents = GetInfos(storeIndex.Name, GetStoreIndex(storeIndex, id));
            var index = GetDocumentIndex(storeIndex, id);

            if (documents != null && index < documents.Count)
            {
                return(documents[index]);
            }
            return(null);
        }
Exemplo n.º 13
0
        /// <summary>
        /// 得到搜索编号
        /// </summary>
        /// <param name="storeIndex"></param>
        /// <param name="result"></param>
        /// <param name="searchQuery"></param>
        /// <returns></returns>
        protected override IList <long> GetSearchDocumentIds(StoreIndexInfo storeIndex, SearchResultInfo result, SearchQueryInfo searchQuery)
        {
            var documentIds = base.GetSearchDocumentIds(storeIndex, result, searchQuery);

            if (documentIds != null && searchQuery.Conditions != null &&
                searchQuery.Conditions.Count(it => _keys.Contains(it.Key)) > 0)
            {
                FilterDocuments(documentIds, storeIndex, result, searchQuery);
                OrderbyDocuments(documentIds, storeIndex, result, searchQuery);
                if (result.Documents != null)
                {
                    return(result.Documents.Select(it => it.Id).ToList());
                }
            }
            return(documentIds);
        }
Exemplo n.º 14
0
        /// <summary>
        /// 得到词信息
        /// </summary>
        /// <param name="storeIndex"></param>
        /// <param name="word"></param>
        /// <returns></returns>
        public virtual WordInfo GetInfo(StoreIndexInfo storeIndex, string word)
        {
            string indexname = GetStoreName(storeIndex.Name, word);
            var    words     = Storer.Read <IList <WordInfo> >(indexname);

            if (words == null)
            {
                return(null);
            }
            int i = GetWordInfoIndex(words, word);

            if (i != -1)
            {
                return(words[i]);
            }
            return(null);
        }
Exemplo n.º 15
0
        /// <summary>
        /// 更新记录
        /// </summary>
        /// <param name="storeIndex"></param>
        /// <param name="document"></param>
        /// <returns></returns>
        public virtual bool Update(StoreIndexInfo storeIndex, DocumentInfo document)
        {
            if (storeIndex == null || document == null)
            {
                return(false);
            }
            string pageName  = GetStoreName(storeIndex.Name, GetStoreIndex(storeIndex, document.Id));
            var    documents = Storer.Read <IList <DocumentInfo> >(pageName);

            if (documents != null)
            {
                var index = GetDocumentIndex(storeIndex, document.Id);
                documents[index] = document;
            }
            Storer.Save(pageName, documents);
            return(true);
        }
Exemplo n.º 16
0
        /// <summary>
        /// 插入词
        /// </summary>
        /// <param name="storeIndex"></param>
        /// <param name="word"></param>
        /// <returns></returns>
        public virtual bool Insert(StoreIndexInfo storeIndex, WordInfo word)
        {
            if (storeIndex == null || word == null)
            {
                return(false);
            }
            string indexName = GetStoreName(storeIndex.Name, word.Name);

            if (!WordDictionarties.ContainsKey(indexName))
            {
                var words = Storer.Read <IList <WordInfo> >(indexName);
                words = words ?? new List <WordInfo>();
                WordDictionarties.Add(indexName, words);
            }
            var infos = WordDictionarties[indexName];

            return(InsertWord(storeIndex, word, infos));
        }
Exemplo n.º 17
0
 /// <summary>
 /// 加载词库
 /// </summary>
 /// <param name="storeIndex"></param>
 public virtual void Load(StoreIndexInfo storeIndex)
 {
     WordDictionarties = new Dictionary <string, IList <WordInfo> >();
 }
Exemplo n.º 18
0
        /// <summary>
        /// 排序
        /// </summary>
        /// <param name="documentIds"></param>
        /// <param name="storeIndex"></param>
        /// <param name="result"></param>
        /// <param name="searchQuery"></param>
        protected virtual void OrderbyDocuments(IList <long> documentIds, StoreIndexInfo storeIndex,
                                                SearchResultInfo result, SearchQueryInfo searchQuery)
        {
            if (searchQuery.Conditions.ContainsKey("Seqence"))
            {
                switch (searchQuery.Conditions["Seqence"].ToString())
                {
                case "costasc":
                    if (searchQuery.PageSize > 0)
                    {
                        result.Documents =
                            result.Documents.OrderBy(it => it.Feilds[4].Text.Convert <decimal>())
                            .Skip(searchQuery.PageIndex * searchQuery.PageSize)
                            .Take(searchQuery.PageSize)
                            .ToList();
                    }
                    else
                    {
                        result.Documents = result.Documents.OrderBy(it => it.Feilds[4].Text.Convert <decimal>()).ToList();
                    }
                    break;

                case "costdesc":
                    if (searchQuery.PageSize > 0)
                    {
                        result.Documents =
                            result.Documents.OrderByDescending(it => it.Feilds[4].Text.Convert <decimal>())
                            .Skip(searchQuery.PageIndex * searchQuery.PageSize)
                            .Take(searchQuery.PageSize)
                            .ToList();
                    }
                    else
                    {
                        result.Documents = result.Documents.OrderByDescending(it => it.Feilds[4].Text.Convert <decimal>()).ToList();
                    }
                    break;

                case "prasc":
                    if (searchQuery.PageSize > 0)
                    {
                        result.Documents =
                            result.Documents.OrderBy(it => it.Feilds[5].Text.Convert <decimal>())
                            .Skip(searchQuery.PageIndex * searchQuery.PageSize)
                            .Take(searchQuery.PageSize)
                            .ToList();
                    }
                    else
                    {
                        result.Documents = result.Documents.OrderBy(it => it.Feilds[5].Text.Convert <decimal>()).ToList();
                    }
                    break;

                case "prdesc":
                    if (searchQuery.PageSize > 0)
                    {
                        result.Documents =
                            result.Documents.OrderByDescending(it => it.Feilds[5].Text.Convert <decimal>())
                            .Skip(searchQuery.PageIndex * searchQuery.PageSize)
                            .Take(searchQuery.PageSize)
                            .ToList();
                    }
                    else
                    {
                        result.Documents = result.Documents.OrderByDescending(it => it.Feilds[5].Text.Convert <decimal>()).ToList();
                    }
                    break;

                case "ptdesc":
                    if (searchQuery.PageSize > 0)
                    {
                        result.Documents =
                            result.Documents.OrderByDescending(it => it.Feilds[7].Text.Convert <DateTime>())
                            .Skip(searchQuery.PageIndex * searchQuery.PageSize)
                            .Take(searchQuery.PageSize)
                            .ToList();
                    }
                    else
                    {
                        result.Documents = result.Documents.OrderByDescending(it => it.Feilds[7].Text.Convert <DateTime>()).ToList();
                    }
                    break;

                case "scasc":
                    if (searchQuery.PageSize > 0)
                    {
                        result.Documents =
                            result.Documents.OrderByDescending(it => it.Feilds[8].Text.Convert <int>())
                            .Skip(searchQuery.PageIndex * searchQuery.PageSize)
                            .Take(searchQuery.PageSize)
                            .ToList();
                    }
                    else
                    {
                        result.Documents = result.Documents.OrderByDescending(it => it.Feilds[8].Text.Convert <int>()).ToList();
                    }
                    break;
                }
            }
            else if (searchQuery.PageSize > 0)
            {
                result.Documents =
                    result.Documents.Skip(searchQuery.PageIndex * searchQuery.PageSize)
                    .Take(searchQuery.PageSize)
                    .ToList();
            }
        }
Exemplo n.º 19
0
 /// <summary>
 /// 更新词
 /// </summary>
 /// <param name="storeIndex"></param>
 /// <param name="word"></param>
 /// <returns></returns>
 public virtual bool Update(StoreIndexInfo storeIndex, WordInfo word)
 {
     return(Remove(storeIndex, word.Name) && Insert(storeIndex, word));
 }
Exemplo n.º 20
0
 /// <summary>
 /// 得到索引
 /// </summary>
 /// <param name="storeIndex"></param>
 /// <param name="id"></param>
 /// <returns></returns>
 protected virtual int GetDocumentIndex(StoreIndexInfo storeIndex, long id)
 {
     return((int)((id - 1) % storeIndex.StoreDocument.PageSize));
 }