Example #1
0
 public static BooleanOperation ToBooleanOperation(this BooleanClause.Occur o)
 {
     return(Examine.LuceneEngine.SearchCriteria.LuceneSearchExtensions.ToBooleanOperation(o));
 }
Example #2
0
 internal LuceneQuery(LuceneSearchCriteria search, BooleanClause.Occur occurance)
 {
     this.search    = search;
     this.occurance = occurance;
 }
        protected internal IBooleanOperation NodeTypeAliasInternal(IExamineValue examineValue, BooleanClause.Occur occurance)
        {
            //force lower case
            var eVal = new ExamineValue(examineValue.Examineness, examineValue.Value.ToLower(), examineValue.Level);

            //don't use the query parser for this operation, it needs to match exact
            return(this.FieldInternal(NodeTypeAliasField, eVal, occurance, false));
        }
Example #4
0
        protected void ApplyDateRangeSearchParam(BooleanQuery query, DateRangeSearchParam param, BooleanClause.Occur innerOccurance)
        {
            if (param.Ranges.Count <= 0)
            {
                return;
            }

            foreach (var dateParam in param.Ranges)
            {
                AddDateRangeQuery(query, dateParam, innerOccurance);
            }
        }
Example #5
0
        protected void AddDateRangeQuery(BooleanQuery query, DateRange dateRangeField, BooleanClause.Occur occurance)
        {
            var startDateTime = dateRangeField.StartDate;
            var endDateTime   = dateRangeField.EndDate;

            if (dateRangeField.InclusiveStart && startDateTime > DateTime.MinValue.AddDays(1))
            {
                startDateTime = startDateTime.AddDays(-1);
            }

            if (dateRangeField.InclusiveEnd && endDateTime < DateTime.MaxValue.AddDays(-1))
            {
                endDateTime = endDateTime.AddDays(1);
            }

            // converting to lucene format
            var startDate = DateTools.DateToString(startDateTime, DateTools.Resolution.DAY);
            var endDate   = DateTools.DateToString(endDateTime, DateTools.Resolution.DAY);

            var rangeQuery = new RangeQuery(new Term(dateRangeField.FieldName, startDate), new Term(dateRangeField.FieldName, endDate), true);

            query.Add(rangeQuery, occurance);
        }
Example #6
0
        internal static void AddDateRangeQuery(BooleanQuery query, DateRangeSearchParam.DateRangeField dateRangeField, BooleanClause.Occur occurance)
        {
            var startDateTime = dateRangeField.StartDate;

            if (dateRangeField.InclusiveStart)
            {
                if (startDateTime != DateTime.MinValue)
                {
                    startDateTime.ChangeTime(0, 0, 0, 0);
                }
            }

            var endDateTime = dateRangeField.EndDate;

            if (dateRangeField.InclusiveStart)
            {
                if (endDateTime != DateTime.MaxValue)
                {
                    endDateTime = endDateTime.ChangeTime(23, 59, 59, 59);
                }
            }

            BooleanQuery.SetMaxClauseCount(int.MaxValue);

            if (!(dateRangeField.StartDate == DateTime.MinValue && dateRangeField.EndDate == DateTime.MaxValue))
            {
                query.Add(new RangeQuery(new Term(SearchFieldIDs.CreatedDate, startDateTime.ToString("yyyyMMdd")), new Term(SearchFieldIDs.CreatedDate, endDateTime.ToString("yyyyMMdd")), true), occurance);
            }
        }
Example #7
0
        protected void ApplyNumericRangeSearchParam(BooleanQuery query, NumericRangeSearchParam param, BooleanClause.Occur innerOccurance)
        {
            if (param.Ranges.Count <= 0)
            {
                return;
            }

            foreach (var range in param.Ranges)
            {
                AddNumericRangeQuery(query, range, innerOccurance);
            }
        }
Example #8
0
 protected internal IBooleanOperation RangeInternal(string fieldName, int start, int end, bool includeLower, bool includeUpper, BooleanClause.Occur occurance)
 {
     query.Add(NumericRangeQuery.NewIntRange(fieldName, start, end, includeLower, includeUpper), occurance);
     return(new LuceneBooleanOperation(this));
 }
Example #9
0
        /// <summary>
        /// Creates our own style 'multi field query' used internal for the grouped operations
        /// </summary>
        /// <param name="fields"></param>
        /// <param name="fieldVals"></param>
        /// <param name="occurance"></param>
        /// <returns>A new <see cref="Examine.SearchCriteria.IBooleanOperation"/> with the clause appended</returns>
        protected internal BooleanQuery GetMultiFieldQuery(string[] fields, IExamineValue[] fieldVals, BooleanClause.Occur occurance)
        {
            //if there's only 1 query text we want to build up a string like this:
            //(!field1:query !field2:query !field3:query)
            //but Lucene will bork if you provide an array of length 1 (which is != to the field length)

            var queryVals = new IExamineValue[fields.Length];

            if (fieldVals.Length == 1)
            {
                for (int i = 0; i < queryVals.Length; i++)
                {
                    queryVals[i] = fieldVals[0];
                }
            }
            else
            {
                queryVals = fieldVals;
            }

            var qry = new BooleanQuery();

            for (int i = 0; i < fields.Length; i++)
            {
                qry.Add(this.GetFieldInternalQuery(fields[i], queryVals[i]), occurance);
            }

            return(qry);
        }
Example #10
0
 protected override Query BuildQuery(BooleanClause.Occur condition)
 {
     return(QueryBuilder.BuildDateRangeSearchParam(this.Ranges, condition));
 }
Example #11
0
 internal protected IBooleanOperation NodeTypeAliasInternal(IExamineValue examineValue, BooleanClause.Occur occurance)
 {
     return(this.FieldInternal("nodeTypeAlias", examineValue, occurance));
 }
Example #12
0
 /// <summary>Builds a new BooleanClause instance</summary>
 /// <param name="q">sub query</param>
 /// <param name="occur">how this clause should occur when matching documents</param>
 /// <returns> new BooleanClause instance</returns>
 protected internal virtual BooleanClause NewBooleanClause(Query q, BooleanClause.Occur occur)
 {
     return(new BooleanClause(q, occur));
 }
Example #13
0
 /// <exception cref="ParseException">throw in overridden method to disallow</exception>
 protected internal virtual Query NewFieldQuery(Analyzer analyzer, string field, string queryText, bool quoted)
 {
     BooleanClause.Occur occur = DefaultOperator == Operator.AND ? BooleanClause.Occur.MUST : BooleanClause.Occur.SHOULD;
     return(CreateFieldQuery(analyzer, occur, field, queryText, quoted || AutoGeneratePhraseQueries, PhraseSlop));
 }
        /// <summary>
        /// 关键词搜索
        /// </summary>
        /// <param name="q">关键词</param>
        /// <param name="pageLen">条数</param>
        /// <param name="pageNo">页码</param>
        /// <param name="recCount">总记录数</param>
        /// <returns>搜索结果</returns>
        public override JXSearchEntityResult Search(string q, int pageLen, int pageNo, out int recCount)
        {
            IndexSearcher search = new IndexSearcher(CURR_INDEX_DIR);

            //  关键词检索字段
            string[] fields             = { "ChineseName", "PinyinName" };
            BooleanClause.Occur[] flags = new BooleanClause.Occur[fields.Length];
            for (int n = 0; n < fields.Length; n++)
            {
                flags[n] = BooleanClause.Occur.SHOULD;
            }

            //  关键词检索
            //  BooleanClause.Occur.MUST 表示 and
            //  BooleanClause.Occur.MUST_NOT 表示 not
            //  BooleanClause.Occur.SHOULD 表示 or
            q = GetKeyWordsSplitBySpace(q, new PanGuTokenizer());
            Query        query1 = MultiFieldQueryParser.Parse(Lucene.Net.Util.Version.LUCENE_29, q, fields, flags, new PanGuAnalyzer(true));
            BooleanQuery query  = new BooleanQuery();

            query.Add(query1, BooleanClause.Occur.MUST);

            //  查询
            Hits hits = search.Search(query);

            //  绑定
            recCount = hits.Length();       //  总记录数
            int i = (pageNo - 1) * pageLen;
            List <JXSearchEntity> result = new List <JXSearchEntity>();

            while (i < recCount && result.Count < pageLen)
            {
                JXSearchEntity info = null;
                try
                {
                    info              = new JXSearchEntity();
                    info.id           = int.Parse(hits.Doc(i).Get("KeywordID"));
                    info.chineseName  = hits.Doc(i).Get("ChineseName");
                    info.productCount = int.Parse(hits.Doc(i).Get("ProductCount"));
                    info.typeID       = int.Parse(hits.Doc(i).Get("TypeID"));
                }
                catch { }
                finally
                {
                    if (info != null)
                    {
                        result.Add(info);
                    }
                    i++;
                }
            }
            //  关闭搜索
            search.Close();

            //  返回
            if (result == null || result.Count <= 0)
            {
                return(null);
            }
            else
            {
                return(new JXSearchEntityResult()
                {
                    listKeyword = result,
                    totalPage = Convert.ToInt32(Math.Ceiling((double)recCount / pageLen)),
                    resultCode = "SUCCEED",
                    resultMsg = "SUCCEED"
                });
            };
        }
Example #15
0
 /// <summary>
 /// Create a new FilterClause </summary>
 /// <param name="filter"> A Filter object containing a BitSet </param>
 /// <param name="occur"> A parameter implementation indicating SHOULD, MUST or MUST NOT </param>
 public FilterClause(Filter filter, BooleanClause.Occur occur)
 {
     this.occur  = occur;
     this.filter = filter;
 }
 internal protected IBooleanOperation FieldInternal(string fieldName, IExamineValue fieldValue, BooleanClause.Occur occurance)
 {
     return(FieldInternal(fieldName, fieldValue, occurance, true));
 }
Example #17
0
        internal static void ApplyDateRangeSearchParam(BooleanQuery query, DateRangeSearchParam param, BooleanClause.Occur innerOccurance)
        {
            if (param.Ranges == null)
            {
                return;
            }

            if (param.Ranges.Count <= 0)
            {
                return;
            }

            param.Ranges.ForEach(dateParam => AddDateRangeQuery(query, dateParam, innerOccurance));
        }
        internal protected IBooleanOperation FieldInternal(string fieldName, IExamineValue fieldValue, BooleanClause.Occur occurance, bool useQueryParser)
        {
            Query queryToAdd = GetFieldInternalQuery(fieldName, fieldValue, useQueryParser);

            if (queryToAdd != null)
            {
                Query.Add(queryToAdd, occurance);
            }

            return(new LuceneBooleanOperation(this));
        }
 protected abstract Query BuildQuery(BooleanClause.Occur innerCondition);
 protected internal IBooleanOperation RangeInternal(string fieldName, long lower, long upper, bool includeLower, bool includeUpper, BooleanClause.Occur occurance)
 {
     Query.Add(NumericRangeQuery.NewLongRange(fieldName, lower, upper, includeLower, includeUpper), occurance);
     return(new LuceneBooleanOperation(this));
 }
Example #21
0
        protected void AddNumericRangeQuery(BooleanQuery query, NumericRangeSearchParam.NumericRangeField range, BooleanClause.Occur occurance)
        {
            var startTerm  = new Term(range.FieldName, SearchHelper.FormatNumber(range.Start));
            var endTerm    = new Term(range.FieldName, SearchHelper.FormatNumber(range.End));
            var rangeQuery = new RangeQuery(startTerm, endTerm, true);

            query.Add(rangeQuery, occurance);
        }
        protected internal IBooleanOperation RangeInternal(string fieldName, string start, string end, bool includeLower, bool includeUpper, BooleanClause.Occur occurance)
        {
            Query.Add(new TermRangeQuery(fieldName, start, end, includeLower, includeUpper), occurance);

            return(new LuceneBooleanOperation(this));
        }
Example #23
0
        protected void AddDateRangeQuery(BooleanQuery query, DateRangeSearchParam.DateRangeField dateRangeField, BooleanClause.Occur occurance)
        {
            var startDateTime = dateRangeField.StartDate;

            if (dateRangeField.InclusiveStart)
            {
                startDateTime = startDateTime.AddDays(1);
            }
            var startDate = startDateTime.ToString(IndexConstants.DateTimeFormat);

            var endDateTime = dateRangeField.EndDate;

            if (dateRangeField.InclusiveStart)
            {
                endDateTime = endDateTime.AddDays(1);
            }
            var endDate = endDateTime.ToString(IndexConstants.DateTimeFormat);

            var rangeQuery = new RangeQuery(new Term(dateRangeField.FieldName, startDate), new Term(dateRangeField.FieldName, endDate), true);

            query.Add(rangeQuery, occurance);
        }
        protected internal IBooleanOperation GroupedOrInternal(string[] fields, IExamineValue[] fieldVals, BooleanClause.Occur occurance)
        {
            //if there's only 1 query text we want to build up a string like this:
            //(field1:query field2:query field3:query)
            //but Lucene will bork if you provide an array of length 1 (which is != to the field length)

            Query.Add(GetMultiFieldQuery(fields, fieldVals, BooleanClause.Occur.SHOULD, true), occurance);

            return(new LuceneBooleanOperation(this));
        }
Example #25
0
        private void AddBooleanClause(BooleanQuery boolQuery, Query query, BooleanClause.Occur occur)
        {
            var boolQ = query as BooleanQuery;

            if (boolQ == null)
            {
                boolQuery.Add(new BooleanClause(query, occur));
                return;
            }
            var clauses = boolQ.GetClauses();

            if (clauses.Length == 0)
            {
                throw ParserError("Empty BooleanQuery");
            }
            if (clauses.Length > 1)
            {
                boolQuery.Add(new BooleanClause(query, occur));
                return;
            }

            //-- boolQ has one clause: combine occurs
            var clause      = (BooleanClause)clauses[0];
            var clauseOccur = clause.GetOccur();

            BooleanClause.Occur effectiveOccur;
            if (Operator == DefaultOperator.Or)
            {
                // in    cl      eff
                // null  _  ==>  _
                // null  +  ==>  +
                // null  -  ==>  -
                //    _  _  ==>  _
                //    _  +  ==>  +
                //    _  -  ==>  -
                //    +  _  ==>  +
                //    +  +  ==>  +
                //    +  -  ==>  -
                //    -  _  ==>  -
                //    -  +  ==>  -
                //    -  -  ==>  -
                if (occur == null || occur == BooleanClause.Occur.SHOULD)
                {
                    effectiveOccur = clauseOccur;
                }
                else if (occur == BooleanClause.Occur.MUST_NOT)
                {
                    effectiveOccur = occur;
                }
                else if (clauseOccur == BooleanClause.Occur.MUST_NOT)
                {
                    effectiveOccur = clauseOccur;
                }
                else
                {
                    effectiveOccur = occur;
                }
            }
            else
            {
                // in    cl      eff
                // null  _  ==>  _
                // null  +  ==>  +
                // null  -  ==>  -
                //    _  _  ==>  _
                //    _  +  ==>  _
                //    _  -  ==>  -
                //    +  _  ==>  +
                //    +  +  ==>  +
                //    +  -  ==>  -
                //    -  _  ==>  -
                //    -  +  ==>  -
                //    -  -  ==>  -
                if (occur == null)
                {
                    effectiveOccur = clauseOccur;
                }
                else if (occur == BooleanClause.Occur.MUST_NOT)
                {
                    effectiveOccur = occur;
                }
                else if (clauseOccur == BooleanClause.Occur.MUST_NOT)
                {
                    effectiveOccur = clauseOccur;
                }
                else
                {
                    effectiveOccur = occur;
                }
            }
            clause.SetOccur(effectiveOccur);
            boolQuery.Add(clause);
        }
        protected internal IBooleanOperation GroupedFlexibleInternal(string[] fields, BooleanOperation[] operations, IExamineValue[] fieldVals, BooleanClause.Occur occurance)
        {
            //if there's only 1 query text we want to build up a string like this:
            //(field1:query field2:query field3:query)
            //but Lucene will bork if you provide an array of length 1 (which is != to the field length)

            var flags = new BooleanClause.Occur[operations.Count()];

            for (int i = 0; i < flags.Length; i++)
            {
                flags[i] = operations.ElementAt(i).ToLuceneOccurance();
            }

            var queryVals = new IExamineValue[fields.Length];

            if (fieldVals.Length == 1)
            {
                for (int i = 0; i < queryVals.Length; i++)
                {
                    queryVals[i] = fieldVals[0];
                }
            }
            else
            {
                queryVals = fieldVals;
            }

            var qry = new BooleanQuery();

            for (int i = 0; i < fields.Length; i++)
            {
                var q = GetFieldInternalQuery(fields[i], queryVals[i], true);
                if (q != null)
                {
                    qry.Add(q, flags[i]);
                }
            }

            this.Query.Add(qry, occurance);

            return(new LuceneBooleanOperation(this));
        }
 protected internal IBooleanOperation NodeNameInternal(IExamineValue examineValue, BooleanClause.Occur occurance)
 {
     return(this.FieldInternal(NodeNameField, examineValue, occurance));
 }
Example #28
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);
        }
        protected internal IBooleanOperation ParentIdInternal(int id, BooleanClause.Occur occurance)
        {
            Query.Add(this.QueryParser.GetFieldQuery(ParentIdField, id.ToString()), occurance);

            return(new LuceneBooleanOperation(this));
        }
Example #30
0
 public ExtendedCommonTermsQuery(BooleanClause.Occur highFreqOccur, BooleanClause.Occur lowFreqOccur, float maxTermFrequency)
     : base(highFreqOccur, lowFreqOccur, maxTermFrequency)
 {
 }