Exemplo n.º 1
0
        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));
        }
Exemplo n.º 2
0
        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);
            }
        }