//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); }
/// <summary> /// 匹配一个字段,并的关系 /// </summary> /// <param name="key">关键字</param> /// <param name="from"></param> /// <param name="size"></param> /// <returns></returns> public personList AndSearch(string key, int from, int size) { string cmd = new SearchCommand(_index, _type); string query = new QueryBuilder <BuildingBaseInfo>() .Query(b => b.Bool(m => //并且关系 m.Must(t => //分词的最小单位或关系查询 t.QueryString(t1 => t1.DefaultField("name").Query(key)) //.QueryString(t1=>t1.DefaultField("isDeleted").Query("0")) //.QueryString(t1 => t1.DefaultField("name").Query(key)) // t .Terms(t2=>t2.Field("intro").Values("研究","方鸿渐")) //范围查询 // .Range(r => r.Field("age").From("100").To("200") ) ) ) ) //分页 .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("_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 = c._source.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); }