• .net Nest 操作elasticsearch


    记录一点 Nest 的新的

        [ElasticsearchType(RelationName = "employee")]
        public class Employee
        {
            [Text(Name = "first_name", Norms = false)]
            public string FirstName { get; set; }
    
            [Text(Name = "last_name")]
            public string LastName { get; set; }
    
            [Number(DocValues = false, IgnoreMalformed = true, Coerce = true)]
            public int Salary { get; set; }
    
            [Date(Format = "MMddyyyy")]
            public DateTime Birthday { get; set; }
    
            [Boolean(NullValue = false, Store = true)]
            public bool IsManager { get; set; }
            [Text(Name = "office_hours")]
            public TimeSpan? OfficeHours { get; set; }
    
        }
        public class ElasticSearchHelper
        {
            static ElasticClient client;
            private ElasticSearchHelper()
            {
                var builder = new ConfigurationBuilder()
               .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
               .AddEnvironmentVariables();
                IConfiguration configuration = builder.Build();
                var ip = configuration["ESearchOption:DbToEsCon"];
    
                var node = new Uri(ip);
                //nest默认字段名首字母小写,如果要设置为与Model中一致,在创建client时按如下设置。(强烈建议使用该设置,避免造成字段不一致)
                var settings = new ConnectionSettings(node).DefaultFieldNameInferrer((name) => name);
                client = new ElasticClient(settings);
            }
            public static ElasticSearchHelper Instance { get; } = new ElasticSearchHelper();
            public static ElasticClient GetClient()
            {
                return client;
            }
            public void Index<TDocument>(TDocument document, Func<IndexDescriptor<TDocument>, IIndexRequest<TDocument>> selector) where TDocument : class
            {
                client.Index(document, selector);
    
            }
            public void IndexMany<T>(IEnumerable<T> objects, IndexName index = null) where T : class
            {
                client.IndexMany(objects, index);
            }
        }
        public class Program
        {
            public static void Main(string[] args)
            {
    
                var client = ElasticSearchHelper.GetClient();
    
                var r = client.Indices.Exists("test7");
                //删除索引
                client.Indices.Delete("test7");
                //client.Indices.Delete("test2");
                //client.Indices.Create("test3");
                //需要有默认index
                // client.IndexDocument(per);
                //基本配置
                IIndexState indexState = new IndexState()
                {
                    Settings = new IndexSettings()
                    {
                        NumberOfReplicas = 0,//副本数
                        NumberOfShards = 3//分片数
                    }
                };
                //创建索引
                var restl = client.Indices.Create("test7", x => x.InitializeUsing(indexState).Map<Employee>(m => m.AutoMap()));
    
                var t = "";
                //创建并Mapping
                // client.CreateIndex("test-index3", p => p.InitializeUsing(indexState).Mappings(m => m.Map<VendorPriceInfo>(mp => mp.AutoMap())));
    
                //查询
                //var data = client.Search<A>(s => s.Index("testy").Size(500).Query(q => q.Term(t => t.authorid, "3")));
                //var result = client.Search<A>(s => s.Index("testy").Size(500).Query(q => q.Term(t => t.authorid, "3") && q.Range(r => r
                //                                     .Field(f => f.procount)
                //                                     .GreaterThanOrEquals(1)
                //                                     .LessThanOrEquals(5)
                //                              )));
    
                ////多条件查询
                //var mustQuerys = new List<Func<QueryContainerDescriptor<AuthorEs>, QueryContainer>>();
                //// 模糊查询
                //mustQuerys.Add(q => q.MatchPhrase(t => t.Field(x => x.nickname).Query("qq")));
                //mustQuerys.Add(q => q.Term(t => t.morestarid, 1));
                //mustQuerys.Add(mt => mt.Term(tm => tm.Field(fd => fd.moreageid).Value(1)));
                //mustQuerys.Add(q => q.Range(t => t.Field(f => f.birthday).GreaterThanOrEquals(1).LessThanOrEquals(2)));
                ////排序
                //Func<SortDescriptor<AuthorEs>, IPromise<IList<ISort>>> sortDesc = sd =>
                //{
                //    //根据分值排序
                //    // sd.Descending(SortSpecialField.Score);
                //    sd.Descending(d => d.totalfans);
                //    return sd;
                //};
                ////TrackTotalHits 符合条件的返回总数  es 的分页从0开始(不确定)
                //var docmsg = client.Search<AuthorEs>(b => b.Index("author").TrackTotalHits().Query(q => q.Bool(b => b.Must(mustQuerys))).Sort(sortDesc).From(0).Size(10));
                ////总数 
                //int count = (int)docmsg.Total;
    
                //List<A> la = new List<A>();
                //la.Add(new A { procount = 888, moreageid = 888, id = "3" });
                //la.Add(new A { procount = 222, moreageid = 222, id = "6" });
                ////批量添加存在会更新,不存在会添加是全部字段
                //client.IndexMany(la, "testy");
                ////单个更新某个字段 docasUpset=true 表示不存在也添加 false=不存在不添加
                //client.Update<object>(6, u => u.Index("testy").Doc(new { gender = 121 }).DocAsUpsert(true));
                //// client.Update<object>(6, u => u.Index("testy").Doc(new { gender = 121 }).DocAsUpsert(false));
                ////批量更新多个字段(将)
                //client.Bulk(b => b.Update<object>(u => u.Index("testy").Id("3").Doc(new { procount = 999, morageid = 444 })).Update<object>(u => u.Index("testy").Id("5").Doc(new { procount = 565, moreageid = 22 })));
                ////批量更新list类型
                //client.Bulk(b => b.UpdateMany(la, (b, u) => b.Id(u.id).Index("testy").Doc(new A { procount = u.procount, moreageid = u.moreageid })));
    

      

    
    
            }
        }

     累加多个值

       //累加
                //var updateResponse = client.Update<object>(111111111111, u => u
                //     .Index("authorincr202105")
                //     .Script(s => s
                //         .Source("ctx._source.total_fans += params.count")
                //         .Lang("painless")
                //         .Params(p => p
                //             .Add("count", 4)
                //         )
                //     )
                // );
    
                //累加
                //var updateResponse = client.Bulk(b => b
                //.Update<object>(u => u
                //     .Index("authorincr202105")
                //     .Id("111111111111")
                //     .Script(s => s
                //         .Source("ctx._source.total_fans += params.count")
                //         .Lang("painless")
                //         .Params(p => p
                //             .Add("count", 4)
                //         )
                //     )
                // )
                //.Update<object>(u => u
                //     .Index("authorincr202105")
                //     .Id("222222222")
                //     .Script(s => s
                //         .Source("ctx._source.total_fans += params.count")
                //         .Lang("painless")
                //         .Params(p => p
                //             .Add("count", 45)
                //         )
                //     )
                // )
                //);
    
                List<UpAuthorIncrEs> list = new List<UpAuthorIncrEs>
                {
                    new UpAuthorIncrEs() { secid = 111111111111, total_fans = 1000,total_fans_incr=-100},
                    new UpAuthorIncrEs() { secid = 222222222, total_fans = 2000,total_fans_incr=-200,},
                    new UpAuthorIncrEs() { secid = 33333333333, total_fans = 3000,total_fans_incr=-300}
                };
                var l = client.Bulk(b => b.UpdateMany(list, (b, u) => b.Id(u.secid.ToString()).Index("authorincr202105").Script(s => s
                                    .Source("ctx._source.total_fans += params.total_fans;ctx._source.total_fans_incr = params.total_fans_incr")
                                    .Lang("painless")
                                    .Params(p => p
                                        .Add("total_fans", u.total_fans_incr)
                                        .Add("total_fans_incr", u.total_fans_incr)
                                    )
                          )));

    Nested 嵌套增加属性

    /aweme/_mapping
    {
      "properties": {
        "pro_ids": {
          "type": "nested",
          "properties": {
            "proid": {
              "type": "keyword"
            }
          }
        },
        "topics": {
          "type": "nested",
          "properties": {
            "huati": {
              "type": "keyword"
            }
          }
        }
      }
    }
    //设置默认值
    /aweme/_update_by_query

    {"script": {

    "lang": "painless",
    "source": "if (ctx._source.total_pro_share== null) {ctx._source.total_pro_share= 0}"
    }
    }

     

    nested 查询

       var d = client.Search<AwemeEs>(b => b.Index("aweme2021").TrackTotalHits().Query(q => q.Nested(x => x.Path(x => x.pro_ids).Query(q => q.Terms(t => t.Field(f => f.pro_ids.FirstOrDefault().proid).Terms(new[] { "3484548520843809524", "645601590780", "3476963307917829978" }))))).From(0).Size(200));

    nested 全部 修改

    var l = client.Bulk(b => b.UpdateMany(d1, (b, u) => b.Id(u.awemeid).Index($"aweme2021").Script(s => s
                //                        .Source(
                //                                "ctx._source.pro_ids=params.proids;" +
                //                               "ctx._source.is_pro=params.count"
                //                                )
                //                                .Lang("painless")
                //                                .Params(p => p
                //                                    .Add("proids", u.proids)
                //                                    .Add("count", u.proids.Count)
                //                                )
                //                     )
                //                 ));

     聚合查询

    一般进行聚合查询的时候,并不需要 _source 的东西,所以你在进行聚合查询是,可以在查询语句上指定 size=0,这样就只会返回 聚合 的结果,方式如下

    var searchResponse = _client.Search<Project>(s => s
        .Size(0)  //显式指定为 0
        .Aggregations(aggs => aggs
            .Average("average_quantity", avg => avg.Field(p => p.Quantity))
            .Max("max_quantity", avg => avg.Field(p => p.Quantity))
            .Min("min_quantity", avg => avg.Field(p => p.Quantity))
        )
    );

     分组聚合

     //var d = client.Search<AwemeIncrEs>(b => b.Index("awemeincr202107").TrackTotalHits().Query(x => x.Term(t => t.authorid, "104632838314")).Size(0).Aggregations(ag => ag.Sum("sum", sm => sm.Field(f => f.total_comment_incr))));
                //var lll = d.Aggregations.Average("sum").Value;
    
                var d2 = client.Search<AwemeIncrEs>(b => b.Index("awemeincr202107").TrackTotalHits().Query(x => x.Terms(t => t.Field(f => f.authorid).Terms(new[] { "104632838314", "104255897823" }))).Size(0).Aggregations(ag => ag.Terms("group", t => t.Field(fd => fd.authorid).Aggregations(agg => agg.Sum("total_comment_incr", sm => sm.Field(fd => fd.total_comment_incr)).Sum("total_share_incr", sm => sm.Field(fd => fd.total_share_incr))))));
                var mm = d2.Aggregations.Terms("group");
                foreach (var bucket in mm.Buckets)
                {
                    var hitcid = bucket.AverageBucket("total_comment_incr").Value;//获取分组子集结果集
                                                                      //关键词高亮显示
                }
  • 相关阅读:
    原生JS发送Ajax请求、JSONP
    python Flask中html模版中如何引用css,js等资源
    python 单例与数据库连接池 及相关选择
    费曼致学生真野光一
    Winform判断EventHandler是否已经添加
    The list of pre-build cross-compiler
    Extended VM Disk In VirtualBox or VMware (虚拟机磁盘扩容)
    一张图了解SSH端口转发
    显卡驱动卸载清理工具
    Oracle分析函数
  • 原文地址:https://www.cnblogs.com/elsons/p/14528508.html
Copyright © 2020-2023  润新知