/// <summary>
 ///  设置Query权重
 /// </summary>
 /// <param name="query"></param>
 /// <param name="boostLevel"></param>
 private void SetBoost(Query query, BoostLevel boostLevel)
 {
     query.SetBoost((float)boostLevel);
 }
        /// <summary>
        /// 添加PhraseQuery
        /// </summary>
        /// <param name="fieldName">待搜索的字段名称</param>
        /// <param name="phrase">待搜索的短语</param>
        /// <param name="boostLevel">权重级别</param>
        /// <param name="asFilter">是否作为过滤条件</param>
        /// <returns>LuceneSearchBuilder</returns>
        public LuceneSearchBuilder WithPhrase(string fieldName, string phrase, BoostLevel? boostLevel = null, bool asFilter = false)
        {
            string filteredPhrase = ClauseScrubber.LuceneKeywordsScrub(phrase);
            if (string.IsNullOrEmpty(filteredPhrase))
                return this;

            if (filteredPhrase.Length == 1)
                return WithField(fieldName, filteredPhrase, false, boostLevel, asFilter);

            string[] nameSegments = ClauseScrubber.SegmentForPhraseQuery(filteredPhrase);

            PhraseQuery phraseQuery = new PhraseQuery();
            foreach (var nameSegment in nameSegments)
                phraseQuery.Add(new Term(fieldName, nameSegment));

            phraseQuery.SetSlop(PhraseQuerySlop);

            if (boostLevel.HasValue)
                SetBoost(phraseQuery, boostLevel.Value);

            if (asFilter)
                filters.Add(new BooleanClause(phraseQuery, BooleanClause.Occur.MUST));
            else
                clauses.Add(new BooleanClause(phraseQuery, BooleanClause.Occur.MUST));

            return this;
        }
        /// <summary>
        /// 根据多个关键字添加PhraseQuery
        /// </summary>
        /// <param name="fieldName">待搜索的字段名称</param>
        /// <param name="phrases">待搜索的短语列表</param>
        /// <param name="boostLevel">权重级别</param>
        /// <param name="asFilter">是否作为过滤条件</param>
        /// <returns>LuceneSearchBuilder</returns>
        public LuceneSearchBuilder WithPhrases(string fieldName, IEnumerable<string> phrases, BoostLevel? boostLevel = null, bool asFilter = false)
        {
            BooleanQuery query = new BooleanQuery();

            foreach (string phrase in phrases)
            {
                string filteredPhrase = ClauseScrubber.LuceneKeywordsScrub(phrase);
                if (string.IsNullOrEmpty(filteredPhrase))
                    continue;

                if (filteredPhrase.Length == 1)
                {
                    Term term = new Term(fieldName, filteredPhrase);
                    Query q = new PrefixQuery(term);

                    if (boostLevel.HasValue)
                        SetBoost(q, boostLevel.Value);

                    query.Add(q, BooleanClause.Occur.SHOULD);

                    continue;
                }

                string[] nameSegments = ClauseScrubber.SegmentForPhraseQuery(filteredPhrase);

                PhraseQuery phraseQuery = new PhraseQuery();
                foreach (var nameSegment in nameSegments)
                    phraseQuery.Add(new Term(fieldName, nameSegment));

                phraseQuery.SetSlop(PhraseQuerySlop);

                if (boostLevel.HasValue)
                    SetBoost(phraseQuery, boostLevel.Value);

                query.Add(phraseQuery, BooleanClause.Occur.SHOULD);

            }

            if (asFilter)
                filters.Add(new BooleanClause(query, BooleanClause.Occur.MUST));
            else
                clauses.Add(new BooleanClause(query, BooleanClause.Occur.MUST));

            return this;
        }
        /// <summary>
        /// 根据多个关键字添加TermQuery或PrefixQuery搜索条件
        /// </summary>
        /// <param name="fieldName">字段名称</param>
        /// <param name="values">字段值列表</param>
        /// <param name="exactMatch">是否精确搜索</param>
        /// <param name="boostLevel">权重级别</param>
        /// <param name="asFilter">是否作为过滤条件</param>
        public LuceneSearchBuilder WithFields(string fieldName, IEnumerable<string> values, bool exactMatch = true, BoostLevel? boostLevel = null, bool asFilter = false)
        {
            BooleanQuery query = new BooleanQuery();

            foreach (string value in values)
            {
                string filteredValue = ClauseScrubber.LuceneKeywordsScrub(value);
                if (string.IsNullOrEmpty(filteredValue))
                    continue;

                Term term = new Term(fieldName, filteredValue);
                Query q;
                if (exactMatch)
                    q = new TermQuery(term);
                else
                    q = new PrefixQuery(term);

                if (boostLevel.HasValue)
                    SetBoost(q, boostLevel.Value);

                query.Add(q, BooleanClause.Occur.SHOULD);
            }

            if (asFilter)
                filters.Add(new BooleanClause(query, BooleanClause.Occur.MUST));
            else
                clauses.Add(new BooleanClause(query, BooleanClause.Occur.MUST));
            return this;
        }
 /// <summary>
 /// 添加TermQuery或PrefixQuery搜索条件
 /// </summary>
 /// <param name="fieldName">字段名称</param>
 /// <param name="value">字段值</param>
 /// <param name="exactMatch">是否精确搜索</param>
 /// <param name="boostLevel">权重级别</param>
 /// <param name="asFilter">是否作为过滤条件</param>
 /// <returns>LuceneSearchBuilder</returns>
 public LuceneSearchBuilder WithField(string fieldName, int value, bool exactMatch = true, BoostLevel? boostLevel = null, bool asFilter = false)
 {
     return WithField(fieldName, value.ToString(), exactMatch, boostLevel, asFilter);
 }
        /// <summary>
        /// 添加TermQuery或PrefixQuery搜索条件
        /// </summary>
        /// <param name="fieldName">字段名称</param>
        /// <param name="value">字段值</param>
        /// <param name="exactMatch">是否精确搜索</param>
        /// <param name="boostLevel">权重级别</param>
        /// <param name="asFilter">是否作为过滤条件</param>
        /// <returns>LuceneSearchBuilder</returns>
        public LuceneSearchBuilder WithField(string fieldName, string value, bool exactMatch = true, BoostLevel? boostLevel = null, bool asFilter = false)
        {
            string filteredValue = ClauseScrubber.LuceneKeywordsScrub(value);
            if (string.IsNullOrEmpty(filteredValue))
                return this;

            Term term = new Term(fieldName, filteredValue);
            Query query;
            if (exactMatch)
                query = new TermQuery(term);
            else
                query = new PrefixQuery(term);

            if (boostLevel.HasValue)
                SetBoost(query, boostLevel.Value);

            if (asFilter)
                filters.Add(new BooleanClause(query, BooleanClause.Occur.MUST));
            else
                clauses.Add(new BooleanClause(query, BooleanClause.Occur.MUST));

            return this;
        }
Exemple #7
0
 /// <summary>
 ///  设置Query权重
 /// </summary>
 /// <param name="query"></param>
 /// <param name="boostLevel"></param>
 private void SetBoost(Query query, BoostLevel boostLevel)
 {
     query.SetBoost((float)boostLevel);
 }
Exemple #8
0
 // ------------------------------------------------------------------------------------
 // implements ICharacter
 // ------------------------------------------------------------------------------------
 /// <summary>
 /// 加速
 /// </summary>
 /// <param name="level">Level.</param>
 public void Boost(BoostLevel level)
 {
     switch (level) {
     case BoostLevel.NORMAL_BOOST:
         {
             this.Speed = this.m_MaxSpeed = this.m_BoostSpeed;
             break;
         }
     }
 }