public List<LinkItem> Search(GenerateSchemeViewModel model, out int totalHits) { if (!Directory.Exists(LuceneCommon.IndexOutDoorDirectory)) { totalHits = 0; return new List<LinkItem>(); } var combineQuery = new BooleanQuery(); SortField sortField = GetSortField(model.generateType); #region 用户状态 var memberStatusQuery = NumericRangeQuery.NewIntRange(OutDoorIndexFields.MemberStatus, (int)MemberStatus.CompanyAuth, 99, true, true); combineQuery.Add(memberStatusQuery, Occur.MUST); #endregion #region 审核状态查询构建 var verifyStatus = NumericRangeQuery.NewIntRange(OutDoorIndexFields.Status, (int)OutDoorStatus.ShowOnline, 99, true, true); combineQuery.Add(verifyStatus, Occur.MUST); #endregion #region 媒体类别查询 if (!string.IsNullOrEmpty(model.mediaCode)) { var mediaCodes = model.mediaCode.Split(',').Select(x => Convert.ToInt32(x)); var mediaCodeCombineQuery = new BooleanQuery(); foreach (var code in mediaCodes) { var maxCode = Utilities.GetMaxCode(code); var mediaCodeQuery = NumericRangeQuery.NewLongRange(OutDoorIndexFields.MediaCateCode, code, maxCode, true, true); mediaCodeCombineQuery.Add(mediaCodeQuery, Occur.SHOULD); } combineQuery.Add(mediaCodeCombineQuery, Occur.MUST); } #endregion #region 媒体档期查询 if (!string.IsNullOrEmpty(model.dq)) { var minValue = (DateTime.Now.AddYears(-10)).Ticks; var maxValue = Convert.ToDateTime(model.dq).Ticks; var DeadLineQuery = NumericRangeQuery.NewLongRange(OutDoorIndexFields.DeadLine, Convert.ToInt64(minValue), Convert.ToInt64(maxValue), true, true); combineQuery.Add(DeadLineQuery, Occur.MUST); } #endregion #region 地区查询 if (!string.IsNullOrEmpty(model.cityCode)) { var cityCodes = model.cityCode.Split(',').Select(x => Convert.ToInt32(x)); var cityCodeCombineQuery = new BooleanQuery(); foreach (var code in cityCodes) { var maxCode = Utilities.GetMaxCode(code); var cityCodeQuery = NumericRangeQuery.NewLongRange(OutDoorIndexFields.CityCateCode, code, maxCode, true, true); cityCodeCombineQuery.Add(cityCodeQuery, Occur.SHOULD); } combineQuery.Add(cityCodeCombineQuery, Occur.MUST); } #endregion #region 关键字查询 if (!string.IsNullOrEmpty(model.formatCate) || !string.IsNullOrEmpty(model.crowdCate) || !string.IsNullOrEmpty(model.industryCate) || !string.IsNullOrEmpty(model.purposeCate)) { var fields = new[] { OutDoorIndexFields.IndustryCate, OutDoorIndexFields.CrowdCate, OutDoorIndexFields.PurposeCate, OutDoorIndexFields.FormatName }; var keywords = (string.IsNullOrEmpty(model.formatCate) ? string.Empty : model.formatCate + ",") + (string.IsNullOrEmpty(model.crowdCate) ? string.Empty : model.crowdCate + ",") + (string.IsNullOrEmpty(model.industryCate) ? string.Empty : model.industryCate + ",") + (string.IsNullOrEmpty(model.purposeCate) ? string.Empty : model.purposeCate); var analyzer = new PanGuAnalyzer(); //var analyzer = new StandardAnalyzer(LuceneCommon.LuceneVersion); var queryParser = new MultiFieldQueryParser(LuceneCommon.LuceneVersion, fields, analyzer); //conjuction 一起选择 var conjuctionQuery = new BooleanQuery(); conjuctionQuery.Boost = 2.0f; //disjunction 分离 var disjunctionQuery = new BooleanQuery(); disjunctionQuery.Boost = 0.1f; //wildCard 通配符 var wildCardQuery = new BooleanQuery(); wildCardQuery.Boost = 0.5f; var escapedSearchTerm = Escape(keywords); foreach (var term in GetSearchTerms(keywords)) { var termQuery = queryParser.Parse(term); conjuctionQuery.Add(termQuery, Occur.MUST); disjunctionQuery.Add(termQuery, Occur.SHOULD); foreach (var field in fields) { var wildCardTermQuery = new WildcardQuery(new Term(field, term + "*")); wildCardTermQuery.Boost = 0.7f; wildCardQuery.Add(wildCardTermQuery, Occur.SHOULD); } } //关键查询 var keywordsQuery = conjuctionQuery.Combine(new Query[] { conjuctionQuery, disjunctionQuery, wildCardQuery }); combineQuery.Add(keywordsQuery, Occur.MUST); } #endregion #region 媒体价格区间查询 if (model.priceCate != 0) { var rangeValue = EnumHelper.GetPriceValue(model.priceCate); if (rangeValue.Max > 99999) { rangeValue.Max = 1000; } var PriceQuery = NumericRangeQuery.NewDoubleRange(OutDoorIndexFields.Price, 0, Convert.ToDouble(rangeValue.Max), true, true); combineQuery.Add(PriceQuery, Occur.MUST); } #endregion using (var directory = new SimpleFSDirectory(new DirectoryInfo(LuceneCommon.IndexOutDoorDirectory))) { var searcher = new IndexSearcher(directory, readOnly: true); var results = searcher.Search(combineQuery, filter: null, n: 30, sort: new Sort(sortField)); var keys = results.ScoreDocs.Skip(0) .Select(c => GetMediaItem(searcher.Doc(c.Doc))) .ToList(); totalHits = results.TotalHits; searcher.Dispose(); return keys; } }
public ActionResult GenerateScheme(GenerateSchemeViewModel model) { var totalCount = 0; var list = OutDoorLuceneService.Search(model, out totalCount); var maxPrice = model.price; var currentPrice = 0m; var day = model.day; var result = new List<LinkItem>(); foreach (var item in list) { currentPrice += ((item.Price / 365) * day); int privceValue = Convert.ToInt32(currentPrice); if (privceValue > maxPrice) { currentPrice -= ((item.Price / 365) * day); break; } else { result.Add(item); } } ViewBag.currentPrice = currentPrice.ToString("F2"); ViewBag.Dq = Convert.ToDateTime(model.dq).ToString("yyyy-MM-dd") + " 至 " + Convert.ToDateTime(model.dq).AddDays(model.day).ToString("yyyy-MM-dd"); //return Json(result, JsonRequestBehavior.AllowGet); return View(result); }