文档检索
NEST Search
NEST提供了支持Lambda链式query DLS(领域特定语言)方式,以下是简单实现及各个query的简述。
一、简单实现
1、定义SearchDescriptor,方便项目中复杂业务的实现
var query = new Nest.SearchDescriptor<Models.Article>(); var result = client.Search<Models.Article>(x => query)
2、检索title和description中包含key,并且来源不等于source的文档
query.Query(q => q.Bool(b => b.Must( m => m.MultiMatch(t => t.Fields(f => f.Field(obj => obj.Title).Field(obj => obj.Description)).Query(condition.Key)) ) .MustNot(m => m.QueryString(t => t.DefaultField("sources").Query(condition.Source)) ) ) );
注意:
如果Elasticsearch使用默认分词,Title和Content的attribute为[Nest.String(Analyzer = "standard")]
如果Elasticsearch使用的是IK分词,Title和Content的attribute为[Nest.String(Analyzer = "ikmaxword")]或者[Nest.String(Analyzer = "ik_smart")]
Author的attribute为[Nest.String(Index = FieldIndexOption.NotAnalyzed)],禁止使用分析器
3、使用Should()对Must的结果进行得分控制
//如果以“_sort”进行排序,在这里可以对得分进行设置 .Should( m => m.QueryString(t => t.DefaultField("title").Query(condition.Key).Boost(10)), m => m.QueryString(t => t.DefaultField("description").Query(condition.Key).Boost(5)) )
4、使用Filter()对检索结果进行过滤
.Filter( m => m.QueryString(t => t.DefaultField("author").Query(condition.Author)), m => m.QueryString(t => t.DefaultField("tags").Query(condition.Tag)), m => m.Range(t => t.Field("hits").GreaterThanOrEquals(condition.MinHits).LessThanOrEquals(condition.MaxHits)), m => m.Range(t => t.Field("tips").GreaterThanOrEquals(condition.MinTips).LessThanOrEquals(condition.MaxTips)), m => m.Term(t => t.Field("isDisplay").Value(condition.IsDisplay)), m => m.DateRange(t => t.Field("dateTime").GreaterThanOrEquals(condition.MinTime).LessThanOrEquals(condition.MaxTime)), m => m.QueryString(t => t.DefaultField("comments.Content").Query(condition.CommentKey)) )
5、排序,按照得分倒叙排列
query.Sort(x => x.Field("_score", Nest.SortOrder.Descending));
6、定义高亮样式及字段
query.Highlight(h => h .PreTags("<b>") .PostTags("</b>") .Fields( f => f.Field(obj => obj.Title), f => f.Field(obj => obj.Description), f => f.Field("_all") ) );
7、拼装查询内容,整理数据,方便前段调用
var list = result.Hits.Select(c => new Models.Article() { Id = c.Source.Id, Title = c.Highlights == null ? c.Source.Title : c.Highlights.Keys.Contains("title") ? string.Join("", c.Highlights["title"].Highlights) : c.Source.Title, //高亮显示的内容,一条记录中出现了几次 Description = c.Highlights == null ? c.Source.Description : c.Highlights.Keys.Contains("description") ? string.Join("", c.Highlights["description"].Highlights) : c.Source.Description, //高亮显示的内容,一条记录中出现了几次 Content=c.Source.Content, Author = c.Source.Author, Sources = c.Source.Sources, Tags = c.Source.Tags, Hits=c.Source.Hits, Tips=c.Source.Tips, IsDisplay = c.Source.IsDisplay, Comments = c.Source.Comments, DateTime = c.Source.DateTime, }).ToPageList((condition.Offset / condition.Limit) + 1, condition.Limit, (int)result.Total);
二、query DSL介绍
待整理……

浙公网安备 33010602011771号