elasticsearch_.net_client_nest2.x_到_5.x常用方法属性差异

变更1 字段类型string

  • 2.x中仅有String类型,可设置是否分词、是否索引及分词使用的分词器。
  • 5.x中拆分为Keyword类型与Text类型,Keyword 不分词,可设置是否索引;Text分词,可设置是否索引及分词使用的分词器。

            [String(Name = "Name",Index = FieldIndexOption.NotAnalyzed)]
            public string Name { get; set; }
    
            [String(Name = "Dic", Index = FieldIndexOption.Analyzed,Analyzer = "ik_max_word")]
    
            /// <summary>
            /// keyword 不分词
            /// </summary>
            [Keyword(Name = "Name", Index = true)]
            public string Name { get; set; }
    
            /// <summary>
            /// text 分词,Analyzer = "ik_max_word"
            /// </summary>
            [Text(Name = "Dic", Index = true, Analyzer = "ik_max_word")]
            public string Dic { get; set; }

    注:5.x已将string标记为过时特性,下个版本将移除;

    变更2 滚动扫描获取全量数据

    滚动扫描支持并行执行提高获取数据效率;

    2.x

    public void SearchScanScroll(string indexName)
            {
                string scrollid = "";
                var result = _client.Search<TestModel2>(s => s.Index(indexName).Query(q => q.MatchAll())
                    .Size(10)
                    //todo:2x中的SearchType.Scan,5.x移除
                    .SearchType(SearchType.Scan)
                    .Scroll("1m"));
                scrollid = result.ScrollId;
                int count = 0;
                while (true)
                {
                    //得到滚动扫描的id
                    //执行滚动扫描得到数据 返回数据量是 result.Shards.Successful*size(查询成功的分片数*size)
                    var result1 = _client.Scroll<TestModel2>("1m", scrollid);
                    if(result1.Documents==null || !result1.Documents.Any())
                        break;
                    foreach (var info in result1.Documents)
                    {
                        count++;
                     Console.WriteLine(info.Id+" - "+ count);
                    }
                    //得到新的id
                    scrollid = result1.ScrollId;
                }
            }

    5.x

    Action<int> sc1 = (id) =>
                {
                    string scrollid = "";
                    //todo:5.x 多了Slice设置 移除SearchType.Scan
                    var result = _client.Search<TestModel5>(s => s.Index(indexName).Query(q => q.MatchAll())
                        .Size(15)
                        .Sort(st=>st.Descending(ds=>ds.Id))
                        .Scroll("1m")
                        //id从0开始 0,1,2...
                        //length=max
                        //例:max=3 id=0,id=1,id=2
                        .Slice(sl => sl.Id(id).Max(3))
                        );
    
                    //得到滚动扫描的id
                    scrollid = result.ScrollId;
                    foreach (var info in result.Documents)
                    {
                        Console.WriteLine(info.Id + " - " + " -批次count " + result.Documents.Count + " - 线程"+Thread.CurrentThread.ManagedThreadId);
                    }
                    while (true)
                    {
                        //执行滚动扫描得到数据 返回数据量是 result.Shards.Successful*size(查询成功的分片数*size)
                        var result1 = _client.Scroll<TestModel5>("1m", scrollid);
                        if (result1.Documents == null || !result1.Documents.Any())
                            break;
                        foreach (var info in result1.Documents)
                        {
                            Console.WriteLine(info.Id + " - " +" -批次count "+ result1.Documents.Count+ " - 线程" + Thread.CurrentThread.ManagedThreadId);
                        }
                        //得到新的id
                        scrollid = result1.ScrollId;
                    }
                };
               var t1= Task.Factory.StartNew(() => { sc1(0); });
                var t2= Task.Factory.StartNew(() => { sc1(1); });
                var t3= Task.Factory.StartNew(() => { sc1(2); });
                t1.Wait();
                t2.Wait();
                t3.Wait();

    注:5.x 增加了Slice设置可并行拉取全量数据,移除SearchType.Scan,首次查询Search时也返回结果,2.x中设置SearchType.Scan首次Search只返回ScrollId。

    注:5.x中新增深度分页方案深度分页

    分组结果对象 Nest.KeyedBucket

    • 2.x KeyedBucket
    • 5.x KeyedBucket<object>

    聚合结果解析

    2.x

               var vendorIdGroup = (BucketAggregate)result.Aggregations["Group_Group"];
                foreach (var bucket1 in vendorIdGroup.Items)
                {
                    //todo:2.x KeyedBucket
                    var bucket = (KeyedBucket)bucket1;
                    var maxPrice = ((ValueAggregate)bucket.Aggregations["Dvalue_Max"]).Value;
                }

    5.x

                var vendorIdGroup = (BucketAggregate)result.Aggregations["Group_Group"];
                foreach (var bucket1 in vendorIdGroup.Items)
                {
                    //todo:5.x KeyedBucket<T>
                    var bucket = (KeyedBucket<object>) bucket1;
                    var maxPrice = ((ValueAggregate)bucket.Aggregations["Dvalue_Max"]).Value;
                }

    其它

    一些新的特性或接口会持续补充。

时间: 2024-10-13 02:50:45

elasticsearch_.net_client_nest2.x_到_5.x常用方法属性差异的相关文章

DataTable常用方法属性

平台里面对DataTable的操作是比较多的,网格部件.树形部件.记录部件这3大部件是开发中使用最平凡的几个部件,然而这几个部件是与DataTable直接绑定的,对DataTable的操作就可以对界面上的数据直接操作.DataTable的用法是和C#完全一样的,大家可以查询相关资料,在下面我列出了DataTable在平台中的一些常用方法属性(大家要注意的是对DataTable的操作是需要区分大小写的): ●获取部件DataTable 网格部件.树形部件.记录部件都有一个共同的属性:DataTab

xcode UIView常用方法属性动画

常见属性: @property(nonatomic,readonly) UIView *superview; 获得自己的父控件对象 @property(nonatomic,readonly,copy) NSArray *subviews; 获得自己的所有子控件对象 @property(nonatomic) NSInteger tag; 控件的ID(标识),父控件可以通过tag来找到对应的子控件 @property(nonatomic) CGAffineTransform transform; 控

alt属性和title属性差异---终于分清楚了!

凡是接触过前端的开发者,相信都会接触到<img>标签,自然alt title更是不会陌生,但对他们真正的含义和使用方法,你确定了解吗? 参考: http://www.junchenwu.com/2005/05/alttitle.html 当浏览器卖主扭曲了标准并且自顾自的不按规则去做一些事,他们可能会造成一些问题,或者至少产生了混淆.例子之一就是一些浏览器处理alt属性(一般会被错误的称作alt标签)的方式,比如拥有大量用户的Windows的IE浏览器. 替换文字(alt text)并不是用来

实体类之间属性对比的方法

分享一个实体类之间属性对比的方法 方法用途:对实体类的属性进行修改操作:如果当前修改操作与原先的实体类属性值一样则返回为true,无需进行修改操作:反之则进行修改操作: 参考连接:https://www.cnblogs.com/mollie-x/p/10569286.html import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.lang.reflect.Method; import j

python3.5------day3-数据结构

字典(dict) 字典的定义: 字典的形式是以key:values.{key1,values,key2,values} 特性: 1.可以存放多个值 2.字典是无需的 3.字典的key是唯一,有去重功能 创建一个字典: 方法1 dict_1 = {'name':'zhangsan', 'age':22} 方法2: # 方法2 dict4 = dict(name='zhangsan',age=22) print(dict4) 方法3 # 方法3 dict5 = dict((('name','zhan

TextReader 和StreamReader

目录: 为什么要介绍 TextReader? TextReader的常用属性和方法 TextReader 示例 从StreamReader想到多态 简单介绍下Encoding 编码 StreamReader 的定义及作用 StreamReader 类的常用方法属性 StreamReader示例 本章总结 为什么要介绍 TextReader? 首先让我们来理解下什么是TextReader,从字面上的意思入手的话,大家就会恍然大悟了 一个对于Text的读取器,可是又是怎么读取的呢?聪明的你肯定会想到

ASP.NET MVC IOC 之Ninject攻略

一.为什么要使用Ninject? 很多其它类型的IOC容器过于依赖配置文件,老是配置,总感觉有点不爽,而且要使用assembly-qualified名称(也就是类型的全名)来进行定义,稍不注意就会因为打错字而令整个程序崩掉.Ninject是一个快如闪电.超轻量级的基于.Net平台的IOC容器,主要用来解决程序中模块的耦合问题,它的目的在于做到最少配置.因此如果你不喜欢配置,不喜欢重量级IOC框架,那么就用小苹果Ninject吧! 二.Ninject的使用 首先你必须获取Ninject,其官网下载

C# array与arraylist区别及获取sql字段名

array与arraylist的区别: 1.  Array 的容量是固定的,而 ArrayList 的容量是根据需要自动扩展的.如果更改了 ArrayList.Capacity 属性的值,则自动进行内存重新分配和元素复制. 2.ArrayList 提供添加.插入或移除某一范围元素的方法.在 Array 中,您只能一次获取或设置一个元素的值. 3. arraylist中 属性 Count属性是目前ArrayList包含的元素的数量,这个属性是只读的. Capacity属性是目前ArrayList能

【ASP.NET 基础】ASP.NET内置对象

准确地说,asp.net 并没有内置对象这一说,jsp 里确实把 request.response 这些当作 jsp 的内置对象,这里只不过是借用了一下 jsp 的说法而已.在 Web 中处于中心的是 Web 服务器,用来处理客户端的 HTTP 请求.由于 HTTP 是一种无状态的协议,也就是它并不记得上一次谁请求过它,不会主动去询问客户端,只有当客户端主动请求之后,服务器才会响应. 1.[Request] Request封装了客户端请求信息.Request的常见属性如下:  属性名  值类型