文档检索

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介绍

待整理……

posted @ 2017-02-03 16:54  Sabri.liu  阅读(181)  评论(0)    收藏  举报