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")); }
/// <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"); } }
/// <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())); } }
/// <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); }