Пример #1
0
        /// <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);
        }
Пример #2
0
        /// <summary>
        /// 批量添加TermQuery或PrefixQuery搜索条件
        /// </summary>
        /// <param name="fieldNameAndBoosts">字段名称及权重集合</param>
        /// <param name="values">字段值集合</param>
        /// <param name="exactMatch">是否精确搜索</param>
        /// <param name="occur">搜索条件间的关系</param>
        /// <param name="asFilter">是否作为过滤条件</param>
        /// <returns>LuceneSearchBuilder</returns>
        public LuceneSearchBuilder WithFields(Dictionary <string, BoostLevel> fieldNameAndBoosts, IEnumerable <string> values, bool exactMatch, BooleanClause.Occur occur, bool asFilter = false)
        {
            foreach (var fieldNameAndBoost in fieldNameAndBoosts)
            {
                BooleanQuery query = new BooleanQuery();

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

                    Term  term = new Term(fieldNameAndBoost.Key, filteredValue);
                    Query q;
                    if (exactMatch)
                    {
                        q = new TermQuery(term);
                    }
                    else
                    {
                        q = new PrefixQuery(term);
                    }

                    SetBoost(q, fieldNameAndBoost.Value);

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

                if (asFilter)
                {
                    filters.Add(new BooleanClause(query, occur));
                }
                else
                {
                    clauses.Add(new BooleanClause(query, occur));
                }
            }

            return(this);
        }
Пример #3
0
        /// <summary>
        /// 批量添加PhraseQuery
        /// </summary>
        /// <param name="phrase">待搜索的短语</param>
        /// <param name="fieldNameAndBoosts">字段名称及权重集合</param>
        /// <param name="occur">搜索条件间的关系</param>
        /// <param name="asFilter">是否作为过滤器条件</param>
        /// <returns></returns>
        public LuceneSearchBuilder WithPhrases(Dictionary <string, BoostLevel> fieldNameAndBoosts, string phrase, BooleanClause.Occur occur, bool asFilter = false)
        {
            string filteredPhrase = ClauseScrubber.LuceneKeywordsScrub(phrase);

            if (string.IsNullOrEmpty(filteredPhrase))
            {
                return(this);
            }

            string[] nameSegments = ClauseScrubber.SegmentForPhraseQuery(filteredPhrase);
            if (nameSegments.Length == 1)
            {
                return(WithFields(fieldNameAndBoosts, nameSegments[0], false, occur, asFilter));
            }
            else
            {
                BooleanQuery query = new BooleanQuery();
                foreach (var fieldNameAndBoost in fieldNameAndBoosts)
                {
                    PhraseQuery phraseQuery = new PhraseQuery();
                    foreach (var nameSegment in nameSegments)
                    {
                        phraseQuery.Add(new Term(fieldNameAndBoost.Key, nameSegment));
                    }

                    phraseQuery.SetSlop(PhraseQuerySlop);
                    SetBoost(phraseQuery, fieldNameAndBoost.Value);
                    query.Add(phraseQuery, occur);
                }

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

                return(this);
            }
        }
Пример #4
0
        /// <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);
        }
Пример #5
0
        /// <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);
        }
Пример #6
0
        /// <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);
        }