Example #1
0
        //全文检索,多字段 并关系
        //搜索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);
        }