/// <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; }
// ------------------------------------------------------------------------------------ // 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; } } }