Exemple #1
0
        public override string ResultGet()
        {
            JXSearchProductResult result = new JXSearchProductResult()
            {
                resultCode = "Fail"
            };

            try
            {
                string szJson = HttpContext.Current.Request["para"];
                if (string.IsNullOrEmpty(szJson))
                {
                    result.resultMsg = "未指定查询参数";
                    return(ResultResponse(result, "listProductGetByCidResponse"));
                }

                //  构造查询FORM
                RequestForm form = JsonHelper.ParseFromJson <RequestForm>(szJson);
                if (form == null || form.pageForm == null || form.queryForm == null)
                {
                    result.resultMsg = "解析查询参数出错";
                    return(ResultResponse(result, "listProductGetByCidsssResponse"));
                }

                //  搜索数据
                int recCount = 0;
                JXSearchProvider provider = JXSearchProviderCreator.CreateProvider(JXSearchType.Product);
                result = provider.Search(form, out recCount);
                if (result == null)
                {
                    result = new JXSearchProductResult()
                    {
                        resultCode = "Fail", resultMsg = "无结果"
                    }
                }
                ;
                else
                {
                    result.total = recCount;
                }
            }
            catch (Exception ex)
            {
                result.resultMsg = ex.Message;
            }
            return(ResultResponse(result, "listProductGetByCidResponse"));
        }
Exemple #2
0
        /// <summary>
        /// 关键词索引
        /// </summary>
        private static void CreateKeywordIndex()
        {
            try
            {
                Console.WriteLine("Keyword === 开始生成索引");
                //  查询关键词
                int       recordCount = 0;
                string    strWhere    = " AND k.Status=0";
                DataTable dTable      = JXAPI.Component.BLL.SqlBLL.Instance.Keyword_GetListForSearch(strWhere);
                if (dTable == null || dTable.Rows.Count <= 0)
                {
                    Console.WriteLine("Keyword === 未找到需要索引数据");
                    return;
                }
                Console.WriteLine(string.Format("Keyword === 准备索引:{0}条数据", dTable.Rows.Count));

                //  设置索引
                string           IndexName = currDate.ToString("yyyyMMdd");
                JXSearchProvider provider  = JXSearchProviderCreator.CreateProvider(JXSearchType.Keywords);
                provider.CreateIndex(GetIndexPath(provider.INDEX_DIR, out IndexName));
                provider.MaxMergeFactor = 301;
                provider.MinMergeDocs   = 301;

                //  定义商品搜索
                int recCount = 0;
                JXSearchProductResult result          = null;
                JXSearchProvider      providerProduct = JXSearchProviderCreator.CreateProvider(JXSearchType.Product);

                //  遍历关键词
                int i = 0;
                recordCount = dTable.Rows.Count;
                foreach (DataRow row in dTable.Rows)
                {
                    i++;

                    #region 关键词下商品数
                    try
                    {
                        result = providerProduct.Search(new RequestForm()
                        {
                            pageForm = new PageForm()
                            {
                                page = 1, size = 1
                            },
                            queryForm = new QueryForm()
                            {
                                keyword = row["ChineseName"].ToString()
                            }
                        }, out recCount);
                        row["ProductCount"] = recCount;
                    }
                    catch { }
                    #endregion

                    //  写入索引
                    provider.IndexString(row, JXSearchType.Keywords);
                    if (i % 300 == 0)
                    {
                        provider.CloseWithoutOptimize();
                        provider.CreateIndex(string.Format("{0}\\{1}", provider.INDEX_DIR, IndexName));
                        provider.MaxMergeFactor = 301;
                        provider.MinMergeDocs   = 301;
                    }
                }

                //  关闭流
                provider.Close();
                Console.WriteLine(string.Format("Keyword === 插入{0}行关键字索引数据", recordCount));
            }
            catch (Exception ex)
            {
                Console.WriteLine(string.Format("Keyword === 生成索引失败:{0}", ex.Message.ToString()));
            }

            //  缓存索引文件名
            try
            {
                SearchDictDirCacheProvider.Remove("KeywordEngine");
                SearchDictDirCacheProvider.Set("KeywordEngine");
            }
            catch (Exception ex)
            {
                Console.WriteLine(string.Format("Keyword === 缓存索引文件名失败:{0}", ex.Message.ToString()));
            }
            finally
            {
                Console.WriteLine("Keyword === 索引生成完毕\r\n\r\n");
            }
        }
Exemple #3
0
        /// <summary>
        /// 更新搜索关键词
        /// </summary>
        private static void UpdateSearchKeyword()
        {
            try
            {
                Console.WriteLine("SearchKeyword === 开始执行搜索关键词推荐商品");
                //  查询关键词
                int       recordCount = 0;
                DataTable dTable      = JXAPI.Component.BLL.SqlBLL.Instance.SearchKeyword_GetListForSearch();
                if (dTable == null || dTable.Rows.Count <= 0)
                {
                    Console.WriteLine("SearchKeyword === 未找到搜索关键词");
                    return;
                }
                Console.WriteLine(string.Format("SearchKeyword === 准备:{0}条数据", dTable.Rows.Count));

                //  定义商品搜索
                int recCount = 0;
                JXSearchProductResult result          = null;
                JXSearchProvider      providerProduct = JXSearchProviderCreator.CreateProvider(JXSearchType.Product);

                //  定义关键词搜索
                JXSearchEntityResult entityResult    = null;
                JXSearchProvider     providerKeyword = JXSearchProviderCreator.CreateProvider(JXSearchType.Keywords);

                //
                string related = string.Empty, salled = string.Empty, recommend = string.Empty, preferential = string.Empty, hotSalled = string.Empty;

                //  遍历关键词
                foreach (DataRow row in dTable.Rows)
                {
                    #region 关键词相关
                    try
                    {
                        entityResult = providerKeyword.Search(row["ChineseName"].ToString(), 10, 1, out recCount);
                        if (entityResult == null || entityResult.listKeyword == null || entityResult.listKeyword.Count <= 0)
                        {
                            related = string.Empty;
                        }
                        else
                        {
                            related = string.Join(",", entityResult.listKeyword.Select(i => i.chineseName).ToArray());
                        }
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(string.Format("SearchKeyword === 推荐(0):{0}", ex.Message));
                    }
                    #endregion

                    #region 关键词下商品
                    try
                    {
                        result = providerProduct.Search(new RequestForm()
                        {
                            pageForm = new PageForm()
                            {
                                page = 1, size = 100
                            },
                            queryForm = new QueryForm()
                            {
                                keyword = row["ChineseName"].ToString()
                            }
                        }, out recCount);
                        if (result == null || result.listProductList == null || result.listProductList.Count <= 0)
                        {
                            salled = string.Empty; recommend = string.Empty; preferential = string.Empty; hotSalled = string.Empty;
                        }
                        else
                        {
                            salled       = string.Join(",", result.listProductList.OrderByDescending(i => i.sellCount).Take(10).Select(i => i.productID).ToArray());
                            recommend    = string.Join(",", result.listProductList.OrderByDescending(i => i.recommend).Take(10).Select(i => i.productID).ToArray());
                            preferential = string.Join(",", result.listProductList.OrderByDescending(i => i.preferential).Take(10).Select(i => i.productID).ToArray());
                            hotSalled    = string.Join(",", result.listProductList.OrderByDescending(i => i.preferential).ThenBy(i => i.sellCount).Take(10).Select(i => i.productID).ToArray());
                        }
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(string.Format("SearchKeyword === 推荐(1):{0}", ex.Message));
                    }
                    #endregion

                    #region 保存
                    try
                    {
                        JXAPI.Component.BLL.SqlBLL.Instance.Update_SearchKeyword(related, salled, recommend, preferential, hotSalled, recCount, int.Parse(row["keywordID"].ToString()));
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(string.Format("SearchKeyword === 推荐(2):{0}", ex.Message));
                    }
                    #endregion
                }
                Console.WriteLine(string.Format("SearchKeyword === {0}条搜索关键词,推荐完成", recordCount));
            }
            catch (Exception ex)
            {
                Console.WriteLine(string.Format("SearchKeyword === 搜索关键词推荐商品失败:{0}", ex.Message.ToString()));
            }
        }
Exemple #4
0
        /// <summary>
        /// 关键词多条件搜索
        /// </summary>
        /// <param name="keyword">关键词</param>
        /// <param name="brand">品牌</param>
        /// <param name="cfid">分类</param>
        /// <param name="pricelimit">价格区间</param>
        /// <param name="store">是否有货</param>
        /// <param name="order">排序</param>
        /// <param name="recCount">总记录数</param>
        /// <param name="pageLen">条数</param>
        /// <param name="pageNo">页码</param>
        /// <returns>搜索结果</returns>
        public override JXSearchProductResult Search(RequestForm form, out int recCount)
        {
            recCount = 0;
            JXSearchProductResult result = new JXSearchProductResult();
            IndexSearcher         search = new IndexSearcher(CURR_INDEX_DIR);

            try
            {
                #region 搜索条件
                Query        query1 = null;
                BooleanQuery query  = new BooleanQuery();
                if (StringUtil.IsNatural_Number(form.queryForm.keyword))
                {
                    //  商品ID、金象码、拼音
                    BooleanClause.Occur[] flags = new BooleanClause.Occur[fieldsAbbr.Length];
                    for (int n = 0; n < fieldsAbbr.Length; n++)
                    {
                        flags[n] = BooleanClause.Occur.SHOULD;
                    }
                    query1 = MultiFieldQueryParser.Parse(Lucene.Net.Util.Version.LUCENE_29, form.queryForm.keyword, fieldsAbbr, flags, new PanGuAnalyzer(true));
                    query.Add(query1, BooleanClause.Occur.MUST);
                }
                else
                {
                    //  关键词检索字段\t\r\n\\t
                    BooleanClause.Occur[] flags = new BooleanClause.Occur[fields.Length];
                    for (int n = 0; n < fields.Length; n++)
                    {
                        flags[n] = BooleanClause.Occur.SHOULD;
                    }
                    //  转换关键词拼音
                    string pinyinName = PinyinUtil.ConvertToPinyin(GetKeyWordsSplitFilter(form.queryForm.keyword, new PanGuTokenizer()));

                    //  关键词检索
                    //  BooleanClause.Occur.MUST 表示 and
                    //  BooleanClause.Occur.MUST_NOT 表示 not
                    //  BooleanClause.Occur.SHOULD 表示 or
                    string q = GetKeyWordsSplitBySpace(string.Format("{0} {1}", form.queryForm.keyword, pinyinName), new PanGuTokenizer());
                    query1 = MultiFieldQueryParser.Parse(Lucene.Net.Util.Version.LUCENE_29, q, fields, flags, new PanGuAnalyzer(true));
                    query.Add(query1, BooleanClause.Occur.MUST);
                }

                //  品牌
                if (form.queryForm.brandIds != null && form.queryForm.brandIds.Count() > 0)
                {
                    BooleanQuery tmpBQ = new BooleanQuery();
                    foreach (int key in form.queryForm.brandIds)
                    {
                        tmpBQ.Add(new TermQuery(new Term("BrandID", key.ToString())), BooleanClause.Occur.SHOULD);
                    }
                    query.Add(tmpBQ, BooleanClause.Occur.MUST);
                }

                //  分类
                if (form.queryForm.cfid > 0)
                {
                    BooleanQuery tmpBQ = new BooleanQuery();
                    tmpBQ.Add(new TermQuery(new Term("CFID1", form.queryForm.cfid.ToString())), BooleanClause.Occur.SHOULD);
                    tmpBQ.Add(new TermQuery(new Term("CFID2", form.queryForm.cfid.ToString())), BooleanClause.Occur.SHOULD);
                    tmpBQ.Add(new TermQuery(new Term("CFID3", form.queryForm.cfid.ToString())), BooleanClause.Occur.SHOULD);
                    query.Add(tmpBQ, BooleanClause.Occur.MUST);
                }

                //  库存
                if (form.queryForm.stock > 0)
                {
                    query.Add(new TermQuery(new Term("Stock", "1")), BooleanClause.Occur.MUST);
                }

                //  价格区间
                if (!string.IsNullOrEmpty(form.queryForm.pricelimit))
                {
                    string[] price = form.queryForm.pricelimit.Split(",".ToCharArray());
                    if (price.Length > 0 && double.Parse(price[1]) > 0)
                    {
                        query.Add(NumericRangeQuery.NewDoubleRange("TradePrice", double.Parse(price[0]), double.Parse(price[1]), true, false), BooleanClause.Occur.MUST);
                    }
                }

                //  是否有货    Selling 是否在卖 1:在卖 0:下架 2:暂无库存
                if (form.queryForm.store == 1)
                {
                    query.Add(new TermQuery(new Term("Selling", form.queryForm.store.ToString())), BooleanClause.Occur.MUST);
                }

                Hits hits = search.Search(query);
                #endregion

                //  构造商品结果
                result.listProductList = ProductBinding(hits, form.queryForm.keyword, form.queryForm.order, form.pageForm.page, form.pageForm.size, out recCount);

                #region 构造结果参数 品牌/分类
                //  排除搜索条件重新搜索
                if ((form.queryForm.brandIds != null && form.queryForm.brandIds.Count() > 0) || form.queryForm.cfid > 0 || form.queryForm.store == 1 || form.queryForm.order > 0 || !string.IsNullOrEmpty(form.queryForm.pricelimit))
                {
                    BooleanQuery booleanQuery = new BooleanQuery();
                    booleanQuery.Add(query1, BooleanClause.Occur.MUST);
                    hits = search.Search(query);
                }

                //  构造分类、品牌结果
                IList <JXSearchEntity> list = ProductParaList(hits);
                if (list != null)
                {
                    //  品牌
                    result.listBrand = list.Where(g => g.typeID == 5).ToList();

                    //  一级分类
                    IList <JXSearchEntity> categoryList = list.Where(g => g.typeID == 2 && g.parentID == 0).ToList();
                    if (categoryList != null)
                    {
                        foreach (JXSearchEntity item in categoryList)
                        {
                            //  二级分类
                            item.listSubClassification = list.Where(g => g.typeID == 2 && g.parentID == item.id).ToList();
                            foreach (JXSearchEntity subItem in item.listSubClassification)
                            {
                                //  三级分类
                                subItem.listSubClassification = list.Where(g => g.typeID == 2 && g.parentID == subItem.id).ToList();
                            }
                        }
                    }
                    result.listClassification = categoryList;
                }
                #endregion

                //  页数
                result.totalPage  = Convert.ToInt32(Math.Ceiling((double)recCount / form.pageForm.size));
                result.resultCode = "SUCCEED";
                result.resultMsg  = "SUCCEED";
            }
            catch { }
            finally
            {
                search.Close();
                search.Dispose();
            }
            return(result);
        }