//全文检索,多字段 并关系 //搜索age在100到200之间,并且字段intro 或者name 包含词组key public personList SearchFullFiledss <person>(string indexName, string indexType, string key, int from, int size) { MustQuery <person> mustNameQueryKeys = new MustQuery <person>(); MustQuery <person> mustIntroQueryKeys = new MustQuery <person>(); var arrKeys = GetIKTokenFromStr(key); foreach (var item in arrKeys) { mustNameQueryKeys = mustNameQueryKeys.Term(t3 => t3.Field("name").Value(item)) as MustQuery <person>; mustIntroQueryKeys = mustIntroQueryKeys.Term(t3 => t3.Field("intro").Value(item)) as MustQuery <person>; } string cmd = new SearchCommand(indexName, indexType); string query = new QueryBuilder <person>() //1 查询 .Query(b => b.Bool(m => m.Must(t => t.Range(r => r.Field("age").From("1").To("500")) .Bool(ms => ms.Should(ts => ts.Bool(m1 => m1.Must( t2 => //t2.Term(t3=>t3.Field("name").Value("研究")) // .Term(t3=>t3.Field("name").Value("方鸿渐")) // mustNameQueryKeys ) ) ) .Should(ts => ts.Bool(m1 => m1.Must(t2 => //t2.Term(t3 => t3.Field("intro").Value("研究")) //.Term(t3 => t3.Field("intro").Value("方鸿渐")) // mustIntroQueryKeys ) ) ) ) ) ) ) //分页 .From(from) .Size(size) //排序 // .Sort(c => c.Field("age", SortDirection.desc)) //添加高亮 .Highlight(h => h .PreTags("<b>") .PostTags("</b>") .Fields( f => f.FieldName("intro").Order(HighlightOrder.score), f => f.FieldName("name").Order(HighlightOrder.score) ) ) .Build(); string result = Client.Post(cmd, query); var serializer = new JsonNetSerializer(); var list = serializer.ToSearchResult <person>(result); personList datalist = new personList(); datalist.hits = list.hits.total; datalist.took = list.took; var ldist = list.hits.hits; //ldist.Select(j => new personresponse //{ //}); //var personList = list.hits.hits.Select(c =>new personresponse() //{ // id = c._source., // age = c._source.age, // birthday = c._source.birthday, // intro = c.highlight == null || !c.highlight.Keys.Contains("intro") ? c._source.intro : string.Join("", c.highlight["intro"]), //高亮显示的内容,一条记录中出现了几次 // name = c.highlight == null || !c.highlight.Keys.Contains("name") ? c._source.name : string.Join("", c.highlight["name"]), // sex = c._source.sex //}); //datalist.list.AddRange(personList); return(datalist); }
//public QueryContainer BuildQueryContainer(SearchCondition condition) //{ // var queryCombin = new List<Func<QueryContainerDescriptor<BuildingBaseInfo>, QueryContainer>>(); // if (!string.IsNullOrEmpty(condition.Name)) // queryCombin.Add(mt => mt.Match(m => m.Field(t => t.Name).Query(condition.Name))); //字符串匹配 // if (condition.Age.HasValue) // queryCombin.Add(mt => mt.Range(m => m.Field(t => t.Address).GreaterThanOrEquals(condition.Age))); //数值区间匹配 // if (!string.IsNullOrEmpty(condition.Address)) // queryCombin.Add(mt => mt.MatchPhrase(m => m.Field(t => t.Address).Query(condition.Address))); //短语匹配 // if (!condition.Gender.HasValue) // queryCombin.Add(mt => mt.Term(m => m.Field(t => t.Gender).Value(condition.Gender)));//精确匹配 // return PlainElastic.Net.Queries.Query<BuildingBaseInfo>.Bool(b => b // .Must(queryCombin) // .Filter(f => f // .DateRange(dr => dr.Field(t => t.CreateTime) //时间范围匹配 // .GreaterThanOrEquals(DateMath.Anchored(condition.BeginCreateTime.ToString("yyyy-MM-ddTHH:mm:ss"))) // .LessThanOrEquals(DateMath.Anchored(condition.EndCreateTime.ToString("yyyy-MM-ddTHH:mm:ss")))))); //} /// <summary> /// 匹配多个字段,且的关系 /// </summary> /// <param name="key">关键字</param> /// <param name="from"></param> /// <param name="size"></param> /// <returns></returns> public personList OrSearch(string key, int from, int size) { var mustNameQueryKeys = new MustQuery <BuildingBaseInfo>(); var mustIntroQueryKeys = new MustQuery <BuildingBaseInfo>(); var arrKeys = GetIKTokenFromStr(key); foreach (var item in arrKeys) { mustNameQueryKeys = mustNameQueryKeys.Term(t3 => t3.Field("name").Value(item)) as MustQuery <BuildingBaseInfo>; mustIntroQueryKeys = mustIntroQueryKeys.Term(t3 => t3.Field("address").Value(item)) as MustQuery <BuildingBaseInfo>; } string cmd = new SearchCommand(_index, _type); string query = new QueryBuilder <BuildingBaseInfo>() .Query(b => b.Bool(m => //或者 m.Should(t => t.Bool(m1 => m1.Must( t2 => //t2.Term(t3=>t3.Field("name").Value("研究")) // .Term(t3=>t3.Field("name").Value("方鸿渐")) mustNameQueryKeys ) ) ) .Should(t => t.Bool(m1 => m1.Must(t2 => //t2.Term(t3 => t3.Field("intro").Value("研究")) //.Term(t3 => t3.Field("intro").Value("方鸿渐")) mustIntroQueryKeys ) ) ) ) ) //分页 .From(from) .Size(size) //排序 .Sort(c => c.Field("updatetime", SortDirection.desc)) //添加高亮 .Highlight(h => h .PreTags("<i>") .PostTags("</i>") .Fields( f => f.FieldName("name").Order(HighlightOrder.score), f => f.FieldName("address").Order(HighlightOrder.score), f => f.FieldName("_all") ) ) .Build(); string result = _client.Post(cmd, query); var serializer = new JsonNetSerializer(); var list = serializer.ToSearchResult <BuildingBaseInfo>(result); personList datalist = new personList(); datalist.hits = list.hits.total; datalist.took = list.took; var personList = list.hits.hits.Select(c => new BuildingBaseInfo { Id = c._source.Id, Address = string.Join("", c.highlight["address"]), BuiltupArea = c._source.BuiltupArea, MaxPrice = c._source.MaxPrice, Area = c._source.Area, CreateTime = c._source.CreateTime, City = c._source.City, District = c._source.District, Icon = c._source.Icon, IsDeleted = c._source.IsDeleted, MinPrice = c._source.MinPrice, Name = string.Join("", c.highlight["name"]),//高亮显示的内容,一条记录中出现了几次 Summary = c._source.Summary, UpdateTime = c._source.UpdateTime }).ToList(); datalist.list.AddRange(personList); return(datalist); }